파이썬 바이낸스 API로 차트 분석. 비트코인 가격 일간 변동률
파이썬 바이낸스 API로 코인 가격에 대한 시계열 데이터 분석을 쉽게 할 수 있습니다. 이번 포스팅에서는 가격이 다른 두 주가나 두 코인 가격의 수익률을 비교하는데 활용되는 일간 변동률 구하는 방법에 대해 알아보겠습니다. 일간 변동률부터 변동률 분포를 확인할 수 있는 히스토그램, 관심있는 전체 구간에서의 누적 변화량을 확인하는 방법을 확인해 보세요.
글의 순서
일간 변동률(Daily percent change)
판다스 데이터프레임으로 구현하는 일간 변동률
비트코인 가격 일간 변동률 누적 합 : 전체 구간 누적 변동률
비트코인 가격 일간 변동률 히스토그램
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 일간 변동률 구하기
일간 변동률(Daily percent change)
일간 변동률은 가격이 다른 두 주가나 두 코인 가격의 수익률을 비교하는데 활용될 수 있습니다. 어제보다 오늘의 가격이 얼마나 올랐는지, 또는 얼마나 떨어졌는지를 보여줍니다.
예를 들어, 비트코인의 어제 종가가 24,000 달러였는데, 오늘 종가가 24,500 달러가 되었다면, 오늘의 일간 변동률은
일간 변동률(%)
= (오늘 종가 – 어제 종가)/어제종가 × 100
= (24500-24000)/24000 × 100
= 2.083 %
가 됩니다. 어제 보다 500 달러가 올랐고, 이 값은 어제 종가보다 2.083% 했다는 것을 나타냅니다. 파이썬 판다스 데이터프레임을 이용한다면, 1개월, 1년 또는 10년치 일간 변동률을 열(column) 연산으로 쉽게 확인할 수 있습니다.
판다스 데이터프레임으로 구현하는 일간 변동률
파이썬 바이낸스 API는 코인 가격을 시계열 데이터로 쉽게 가져올 수 있도록 get_historical_klines() 함수를 제공합니다. 이 함수의 출력값은 ohlcv라는 캔들 데이터 형태입니다. 여기서, o는 시작가(open), h는 최고가(high), l은 최저가(low), c는 종료가(close), 그리고 v는 총 거래량(volume)을 의미합니다.
ohlcv 데이터 형태는 판다스 데이터프레임에서 각 열끼리 쉽게 사칙연산할 수 있습니다. 일간 변동률을 구하는데 오늘 종가와 어제 종가의 차이가 필요합니다. 그래서 어제 종가를 판다스 시리즈 모듈에서 제공하는 shift() 함수로 1일씩 이동시킨 후, 일간 변동률을 구하기 위한 사칙연산을 열(column)끼리 수행합니다.
아래 그림은 2022년 12월부터 2023년 2월까지 비트코인의 일간 변동률을 보여주고 있습니다. 이 3개월 동안은 약 -5% ~ 9.5%의 구간에 있습니다.
비트코인 가격 일간 변동률 누적 합 : 전체 구간 누적 변동률
우리가 관심이 있는 전체 구간에서의 가격 변동률을 알아보려면, 일간 변동률을 누적해 봐야 합니다. 파이썬 판다스에서 제공하는 cumsum() 함수로 누적합을 쉽게 구할 수 있습니다. 아래 파이썬 코드, ‘파이썬 바이낸스 API, 판다스로 일간 변동률 구하기’ #08) 부분에서 확인하실 수 있습니다.
비트코인 가격 일간 변동률 분포 : 히스토그램
위에서 비트코인의 일간 변동률을 봤는데요. 변동률이 어느 정도로 분포하고 있는지 알아보려면 각 변동률 구간별로 몇 회씩 발생했는지를 세어보는 것이 좋은 방법입니다. 이때 유용한 가시화 도구가 히스토그램입니다.
히스토그램(histogram)은 도수 분포(frequency distribution)를 보여주는 막대그래프입니다. 구간별 개수를 막대 형태로 나타내는데, 구간 개수를 bins라고 합니다. 파이썬 matplotlib의 pyplot에서 제공하는 hist() 함수를 사용하면 막대그래프를 쉽게 그릴 수 있습니다. 참고로, hist() 함수의 bins 기본값은 10개인데, 데이터 특성에 맞게 조절할 수 있습니다.
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 일간 변동률 구하기
지금까지의 과정을 ‘판다스 일간변동률’ 파이썬 코드에 나타내었습니다. 앞에서 설명한 일간 변동률과 누적 변동률을 판다스 데이터프레임에서 구현하는 방법과, 히스토그램을 그리는 방법까지 확인해 보시기 바랍니다. 이 포스팅에서는 각각의 그래프가 C:/_python/pandas/technical_analysis/ 라는 폴더에 저장됩니다. 물론 파일이 저장되는 경로는 각자 개인이 원하는 곳으로 지정하시면 되겠습니다.
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 |
import os import time import pandas as pd import numpy as np from binance.client import Client import datetime from datetime import datetime, timezone, timedelta import matplotlib.pyplot as plt #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) 입력 : 시계열 데이터 수집 구간(tstt~tend), 시간 간격(t_interval) tstt_utc = '2022-12-01 00:00:00' tend_utc = '2023-02-28 23:59:59' t_interval = '1d' #02-1) 입력 : graph option from technical analysis : 1_dcf, 2_dcfcum, 3_hist graph_option = '3_hist' #03) 파이썬 바이낸스 API로 비트코인 가격 데이터 가져오기 bars = client.get_historical_klines('BTCUSDT', t_interval, tstt_utc, tend_utc, limit=1000) #03-1) ohlcv 데이터만 추출 for i in bars: del i[6:] #04) 데이터프레임 열 이름 붙여주기 df = pd.DataFrame(bars, columns=['time_open','open','high','low','close','volume']) #05) 데이터프레임 열 type을 실수형으로 변환 df = df.astype({'open' : 'float', 'high' : 'float', 'low' : 'float', 'close' : 'float', 'volume' : 'float'}) print('\n','#05) ---') print(df.head(5)) #06) Date 열의 형태를 epoch에서 Pandas.Timestamp로 변경 df['time_open'] = df['time_open'].apply(lambda date: pd.Timestamp(time.ctime(date/1000.))) print('\n','#06) ---') print(df.head(5)) # ====== 판다스로 일일 변동률 구현 ====== #07) 일일 변동률 (dpc : daily percent change) df['close_shift'] = df['close'].shift(1) df['dcf'] = (df['close']-df['close_shift'])/df['close_shift']*100 #08) 구간 전체 변동률 (dpc_cumsum : cummulative sum of daily percent change) df['dcf_cumsum'] = df.dcf.cumsum() print('\n','#07) ---') print(df) #09) 시계열 데이터 가시화 : 일간 변동률, 구간 전체 변동률, 일간 변동률 분포(히스토그램) # graph_option) # '1_dcf' : 일간 변동률 # '2_dcfcum' : 구간 전체 변동률 # '3_hist' : 일간 변동률 분포(히스토그램) file_path = 'C:/_python/pandas/technical_analysis/' if graph_option == '1_dcf' : plt.plot(df['time_open'],df['dcf'], label='daily percent change') plt.xticks(rotation=20) plt.legend(loc='best') plt.ylabel('dcf (%)') plt.grid(True) plt.savefig(file_path +'dcf.png', dpi=200) elif graph_option == '2_dcfcum' : plt.plot(df['time_open'],df['dcf_cumsum'], label='percent change for 3-month') plt.xticks(rotation=20) plt.legend(loc='best') plt.ylabel('change (%)') plt.grid(True) plt.savefig(file_path +'dcf_cumsum.png', dpi=200) elif graph_option == '3_hist' : plt.hist(df.dcf, bins=18) plt.xlabel('dcf(%)') plt.ylabel('frequency') plt.grid(True) plt.savefig(file_path +'hist_dcf.png', dpi=200) |
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 |
[ BINANCE ACCOUNT ACCESSED ] #05) --- time_open open high low close volume 0 1669852800000 17165.53 17324.00 16855.01 16977.37 232818.18218 1 1669939200000 16978.00 17105.73 16787.85 17092.74 202372.20620 2 1670025600000 17092.13 17188.98 16858.74 16885.20 154542.57306 3 1670112000000 16885.20 17202.84 16878.25 17105.70 178619.13387 4 1670198400000 17106.65 17424.25 16867.00 16966.35 233703.29225 #06) --- time_open open high low close volume 0 2022-12-01 09:00:00 17165.53 17324.00 16855.01 16977.37 232818.18218 1 2022-12-02 09:00:00 16978.00 17105.73 16787.85 17092.74 202372.20620 2 2022-12-03 09:00:00 17092.13 17188.98 16858.74 16885.20 154542.57306 3 2022-12-04 09:00:00 16885.20 17202.84 16878.25 17105.70 178619.13387 4 2022-12-05 09:00:00 17106.65 17424.25 16867.00 16966.35 233703.29225 #07) --- time_open open high low close volume close_shift dcf dcf_cumsum 0 2022-12-01 09:00:00 17165.53 17324.00 16855.01 16977.37 232818.18218 NaN NaN NaN 1 2022-12-02 09:00:00 16978.00 17105.73 16787.85 17092.74 202372.20620 16977.37 0.679552 0.679552 2 2022-12-03 09:00:00 17092.13 17188.98 16858.74 16885.20 154542.57306 17092.74 -1.214200 -0.534648 3 2022-12-04 09:00:00 16885.20 17202.84 16878.25 17105.70 178619.13387 16885.20 1.305877 0.771229 4 2022-12-05 09:00:00 17106.65 17424.25 16867.00 16966.35 233703.29225 17105.70 -0.814641 -0.043411 .. ... ... ... ... ... ... ... ... ... 85 2023-02-24 09:00:00 23940.20 24132.35 22841.19 23185.29 343582.57453 23940.20 -3.153315 33.395344 86 2023-02-25 09:00:00 23184.04 23219.13 22722.00 23157.07 191311.81010 23185.29 -0.121715 33.273629 87 2023-02-26 09:00:00 23157.07 23689.99 23059.18 23554.85 202323.73623 23157.07 1.717748 34.991377 88 2023-02-27 09:00:00 23554.85 23897.99 23106.77 23492.09 283706.08590 23554.85 -0.266442 34.724935 89 2023-02-28 09:00:00 23492.09 23600.00 23020.97 23141.57 264140.99894 23492.09 -1.492077 33.232858 [90 rows x 9 columns] |
마치며 …
일간 변동률 히스토그램이나 일간 변동률 누적합은 각기 다른 종목의 가격 변동률을 비교할 때 유용하게 쓰입니다. 이번 포스팅에서는 주식이나 코인 가격의 변동률을 파악하고, 비교하기 위한 도구인 일간 변동률에 대해 알아보았습니다.
파이썬 바이낸스 API로 비트코인 가격을 가져오는 과정은 아래의 ‘함께 참고하면 좋은 글’에서 썼던 방법과 동일합니다. 파이썬 판다스 데이터프레임 열(column) 연산을 위해 썼던 shift() 함수와 각 열의 누적합을 간단하게 구할 수 있는 cumsum() 함수도 기억해 주세요.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 파이썬 바이낸스 API 시계열 데이터분석. 판다스 시간 처리
5. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
6. 파이썬 프로그래밍 time 이해 : timestamp, UTC, KST
7. API와 파이썬 데이터 분석
8. 시계열 데이터 전처리 결과 확인 : pandas DataFrame
9. 바이낸스 비트코인 투자 백 테스팅. 파이썬 코인 투자 연습
10. 파이썬 프로그래밍 시작
참고자료
[1] 파이썬 바이낸스 API로 가져오는 ohlcv 데이터 : python-binance Docs >> get_historical_klines
[2] 김황후(2020), 파이썬 증권 데이터 분석, 한빛미디어
쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.