바이낸스 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를 이용할 때 크게 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
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키가 필요하지 않으므로 함부로 노출시키지 않도록 주의하시고 성투하시길 바랍니다.