바이낸스

바이낸스 API로 차트 데이터 가져오기

금붕맨 2023. 7. 11. 08:15
반응형

 

바이낸스 API

 

바이낸스 API로 차트 데이터 가져오기

 

바이낸스 API

웹스크래핑을 하여 필요한 데이터를 얻을 때 Beautifulsoup 같은 라이브러리를 사용한다면 웹의 HTML정보를 불러와야 합니다. 그중에서 필요한 데이터를 추출하는 것인데, 이것을 반복적으로 하게 되면 쓸데없는 HTML까지 계속 호출하게 되는 것이므로 웹은 부하가 많이 걸리고 데이터를 얻는 속도도 오래 걸립니다.

 

그런 불필요한 손실을 줄이기 위해서 웹에서는 저희가 필요할만한 데이터를 API로 제공하는 것입니다. 물론 데이터 말고도 다른 기능들을 프로그래밍 언어로 제어할 수 있도록 해주는 것이 API(Application Programming Interface)입니다.

 

이용하는 방법은 바이낸스 API docs에 가시면 데이터를 요청하는 양식과 그 요청 결과인 Response를 확인하실 수 있습니다.

 

Binance API Documentation

 

binance-docs.github.io

 

 

Parameters

앞서 API docs 링크로 들어가셔서 왼쪽 목차에 Market Data Endpoints - Kline/Candlestick Data를 클릭하시면 해당 설명을 보실 수 있습니다.

바이낸스 API

API를 이용할 때 크게 4가지 방식이 있는데 데이터를 요청하는 일은 보통 GET으로 요청하게 됩니다. 파이썬에서는 requests라이브러리의 get() 함수를 사용해 주시면 됩니다.

 

get함수를 이용할 때 필요한 것이 해당 요청 url인데 api/v3/klines이라고 적혀 있습니다. 이것을 url형식인 "https://api.binance.com/api/v3/klines"처럼 적어주시면 됩니다.

 

API 이용 포인트는 API요청 url마다 가중치가 붙어있는데 여기서는 1로 이러한 포인트가 1분에 1200이 넘어가면  API제한을 받게 된다고 명시되어 있으니 너무 빈번하게 요청하면 안 됩니다. 자세한 것은 해당 링크 참고하시길 바랍니다.

 

바이낸스 API 이용 시 주의 사항 (IP차단)

바이낸스 API 제한 IP 제한 웹소켓 링크 IP 제한 요청 제한은 IP 기반으로 이루어지며, 각 endpoint(요청 시 사용하는 URL)마다 weight(가중치)가 있습니다. 가중치가 높은 엔드포인트와 여러 심벌에 대한

goldfishman.tistory.com

 

Parameters(파라미터)는 데이터를 요청할 때 일종의 변수 같은 것으로 심벌, 캔들의 간격(ex:1시간 봉, 15분 봉)은 필수로 넣어주어야 하고, startTime, endTime 및 limit는 선택적으로 넣어줄 수 있습니다. 시작시간과 마감시간을 입력하지 않으면 가장 최근의 캔들 데이터를 받게 되고, 캔들 개수를 입력하지 않으면 기본적으로 500개의 캔들 데이터를 받게 됩니다.

 

Symbol은 "BCHUSDT"같이 str(문자열)로 입력하면 됩니다. 테더 말고 BTC장의 정보는 "BCHBTC"처럼 응용해서 적어주시면 됩니다. 

 

interval은 캔들의 간격으로 ENUM이라는 데이터형식으로 입력해야 합니다. ENUM은 특정 문자열만 입력가능하게 하는 데이터타입으로 1s, 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M 만을 입력할 수 있습니다.

 

startTime과 endTime은 원하는 시간의 timestamp를 입력해 주시면 됩니다. 주의할 것은 ms가 기준이므로 1초 기준인 timestamp에서 1000을 곱해준 값을 넣어주어야 합니다.

 

limit는 요청할 캔들 개수로 1~1000 사이의 정수를 입력하면 됩니다.

 

 

Response

바이낸스 response

API를 통해 Kline의 데이터를 요청하면 위의 그림처럼 12가지 종류의 정보를 응답받으실 수 있습니다. 

 

 

파이썬 코드

import requests
import pandas as pd

def get_klines(symbol, interval, start_time=None, end_time=None, limit=None):
    url = "https://api.binance.com/api/v3/klines"
    params = {
        "symbol": symbol,
        "interval": interval,
        "startTime": start_time,
        "endTime": end_time,
        "limit": limit
    }
    res = requests.get(url, params=params)
    value = res.json()
    df = pd.DataFrame(value)
    return df

timestamp = 1685577600000
#23년 6월 1일 오전 9시의 타임스탬프

print(get_klines("BTCUSDT", "1h", start_time=timestamp))

이런 식으로 함수를 정의해 주셔서 맨 아래 get_klines("BTCUSDT", "1h", start_time=timestamp)처럼 필요한 변수들만 입력하여 사용하시면 됩니다.

 

                0               1               2    ...       8              9                   10 11
                
0    1685577600000  27210.36000000  27350.00000000   ...   57885   1305.01325000  35498542.09453870   0

1    1685581200000  27065.76000000  27165.47000000   ...   30859   759.76611000   20604420.40711490   0

2    1685584800000  27078.56000000  27114.16000000   ...   66445   1552.43981000  41615427.88788020   0

..             ...             ...             ...   ...     ...            ...                 ...  ..

497  1687366800000  30164.58000000  30350.00000000   ...   142134  4399.60625000  132185717.60300890  0

498  1687370400000  30080.23000000  30291.98000000   ...   78543   2077.63106000  62681443.94531630   0

499  1687374000000  30131.38000000  30183.37000000   ...   65237   1229.82322000  36945056.23911890   0

결과로 BTCUSDT 1시간 봉의 12개의 열과  23년 6월 1일 오전 9시부터의 500개의 행의 데이터를 가져올 수 있었습니다. 열 이름이 정의되어 있지 않은데 바이낸스 response처럼 정의해 주셔도 되고 본인이 알아보기 쉽게 정의해 주셔도 됩니다.

 

마지막으로 차트의 데이터만을 요청하는 일은 따로 API키가 필요하지 않으므로 함부로 노출시키지 않도록 주의하시고 성투하시길 바랍니다.

반응형