반응형
코인 차트 데이터 MySQL에 저장하기
MySQL 데이터베이스 생성
차트의 데이터분석을 할 때 계속 API로 차트 정보를 얻기에는 너무 빈번하게 요청을 하게 됩니다. 그러므로 과거 데이터는 미리 한 번에 개인 컴퓨터에 내려받고 로컬로 불러오는 것이 거래소 서버에게도 클라이언트에게도 좋은 방법입니다. 이번 포스팅에서는 과거데이터를 MySQL에 저장하는 작업을 하는 것이 목적입니다.
먼저 MySQL Workbench에서 local서버에 접속하여 create a new schema 아이콘을 클릭합니다.
schema는 데이터베이스라고 생각하시면 됩니다.
데이터베이스 이름을 적어주시고 적용합니다.
특별한 사항이 없으면 모두 디폴트값으로 설정해 줍니다.
완료를 누르시면 새로운 schema가 생성됩니다.
바이낸스 API로 차트 데이터프레임을 얻으면 이 새로 만든 데이터베이스의 테이블들에 저장을 할 것입니다.
파이썬 코드
import pandas as pd
import requests
import time
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:비밀번호@127.0.0.1:3306/test_blog')
# 해당양식으로 로컬서버의 정보를 입력해 줍니다.
tickers = ['BTCUSDT', 'ETHUSDT', 'BCHUSDT']
def get_klines(symbol, interval, start_time=None, end_time=None):
url = "https://api.binance.com/api/v3/klines"
headers = {"User-Agent":
"본인의 유저 에이전트"}
#headers는 입력안하셔도 상관없습니다.
params = {
"symbol": symbol,
"interval": interval,
"startTime": start_time,
"endTime": end_time,
"limit": 1000
}
res = requests.get(url, headers=headers , params=params)
value = res.json()
df = pd.DataFrame(value).astype(float)
df.columns = ['open_time', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'volumeUSDT', '8', '9', '10', '11']
df = df.drop(['close_time', '8', '9', '10', '11'], axis=1)
#필요없다고 생각되는 열은 드롭하였습니다.
return df
def run(symbol, interval, start_time, end_time):
symbol = symbol
interval = interval
start_time = start_time
end_time = end_time
df = get_klines(symbol, interval, start_time, end_time)
for i in range(1200):
start_time = int(df['open_time'].iloc[-1])
new_df = get_klines(symbol, interval, start_time, end_time).iloc[1:]
df = pd.concat([df, new_df], ignore_index=True)
if new_df.empty:
break
time.sleep(0.2)
#캔들의 갯수가 1000개 이상일 때 start_time을 을 마지막행의 timestamp값을 주어 덧붙이도록 하였습니다.
return df
start_time = 1500990600000
#2017년 8월 17일 오전9시(Kor)
end_time = 1689174000000
#23년 7월 13일 오전9시(Kor)
def save(interval,start_time, end_time):
for symbol in tickers:
df = run(symbol, interval, start_time, end_time)
df.to_sql(name=str(symbol) + "_" + str(interval), con=engine, index=False, if_exists='replace')
#name은 테이블의 이름으로 저의경우엔 `심벌_1d`형식으로 지어주었습니다.
engine.dispose()
save("1d", start_time, end_time)
결과
BTC, ETH, BCH의 차트데이터들이 MySQL 로컬서버에 저장된 모습을 확인할 수 있습니다.
다들 성투하시길 바랍니다.
반응형
'기술 > 기타' 카테고리의 다른 글
MySQL에서 파이썬 데이터프레임으로 불러오기 (786) | 2023.07.21 |
---|---|
유용한 사이트 추천 : Coinalyze (선물 데이터) (398) | 2023.07.11 |
바이낸스에서 김치코인 걸러내기 (424) | 2023.07.10 |
댓글