파이썬과 SQLite를 이용한 코인가격 데이터베이스 구축
지금까지 파이썬 데이터베이스를 사용하기 위한 기초를 다졌습니다. 이번 포스팅에서는 파이썬과 SQLite를 사용하여 Binance 거래소로부터 코인가격 데이터를 수집하고 데이터베이스에 저장해 보겠습니다. 이로부터 새로운 가치를 만들어낼 방법을 고민해 보시기 바랍니다.
글의 순서
파이썬 데이터베이스 패키지 sqlite3를 선택한 이유
1단계 : 환경설정
2단계 : 데이터베이스 파일 경로 설정
3단계 : 데이터베이스 및 테이블 생성
4단계 : Binance로부터 코인가격 데이터 수집
5단계 : 데이터베이스에 데이터 저장
파이썬 데이터베이스 패키지 sqlite3를 선택한 이유
가장 간단하게 파이썬 데이터베이스를 구축해 볼 수 있는 SQLite 패키지를 사용하여 코인가격에 대한 Database를 구축해 보겠습니다. 지난 포스팅에서 알아본 바와 같이 파일 기반의 데이터베이스인 SQLite는 설치가 필요 없고, 하나의 파일로 모든 데이터를 관리할 수 있습니다. 간단하다는 게 SQLite의 가장 큰 장점입니다.
5단계로 구분하여 코인가격에 대한 데이터베이스를 구축해 보겠습니다. 코인가격 데이터를 파이썬 바이낸스 API를 사용하여 가져온 후 파이썬 데이터베이스 패키지 sqlite3를 이용하여 파일 형태로 만들 예정입니다. 1단계부터 시작해보겠습니다.
1단계 : 환경설정
먼저 파이썬 바이낸스 API 키와 시크릿 키를 환경 변수로 설정합니다. 이는 파이썬 바이낸스 API를 호출할 때, 인증을 위해 필요합니다. 또한, os, pandas, sqlite 등 필요한 라이브러리를 불러옵니다.
1 2 3 4 5 6 7 8 9 10 |
import os import pandas as pd import sqlite3 from binance.client import Client from datetime import datetime, timezone, timedelta # Binance API 설정 api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) |
2단계 : 데이터베이스 파일 경로 설정
데이터를 저장할 데이터베이스 파일의 경로와 파일 이름을 설정합니다. 또한 코인 종류, 데이터 수집 시간 간격, 데이터 수집 기간을 설정합니다. 이 예제에서는 ‘XRPUSDT’ 코인의 1분 데이터를 수집합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 코인 종류, 데이터 수집 시간 간격, 데이터 수집 기간 설정 symbol = 'XRPUSDT' interval = '1m' start_str = '2024-07-23 00:00:00' # 구체적인 날짜와 시간 설정 (UTC) file_path = 'C:/_python/' # DB 파일명 작성 : 날짜와 시간 부분 추출 및 형식 변환 # 01-1) 시작 시간을 datetime 객체로 변환 (UTC) time_start_utc = datetime.strptime(start_str, '%Y-%m-%d %H:%M:%S') # 01-2) 현재 시간 (UTC) --> KST time_current_utc = datetime.now(timezone.utc) time_start_kst = time_start_utc + timedelta(hours=9) time_current_kst = time_current_utc + timedelta(hours=9) # 01-3) 시간 형식을 'YYMMDD_HHMM'로 변환 time_start_kst_str = time_start_kst.strftime('%y%m%d_%H%M') time_current_kst_str = time_current_kst.strftime('%y%m%d_%H%M') # 01-4) 파일 경로 및 파일 이름 설정 file_name_only = f'{symbol}_{interval}_{time_start_kst_str}~{time_current_kst_str}_data.db' file_name = file_path + file_name_only print(file_name_only) # 파일 이름 확인용 출력 |
3단계 : 데이터베이스 및 테이블 생성
SQLite 데이터베이스에 연결하고, 데이터를 저장할 테이블을 생성합니다. 테이블 구조는 OHLCV(시가, 고가, 저가, 종가, 거래량) 데이터를 저장할 수 있도록 설정합니다. 멀티라인 문자열(”’ ”’)을 사용하여 SQL 쿼리를 작성하고 execute 메서드를 통해 실행합니다. 이렇게 하면 SQL 쿼리를 여러 줄에 걸쳐 작성할 수 있어 가독성을 높일 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 02) 데이터베이스 연결 conn = sqlite3.connect(file_name) cursor = conn.cursor() # 02-1) 테이블 생성 cursor.execute(''' CREATE TABLE IF NOT EXISTS ohlcv ( time_open INTEGER PRIMARY KEY, open REAL, high REAL, low REAL, close REAL, volume REAL, time_close INTEGER ) ''') conn.commit() |
4단계 : Binance로부터 코인가격 데이터 수집
Binance API를 사용하여 지정한 코인의 데이터를 수집합니다. 데이터 수집 후 판다스 데이터프레임(Pandas DataFrame)으로 변환합니다. 아래는 데이터를 수집하는 함수부분입니다.
1 2 3 4 5 6 7 8 |
def fetch_binance_data(symbol, interval, start_str): print(f"Fetching data for {symbol} from {start_str} with interval {interval}...") klines = client.get_historical_klines(symbol, interval, start_str) df = pd.DataFrame(klines, columns=['time_open', 'Open', 'High', 'Low', 'Close', 'Volume', 'time_close', 'quote_asset_volume', 'number_of_trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore']) df = df[['time_open', 'Open', 'High', 'Low', 'Close', 'Volume', 'time_close']] df = df.astype({'time_open': 'int64', 'Open': 'float', 'High': 'float', 'Low': 'float', 'Close': 'float', 'Volume': 'float', 'time_close': 'int64'}) print(f"Data fetching completed for {symbol}.") return df |
5 단계 : 데이터베이스에 데이터 저장
수집된 데이터를 SQLite 데이터베이스에 저장합니다. 데이터를 기존 테이블에 덮어쓸 수 있으며, 새로 추가할 수도 있습니다. 아래에 데이터를 저장하는 함수인 def save_to_db()를 나타내었습니다. 데이터 수집함수와 데이터 저장 함수를 부르는 구문이 그 뒤를 따르고 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def save_to_db(df, db_name, table_name): conn = sqlite3.connect(db_name) df.to_sql(table_name, conn, if_exists='replace', index=False) conn.close() # 데이터 수집 및 저장 print("Starting data fetch and save process...") df = fetch_binance_data(symbol, interval, start_str) print(df.tail(5)) print('\n', f"Saving data to {file_name_only} database...") db_name = file_name table_name = f'{symbol}_{interval}' save_to_db(df, db_name, table_name) print("Data saved and database connection closed.") |
마치며 …
지금까지 다져온 파이썬 데이터베이스에 대한 기초 지식을 바탕으로 이번 포스팅에서는 실제 Database를 구축해보았습니다. 가장 간단한 데이터베이스인 SQLite를 활용했고, 파이썬 바이낸스 API를 이용하여 받아온 코인가격을 데이터베이스 파일로 저장해보았습니다. 데이터베이스가 만들어진 것입니다.
파일 기반의 Database인 SQLite는 설치가 필요 없고, 하나의 파일로 모든 데이터를 관리할 수 있어 간단합니다. 간단하긴 하지만, 새로운 가치를 생성해 낸다는 데이터베이스 본연의 목적을 경험하기에는 부족함이 없을 것입니다. 다음 포스팅에서는 이 파이썬 데이터베이스에 접근하여 원하는 데이터를 가져오는 방법에 대해 알아보겠습니다.
함께 참고하면 좋은 글
▶ 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
▶ 호크아이 거래량 지표 (HawkEye Volume Indicator) 파이썬 코딩
▶ 알아두면 좋을 컴퓨터 작동원리. 폰 노이만 아키텍처
▶ 판다스 데이터프레임으로 빠르게 데이터 파악하기
▶ 파이썬 데이터 분석 : 판다스 데이터프레임 통계량, 그래프
▶ 파이썬 판다스로 텍스트 파일 읽기 : read_table()
▶ 파이썬 판다스 데이터 분석 : pivot, 엑셀 입력, 출력
▶ 파이썬 판다스로 엑셀 파일의 원하는 부분 골라 읽기
참고자료
▶ sqlite3 – DB-API 2.0 interface for SQLite databases
▶ Wikipedia, Database