파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
가장 빠르게 익히는 방법은 직접 해보는 것입니다. 이 포스팅을 통해 파이썬 바이낸스 API 패키지(python-binance library)로 실감나는 비트코인 시계열 데이터를 수집하는 방법을 익힐 수 있을 것입니다. 최종 결과물은 바이낸스 코인 거래소 API로 거래소에 접속해서 비트코인의 최근 가격과 시계열 데이터를 가져오는 파이썬 코드입니다.
글의 순서
바이낸스에서 최근 비트코인 가격 가져오기
비트코인 가격 시계열 데이터 (Bitcoin’s historical data) : ohlcv 형태
파이썬 바이낸스 API로 출력한 시계열 데이터 분석
파이썬 바이낸스 API로 가져온 시계열 데이터를 판다스 DataFrame에 저장
바이낸스에서 최근 비트코인 가격 가져오기
최근 비트코인 가격을 가져오기 위해 여러 가지 방법을 적용해 볼 수 있습니다만, 간단한 방법은 파이썬 바이낸스 API의 함수 중 get_symbol_ticker을 활용하는 방법입니다.
실습코드01은 get_symbol_ticker를 써서 최근 비트코인 가격을 가져오는 파이썬 프로그램입니다. 실습코드01을 실행시키면 딕셔너리 형태로 최근 비트코인 가격을 출력해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
import os from binance.client import Client api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) print('-- Account accessed --') #01) get latest price from Binance API btc_price = client.get_symbol_ticker(symbol="BTCUSDT") print(btc_price) |
1 2 |
-- Account accessed -- {'symbol': 'BTCUSDT', 'price': '20899.22000000'} |
실습코드01에서 딕셔너리 형태 { } 로 출력된 최근 비트코인 가격을 확인하였습니다. 만약 딕셔너리 형태가 아니라 그냥 비트코인 가격만 보고 싶으면 아래의 코드처럼 바꾸면 됩니다.
print(btc_price[“price”])
비트코인 가격 시계열 데이터 (Bitcoin’s historical data) : ohlcv 형태
파이썬 바이낸스 API는 코인 가격을 시계열 데이터로 쉽게 가져올 수 있도록 get_historical_klines() 함수를 제공합니다. 이 함수의 출력값은 ohlcv라는 캔들 데이터 형태입니다. 여기서, o는 시작가(open), h는 최고가(high), l은 최저가(low), c는 종료가(close), 그리고 v는 총 거래량(volume)을 의미합니다.
get_historical_klines() 함수에 시작점, 끝점을 인자로 넘겨주고 시계열 데이터 수집 구간을 정할 수 있는데, 만약 끝점을 넘겨주지 않으면 현재까지의 데이터를 가져옵니다. 인자로 넘겨 줄 시간 간격(시작점, 끝점)은 아래처럼 분(m, minute), 시간(h, hour), 일(d, day), 주(w, week), 월(M, month)로 구분할 수 있습니다.
# valid intervals – 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
(1) 시계열 데이터 구간 중 시작점 예) 각 코인별 최초 거래일
파이썬 바이낸스 패키지의 get_earliest_valid_timestamp() 함수는 가격 데이터를 저장한 최초의 timestamp를 돌려줍니다. get_earliest_valid_timestamp 함수로부터 출력되는 timestamp의 단위는 밀리초(millisecond)로, 정수형 13자리입니다.
여기서 timestamp는 1970년 1월 1일 0시 0분 0초부터의 경과 시간을 나타내고, epoch time, Unix time, POSIX time을 모두 같은 의미로 사용합니다. timestamp 단위는 초(second) 인데, 소숫점이하 6자리까지, 그러니까 마이크로 초(micro second)까지 나타내줍니다.
timestamp를 국제 표준시(UTC, Coordinated Universal Time)로 바꾸는 데는 datetime이라는 파이쎤 패키지의 fromtimestamp() 함수가 유용합니다. 이 함수의 인자로는 밀리초가 아니라 초 단위의 timestamp를 넘겨줘야 하므로, get_earliest_valid_timestamp() 함수로 구한 밀리초 단위의 timestamp를 1000으로 나눠서 초 단위로 바꿔줘야 합니다.
(2) get_historical_klines() 함수 파라미터(parameter)
get_historical_klines() 함수로 출력한 시계열 데이터를 얻기 위해 필요한 주요 인자(=파라미터)와 인자의 자료형을 알아보겠습니다. get_historical_klines() 함수에 넘겨주는 인자의 자료형은 문자열(str, string)과 정수형(int, integer), 2가지입니다.
get_historical_klines(symbol, interval, start_str=None, end_str=None, limit=1000)
▶symbol(str) : 코인 심볼, 예를 들어 비트코인은 BTCUSDT, 리플은 XRPUSDT입니다.
▶interval (str) : 시간 간격, 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
▶start_str (str 또는 int) : 선택사항. 문자열 UTC 또는 밀리 초(milliseconds) 단위의timestamp
▶end_str (str 또는 int) : 선택사항, 만약 파라미터로 넘겨주지 않으면 현재까지. 문자열 UTC 또는 밀리 초(milliseconds) 단위의 timestamp
▶limit(int) : 기본값 1000이며, 최대값도 1000
예를 들어보겠습니다. 아래는 get_historical_klines() 함수의 인자를 보여줍니다. 캔들 데이터인만큼 bars라는 변수에 get_historical_klines() 함수로부터 받아온 ohlcv 데이터 들을 저장합니다. 이 예에서는 시간 간격을 문자열 UTC 형식으로 넘겨주고 있습니다.
bars = client.get_historical_klines(‘BTCUSDT’, ‘1d’, ‘2023-01-10 00:00:00’, ‘2023-01-14 00:00:00’, limit=1000)
(3) 시계열 데이터 형태 : 캔들 데이터
파이썬 바이낸스 패키지의 get_historical_klines() 함수는 캔들 데이터를 반환해 줍니다. 캔들은 봉으로 불리기도 하며, 주가나 코인 가격 그래프에서 막대 모양으로 나타납니다. 캔들(candle)은 초를 뜻하는데, 막대 모양이 초를 닮아있기도 합니다. 캔들 데이터를 구성하는 필수요소는 시작가(Open), 최고가(High), 최저가(Low), 종가(Close)의 4가지 가격요소와, 시작 시간(Open time), 종료 시간(Close time) 이라고 할 수 있습니다.
아래는 파이썬 바이낸스 패키지의 .get_historical_klines() 함수를 이용해서 출력한 시계열 데이터를 보여주고 있습니다. 리스트 안에 리스트가 있는 [[ ], [ ], … , [ ]] 형태라는 사실에 주목해주시기 바랍니다.
1 |
[[1504224000000, '4689.89000000', '4939.19000000', '2817.00000000', '4378.51000000', '27634.18912000', 1506815999999, '110493081.58501816', 228745, '12353.17004300', '49199923.91602857', '0'], … , [1672531200000, '16541.77000000', '21258.00000000', '16499.01000000', '20916.87000000', '3055017.38710000', 1675209599999, '54388875681.28416090', 76049486, '1520783.82813000', '27081772540.44847850', '0']] |
파이썬 바이낸스 API로 출력한 시계열 데이터 분석
파이썬 바이낸스 API로 출력한 캔들 데이터에 들어있는 첫 번째 리스트 [ ]를 이해하기 좋은 형태로 나타내었습니다. 리스트 [ ]는 총 12개의 엘리먼트로 구성되어 있는데, 각각의 의미를 아래에 나타내었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
[1504224000000, # 시작 시간 (Open time) '4689.89000000', # 시작가 (Open) '4939.19000000', # 최고가 (High) '2817.00000000', # 최저가 (Low) '4378.51000000', # 종가 (Close) '27634.18912000', # BTC로 계산된 거래량 (Volume) 1506815999999, # 종료 시간 (Closing time) '110493081.58501816', # USDT로 환산한 거래량 (Quote asset volume) 228745, # 총 거래 개수 (Number of trades) '12353.17004300', # 구매자가 구매한 BTC 코인량 (Taker buy base asset volume) '49199923.91602857', # 구매자가 구매한 BTC를 USDT로 환산한 량 (Taker buy quote asset volume) '0'], # 무시해도 되는 항목(ignore) |
파이썬 바이낸스 API로 가져온 시계열 데이터를 판다스 DataFrame에 저장
파이썬 바이낸스 API로 가져온 시계열 데이터를 최종적으로 pandas DataFrame으로 저장하는 실습코드02를 작성하였습니다. 아래의 코드에서 #주석과 print문을 확인하신 후 코드 실행결과에서 비교해 보시기 바랍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import os import pandas as pd from binance.client import Client from datetime import datetime, timezone, timedelta api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) print('\n','-- 바이낸스 계정 접속 (Account accessed) --') #01) Binance API로 불러오는 최근 가격 btc_price = client.get_symbol_ticker(symbol="BTCUSDT") #01-1) 딕셔너리 형태로 전체 결과 출력 print('\n','#01-1') print(btc_price) #01-2) 딕셔너리에서 가격만 출력 print('\n','#01-2') print(btc_price["price"]) #02) 코인 최초 거래일, 밀리초(millisecond)를 초(second)로 변환 timestamp_initial = client._get_earliest_valid_timestamp('BTCUSDT', '1d') timestamp_initial = timestamp_initial/1000. timestamp = client._get_earliest_valid_timestamp('BTCUSDT', '1d') print('\n','#02 이 코인의 바이낸스 최초 거래일') print('timestamp_initial :',timestamp_initial) #02-1) 시간 변환 : timestamp --> UTC --> KST utc_binan_BTC_init = datetime.fromtimestamp(timestamp_initial) kst_binan_BTC_init = utc_binan_BTC_init + timedelta(hours=9) print('\n','#02-1 최초거래일 출력 형식 변경') print('UTC_Initial : ', utc_binan_BTC_init) print('KST_Initial : ', kst_binan_BTC_init) #03) Binance API로 불러오는 시계열 데이터 : ohlcv 형태의 캔들 데이터 #bars = client.get_historical_klines('BTCUSDT', '1M', timestamp, '2018-08-17 09:00:00', limit=1000) bars = client.get_historical_klines('BTCUSDT', '1d', '2023-01-10 00:00:00', '2023-01-14 00:00:00', limit=1000) print('\n','#03 시계열 데이터 개수') print(len(bars)) #03-1) 시계열 데이터를 단위 시간별로 출력 print('\n','#03-1 시계열 데이터를 단위 시간별로 출력') for i in bars: print(i) #04) Pandas DataFrame으로 저장 btc_df = pd.DataFrame(bars) print('\n','#04-1 시계열 데이터를 Pandas.DataFrame으로') print(btc_df) btc_df = pd.DataFrame(bars, columns=['time_open','open','high','low','close','volume','time_close','vol_qa','n_trades','coin_qa','USDT_qa', 'ign']) print('\n','#04-2 Pandas.DataFrame 열 이름 지정') print(btc_df) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
-- 바이낸스 계정 접속 (Account accessed) -- #01-1 {'symbol': 'BTCUSDT', 'price': '20707.47000000'} #01-2 20707.47000000 #02 이 코인의 바이낸스 최초 거래일 timestamp_initial : 1502928000.0 #02-1 최초거래일 출력 형식 변경 UTC_Initial : 2017-08-17 00:00:00 KST_Initial : 2017-08-17 09:00:00 #03 시계열 데이터 개수 5 #03-1 시계열 데이터를 단위 시간별로 출력 [1673308800000, '17179.04000000', '17499.00000000', '17146.34000000', '17440.66000000', '221382.42581000', 1673395199999, '3829247653.73110520', 5448751, '109377.45606000', '1891995855.28760790', '0'] [1673395200000, '17440.64000000', '18000.00000000', '17315.60000000', '17943.26000000', '262221.60653000', 1673481599999, '4586965947.26354980', 5627464, '129944.56930000', '2273368097.02926420', '0'] [1673481600000, '17943.26000000', '19117.04000000', '17892.05000000', '18846.62000000', '454568.32178000', 1673567999999, '8348431207.84600970', 8911373, '227295.33172000', '4174813798.38286060', '0'] [1673568000000, '18846.62000000', '20000.00000000', '18714.12000000', '19930.01000000', '368615.87823000', 1673654399999, '7061633461.44473400', 8021774, '183448.89377000', '3515300890.30505730', '0'] [1673654400000, '19930.01000000', '21258.00000000', '19888.05000000', '20954.92000000', '393913.74951000', 1673740799999, '8183071567.04618820', 8659545, '197817.55209000', '4109568162.17041980', '0'] #04-1 시계열 데이터를 Pandas.DataFrame으로 0 1 2 3 ... 8 9 10 11 0 1673308800000 17179.04000000 17499.00000000 17146.34000000 ... 5448751 109377.45606000 1891995855.28760790 0 1 1673395200000 17440.64000000 18000.00000000 17315.60000000 ... 5627464 129944.56930000 2273368097.02926420 0 2 1673481600000 17943.26000000 19117.04000000 17892.05000000 ... 8911373 227295.33172000 4174813798.38286060 0 3 1673568000000 18846.62000000 20000.00000000 18714.12000000 ... 8021774 183448.89377000 3515300890.30505730 0 4 1673654400000 19930.01000000 21258.00000000 19888.05000000 ... 8659545 197817.55209000 4109568162.17041980 0 [5 rows x 12 columns] #04-2 Pandas.DataFrame 열 이름 지정 time_open open high low ... n_trades coin_qa USDT_qa ign 0 1673308800000 17179.04000000 17499.00000000 17146.34000000 ... 5448751 109377.45606000 1891995855.28760790 0 1 1673395200000 17440.64000000 18000.00000000 17315.60000000 ... 5627464 129944.56930000 2273368097.02926420 0 2 1673481600000 17943.26000000 19117.04000000 17892.05000000 ... 8911373 227295.33172000 4174813798.38286060 0 3 1673568000000 18846.62000000 20000.00000000 18714.12000000 ... 8021774 183448.89377000 3515300890.30505730 0 4 1673654400000 19930.01000000 21258.00000000 19888.05000000 ... 8659545 197817.55209000 4109568162.17041980 0 [5 rows x 12 columns] |
마치며 …
가장 빠르게 익히는 방법은 직접 해보는 것입니다. 이번 포스팅에서는 바이낸스 코인 거래소 API로 거래소에 접속해서 비트코인의 최근 가격과 시계열 데이터를 가져오는 방법을 정리하였습니다.
최종 결과물은 파이썬 바이낸스 API로 출력한 시계열 데이터를 pandas DataFrame으로 저장하는 실습코드02입니다. 이 파이썬 코드를 이해하기 위해 필요한 내용들을 바탕으로 실습코드02의 출력 결과를 확인해 보시기 바랍니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍
3. 파이썬 IDE 설정. 비주얼 스튜디오 코드(Visual Studio Code, VS code)
4. 파이썬 프로그래밍 time 이해 : timestamp, UTC, KST
5. API와 파이썬 데이터 분석
6. 시계열 데이터 전처리 결과 확인 : pandas DataFrame
7. 파이썬 프로그래밍 시작 (8) 자료구조(Data Structure) : 리스트
8. 파이썬 프로그래밍 시작
참고자료
[1] python-binance Docs >> get_historical_klines
[2] ALGOTRADING101 Blog, Binance Python API ? A Step-by-Step Guide