파이썬 바이낸스 API로 차트 분석. 판다스 시간 처리
파이썬 바이낸스 API로 코인 가격에 대한 시계열 데이터 분석을 쉽게 할 수 있습니다. 시계열 데이터 분석에 좋은 방법은 캔들 차트를 이용하는 방법입니다. 이 포스팅에서는 파이썬 바이낸스 API의 get_historical_klines() 함수로 가져온 시간, 시가, 고가, 저가, 종가 데이터 중 시간 데이터를 처리하는 방법에 대해 알아보겠습니다. 파이썬 판다스 데이터프레임에 저장하는 것이 시계열 데이터 전처리의 최종 목표입니다.
글의 순서
파이썬 바이낸스 API로 가져오는 시계열 데이터
파이썬 바이낸스 API로 가져온 시계열 데이터 형태
판다스를 이용한 시계열 데이터 처리
timestamp를 UTC로 변환 후 판다스 데이터프레임에 추가
파이썬 코드 : 시계열 데이터 분석을 위한 시간 처리, UTC 기반 데이터프레임 생성
파이썬 바이낸스 API로 가져오는 시계열 데이터
파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍이라는 포스팅에서 ohlcv 데이터를 가져오는 방법을 자세하게 정리한 적 있는데, 이번 포스팅과 관련된 핵심만 요약해보겠습니다.
파이썬 바이낸스 API는 코인 가격을 시계열 데이터로 쉽게 가져올 수 있도록 get_historical_klines() 함수를 제공합니다. 이 함수의 출력값은 ohlcv라는 캔들 데이터 형태입니다. 여기서, o는 시작가(open), h는 최고가(high), l은 최저가(low), c는 종료가(close), 그리고 v는 총 거래량(volume)을 의미합니다.
파이썬 바이낸스 패키지의 get_earliest_valid_timestamp() 함수는 가격 데이터를 저장한 최초의 timestamp를 돌려주는데, timestamp의 단위는 밀리초(millisecond)로, 정수형 13자리입니다. 이 timestamp는 1970년 1월 1일 0시 0분 0초부터의 경과 시간을 초 단위로 나타내줍니다. 컴퓨터로 처리하기 좋은 시간 단위이지만, 우리가 이해하기는 힘듭니다. 따라서 이 timestamp를 국제 표준시(UTC, Coordinated Universal Time)로 바꿔서 ohlcv 데이터에 추가하는 것이 이번 포스팅의 목표입니다.
파이썬 바이낸스 API로 가져온 시계열 데이터 형태
먼저 파이썬 바이낸스 API로 가져온 시계열 데이터 형태를 살펴보겠습니다. 이 글의 맨 아래에 있는 파이썬 코드의 주석을 참고해 주시기 바랍니다.
아래는 파이썬 바이낸스 API로 비트코인 시계열 데이터를 가져와서 판다스 데이터프레임(pandas DataFrame)에 저장한 후, 출력한 모습입니다. 아래의 코드에서 #04-1) 단계에 해당합니다.
1 2 3 4 5 6 7 |
[ BINANCE ACCOUNT ACCESSED ] 0 1 2 ... 9 10 11 0 1674172800000 21071.59000000 22755.93000000 ... 170200.04869000 3654038898.27092860 0 1 1674259200000 22666.00000000 23371.80000000 ... 172663.17131000 3956916674.40296310 0 2 1674345600000 22783.35000000 23078.71000000 ... 125842.91663000 2866409820.72257050 0 3 1674432000000 22706.02000000 23180.00000000 ... 145854.70936000 3330927704.48361020 0 4 1674518400000 22917.81000000 23030.00000000 ... 9017.94525000 207097434.95643470 0 |
#02) 시계열 데이터 수집 시작 시점
get_time_stt(timestamp_now, interval, nbar) 함수는 현재 시간과, 시간 간격, 그리고 현재시간을 기준으로 몇 개의 봉(bar)을 가져올 것인지에 대한 3개의 인자(parameter)로 받아서 시계열 데이터 수집의 시작 시점을 반환합니다. 여기서 봉은 ohlcv 데이터를 의미하며, 몇 개의 봉인지는 nbar라는 변수로 처리합니다.
#04) 시계열 데이터 수집 시점부터 현재까지의 bar 데이터(ohlcv 데이터) 획득
이 함수로 가져온 시계열 데이터 수집 시작 시점은 파이썬 파이낸스 API의 client.get_historical_klines() 함수의 인자로 쓰이며, client.get_historical_klines() 함수는 ohlcv 데이터를 반환합니다.
이 과정을 거쳐서 가져온 시계열 데이터는 bars라는 변수에 저장되며, 이 bars를 다시 판다스 데이터프레임에 저장합니다.
판다스를 이용한 시계열 데이터 처리
(1) ohlcv 데이터만 추출
파이썬 바이낸스 패키지의 get_earliest_valid_timestamp() 함수는 ohlcv 데이터 외에도 총 12개의 데이터를 반환합니다. 이 중 시계열 데이터 처리에 꼭 필요한 ohlcv와 시간만 남기고 아래의 방법으로 지워 줍니다.
1 2 |
for i in bars: del i[7:] |
(2) 열 이름 붙여주기
ohlcv와 시작시간, 종료시간, 이렇게 총 7개의 열만 남아있습니다. 데이터를 파악하기 쉽게 하기 위해 열 이름을 붙여줍니다.
1 |
df_core = pd.DataFrame(bars, columns=['time_open','open','high','low','close','volume','time_close']) |
(3) 열의 타입 변환
판다스 데이터프레임으로 df_core에 담아 둔 데이터는 ‘pandas.core.frame.DataFrame’ 형식(type)입니다. 데이터 가공을 위해서는 이를 실수형 데이터로 바꿔줍니다.
1 |
df_core = df_core.astype({'open' : 'float', 'high' : 'float', 'low' : 'float', 'close' : 'float', 'volume' : 'float'}) |
timestamp를 UTC로 변환 후 판다스 데이터프레임에 추가
pandas DataFrame에 저장된 timestamp를 그대로 변환하고 싶지만 판다스 문법으로는 그게 불가능합니다. 그래서 timestamp를 UTC로 변환한 후 리스트로 저장 했다가, 이를 다시 pandas 데이터프레임에 추가 하는 방법을 사용해야 합니다.
(1) timestamp를 UTC로 변환 후 리스트로 저장
봉 차트의 시작 시간과 끝 시간을 각각 t_stt, t_end라는 리스트 변수에 아래의 방법으로 저장합니다.
1 2 3 4 5 6 |
t_stt = [] t_end = [] for i in bars: t_stt.append(datetime.fromtimestamp(i[0]/1000)) t_end.append(datetime.fromtimestamp(i[6]/1000)) |
(2) UTC 리스트를 pandas DataFrame으로 저장
timestamp를 UTC 형식의 데이터로 변환 후 만든 t_stt[], t_end[]라는 리스트를 판다스 데이터프레임으로 바꾼 후 df_t_stt, df_t_end 라는 변수에 저장합니다.
1 2 |
df_t_stt = pd.DataFrame(t_stt, columns=['time_open_utc']) df_t_end = pd.DataFrame(t_end, columns=['time_close_utc']) |
(3) UTC 데이터를 추가하여 pandas DataFrame 완성 : DataFrame 합치기
df_core는 총 7열로 구성되어 있고, df_t_stt와 df_t_end는 각각 1열로 구성되어 있는 데이터프레임입니다. 이를 합쳐서 총 9열로 구성된 pandas DataFrame으로 만드려면, pandas DataFrame의 join 함수를 사용합니다.
먼저 df_t_stt와 df_core를 합쳐서 df1이라는 판다스 데이터프레임 변수에 저장한 후, df1과 df_t_end를 합쳐서 df라는 데이터프레임을 만드는 과정은 다음과 같습니다.
1 2 |
df1 = df_t_stt.join(df_core) df = df1.join(df_t_end) |
파이썬 코드 : 시계열 데이터 분석을 위한 시간 처리, UTC 기반 데이터프레임 생성
지금까지의 과정을 ‘시계열 분석을 위한 전처리’ 파이썬 코드에 나타내었습니다. 번호로 매겨놓은 주석과 출력 결과를 참고해주시기 바랍니다. 9번째 단계인 UTC 리스트를 pandas DataFrame으로 저장에서 time_open_utc를 출력해보면 시간이 안나오는데, 이는 시간이 00:00:00이라서 생략된 것입니다. 하루 간격이 아니라 4시간 간격처럼 다른 시간 간격(time interval) 적용하면 시간까지 정상적으로 출력됩니다.
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
import os import time import pandas as pd from binance.client import Client import datetime from datetime import datetime, timezone, timedelta #01) 바이낸스 계정 접속 api_key = os.getenv('Binan_API_KEY') api_secret = os.getenv('Binan_SECRET_KEY') client = Client(api_key, api_secret) print('\n','[ BINANCE ACCOUNT ACCESSED ]') #02) 시계열 데이터 수집 시작 시점 def get_time_stt(timestamp_now, interval, nbar): interval = str(interval) if interval == '1d': timestamp_stt = timestamp_now - nbar*24*60*60 utc_stt = datetime.fromtimestamp(int(timestamp_stt)) elif interval == '4h': timestamp_stt = timestamp_now - nbar*4*60*60 utc_stt = datetime.fromtimestamp(int(timestamp_stt)) return utc_stt #03) 현재시간 timestamp_now = time.time() utc_now = datetime.fromtimestamp(timestamp_now) #04) 시계열 데이터 수집 시점부터 현재까지의 bar 데이터(ohlcv 데이터) 획득 nbar = 5 utc_ref = get_time_stt(timestamp_now, '1d', nbar) utc_ref_str = datetime.strftime(utc_ref, '%Y-%m-%d %H:%M:%S') bars = client.get_historical_klines('BTCUSDT', '1d', utc_ref_str, limit=1000) #04-1) ohlcv 데이터를 판다스 데이터프레임에 저장 후 출력 df_core = pd.DataFrame(bars) print('\n','#04) ---') print(df_core) #05) ohlcv 데이터만 추출 for i in bars: del i[7:] df_core = pd.DataFrame(bars) print('\n','#05) ---') print(df_core) #06) 데이터프레임 열 이름 붙여주기 df_core = pd.DataFrame(bars, columns=['time_open','open','high','low','close','volume','time_close']) print('\n','#06) ---') print(df_core) #07) 데이터프레임 열 type을 실수형으로 변환 df_core = df_core.astype({'open' : 'float', 'high' : 'float', 'low' : 'float', 'close' : 'float', 'volume' : 'float'}) print('\n','#07) ---') print(df_core) #08) timestamp를 UTC로 변환 후 리스트로 저장 t_stt = [] t_end = [] for i in bars: t_stt.append(datetime.fromtimestamp(i[0]/1000)) t_end.append(datetime.fromtimestamp(i[6]/1000)) print('\n','#08) ---') print(t_stt) print(t_end) #09) UTC 리스트를 pandas DataFrame으로 저장 df_t_stt = pd.DataFrame(t_stt, columns=['time_open_utc']) df_t_end = pd.DataFrame(t_end, columns=['time_close_utc']) print('\n','#09) ---') print(df_t_stt) print(df_t_end) #10) UTC 데이터를 추가하여 pandas DataFrame 완성 df1 = df_t_stt.join(df_core) print('\n','#10-1) ---') print(df1) df = df1.join(df_t_end) print('\n','#10-2) ---') print(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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
[ BINANCE ACCOUNT ACCESSED ] #04) --- 0 1 2 3 ... 8 9 10 11 0 1674172800000 21071.59000000 22755.93000000 20861.28000000 ... 7382435 170200.04869000 3654038898.27092860 0 1 1674259200000 22666.00000000 23371.80000000 22422.00000000 ... 7796520 172663.17131000 3956916674.40296310 0 2 1674345600000 22783.35000000 23078.71000000 22292.37000000 ... 6603827 125842.91663000 2866409820.72257050 0 3 1674432000000 22706.02000000 23180.00000000 22500.00000000 ... 7258655 145854.70936000 3330927704.48361020 0 4 1674518400000 22917.81000000 23144.76000000 22864.67000000 ... 919147 18239.91740000 419883919.41289490 0 [5 rows x 12 columns] #05) --- 0 1 2 3 4 5 6 0 1674172800000 21071.59000000 22755.93000000 20861.28000000 22667.21000000 338079.13659000 1674259199999 1 1674259200000 22666.00000000 23371.80000000 22422.00000000 22783.55000000 346445.48432000 1674345599999 2 1674345600000 22783.35000000 23078.71000000 22292.37000000 22707.88000000 253577.75286000 1674431999999 3 1674432000000 22706.02000000 23180.00000000 22500.00000000 22916.45000000 293588.37938000 1674518399999 4 1674518400000 22917.81000000 23144.76000000 22864.67000000 23031.92000000 36369.86872000 1674604799999 #06) --- time_open open high low close volume time_close 0 1674172800000 21071.59000000 22755.93000000 20861.28000000 22667.21000000 338079.13659000 1674259199999 1 1674259200000 22666.00000000 23371.80000000 22422.00000000 22783.55000000 346445.48432000 1674345599999 2 1674345600000 22783.35000000 23078.71000000 22292.37000000 22707.88000000 253577.75286000 1674431999999 3 1674432000000 22706.02000000 23180.00000000 22500.00000000 22916.45000000 293588.37938000 1674518399999 4 1674518400000 22917.81000000 23144.76000000 22864.67000000 23031.92000000 36369.86872000 1674604799999 #07) --- time_open open high low close volume time_close 0 1674172800000 21071.59 22755.93 20861.28 22667.21 338079.13659 1674259199999 1 1674259200000 22666.00 23371.80 22422.00 22783.55 346445.48432 1674345599999 2 1674345600000 22783.35 23078.71 22292.37 22707.88 253577.75286 1674431999999 3 1674432000000 22706.02 23180.00 22500.00 22916.45 293588.37938 1674518399999 4 1674518400000 22917.81 23144.76 22864.67 23031.92 36369.86872 1674604799999 #08) --- [datetime.datetime(2023, 1, 20, 0, 0), datetime.datetime(2023, 1, 21, 0, 0), datetime.datetime(2023, 1, 22, 0, 0), datetime.datetime(2023, 1, 23, 0, 0), datetime.datetime(2023, 1, 24, 0, 0)] [datetime.datetime(2023, 1, 20, 23, 59, 59, 999000), datetime.datetime(2023, 1, 21, 23, 59, 59, 999000), datetime.datetime(2023, 1, 22, 23, 59, 59, 999000), datetime.datetime(2023, 1, 23, 23, 59, 59, 999000), datetime.datetime(2023, 1, 24, 23, 59, 59, 999000)] #09) --- time_open_utc 0 2023-01-20 1 2023-01-21 2 2023-01-22 3 2023-01-23 4 2023-01-24 time_close_utc 0 2023-01-20 23:59:59.999 1 2023-01-21 23:59:59.999 2 2023-01-22 23:59:59.999 3 2023-01-23 23:59:59.999 4 2023-01-24 23:59:59.999 #10-1) --- time_open_utc time_open open high low close volume time_close 0 2023-01-20 1674172800000 21071.59 22755.93 20861.28 22667.21 338079.13659 1674259199999 1 2023-01-21 1674259200000 22666.00 23371.80 22422.00 22783.55 346445.48432 1674345599999 2 2023-01-22 1674345600000 22783.35 23078.71 22292.37 22707.88 253577.75286 1674431999999 3 2023-01-23 1674432000000 22706.02 23180.00 22500.00 22916.45 293588.37938 1674518399999 4 2023-01-24 1674518400000 22917.81 23144.76 22864.67 23031.92 36369.86872 1674604799999 #10-2) --- time_open_utc time_open open high low close volume time_close time_close_utc 0 2023-01-20 1674172800000 21071.59 22755.93 20861.28 22667.21 338079.13659 1674259199999 2023-01-20 23:59:59.999 1 2023-01-21 1674259200000 22666.00 23371.80 22422.00 22783.55 346445.48432 1674345599999 2023-01-21 23:59:59.999 2 2023-01-22 1674345600000 22783.35 23078.71 22292.37 22707.88 253577.75286 1674431999999 2023-01-22 23:59:59.999 3 2023-01-23 1674432000000 22706.02 23180.00 22500.00 22916.45 293588.37938 1674518399999 2023-01-23 23:59:59.999 4 2023-01-24 1674518400000 22917.81 23144.76 22864.67 23031.92 36369.86872 1674604799999 2023-01-24 23:59:59.999 |
마치며 …
파이썬 바이낸스 API로 코인 가격에 대한 시계열 데이터 분석을 쉽게 할 수 있습니다. 이 포스팅에서는 시계열 데이터 전처리 과정으로 파이썬 바이낸스 API의 get_historical_klines() 함수로 가져온 시간, 시가, 고가, 저가, 종가 데이터 중 시간 데이터를 처리하는 방법을 정리하였습니다.
timestamp 데이터를 리스트 형태의 UTC 데이터로 변환 한 후 판다스 데이터프레임에 저장하였습니다. 여기까지 시계열 데이터 전처리가 완료되었습니다. 다음 포스팅부터는 본격적인 시계열 데이터 분석 단계로 넘어가겠습니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 업비트 REST API를 이용한 비트코인 가격 추출 파이썬 프로그래밍
5. 파이썬 IDE 설정. 비주얼 스튜디오 코드(Visual Studio Code, VS code)
6. 파이썬 프로그래밍 time 이해 : timestamp, UTC, KST
7. API와 파이썬 데이터 분석
8. 시계열 데이터 전처리 결과 확인 : pandas DataFrame
9. 파이썬 프로그래밍 시작 (8) 자료구조(Data Structure) : 리스트
10. 파이썬 프로그래밍 시작
참고자료
python-binance Docs >> get_historical_klines