본문 바로가기

바이낸스 가입방법
  • 코인 잡기술 블로그
기술/기타

코인 차트 데이터 MySQL에 저장하기

by 금붕맨 2023. 7. 13.
반응형

 

코인 mysql

 

코인 차트 데이터 MySQL에 저장하기

 

MySQL 데이터베이스 생성

차트의 데이터분석을 할 때 계속 API로 차트 정보를 얻기에는 너무 빈번하게 요청을 하게 됩니다. 그러므로 과거 데이터는 미리 한 번에 개인 컴퓨터에 내려받고 로컬로 불러오는 것이 거래소 서버에게도 클라이언트에게도 좋은 방법입니다. 이번 포스팅에서는 과거데이터를 MySQL에 저장하는 작업을 하는 것이 목적입니다.

 

먼저 MySQL Workbench에서 local서버에 접속하여 create a new schema 아이콘을 클릭합니다.

코인 데이터베이스

schema는 데이터베이스라고 생각하시면 됩니다.

 

 

코인 데이터베이스

데이터베이스 이름을 적어주시고 적용합니다.

 

 

코인 mysql

특별한 사항이 없으면 모두 디폴트값으로 설정해 줍니다.

 

 

코인 저장

완료를 누르시면 새로운 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 로컬서버에 저장된 모습을 확인할 수 있습니다.

 

다들 성투하시길 바랍니다.

반응형

댓글