바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)
파이썬 바이낸스 API로 시계열 데이터 분석 중입니다. 볼린저 밴드를 구하고 가시화까지 했던 지난 포스팅에 이어, 이번에는 시계열 데이터 분석용 볼린저 밴드 지표를 알아보겠습니다. %b와 밴드폭(Bandwidth)까지 가시화 할 수 있다면 이번 포스팅의 목적을 달성한 것입니다.
글의 순서
볼린저 밴드란?
볼린저 밴드 지표 : %b
볼린저 밴드 지표 : 밴드폭 (Bandwidth)
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 볼린저 밴드 지표(%b, Bandwidth) 구하기
볼린저 밴드란?
주식이나 암호화폐 거래에서 투자자들이 사용하는 보조지표는 이동평균선, 일목균형표, 볼린저 밴드 순으로 활용 빈도가 높습니다. 볼린저 밴드(Bollinger band)는 주가의 변동이 정규분포를 따른다고 가정해서 만든 것입니다. 시계열 그래프에서 현재 가격의 위아래에 밴드를 표시해서 현재 가격이 상대적으로 높은 상태인지, 낮은 상태인지를 알 수 있습니다.
볼린저 밴드 지표 : %b
주식이나 코인 가격이 볼린저 밴드의 어느 위치에 있는지를 나타내는 지표가 %b입니다. %b가 1일 때는 상단 밴드, 0.5일 때 중간, 0일 때 하단 밴드에 위치합니다.
%b =(종가 – 하단 볼린저 밴드)/(상단 볼린저 밴드 – 하단 볼린저 밴드)
볼린저 밴드 지표 : 밴드폭 (Bandwidth)
밴드폭은 상단 볼린저 밴드와 하단 볼린저 밴드와의 거리를 의미 합니다. 중간 볼린저 밴드에 비해 어느 정도 폭 인지를 %로 나타냅니다.
밴드폭 = {(상단 볼린저 밴드 – 하단 볼린저 밴드)/중간 볼린저 밴드} × 100
밴드폭으로는 추세를 확인할 수 있는데, 구체적으로는 크게 다음의 2가지입니다.
(1) 스퀴즈(squeeze) 확인 : 스퀴즈는 변동성이 극히 낮은 수준으로 떨어져서 곧 변동성이 크게 발생할 것으로 예상되는 상황입니다. 볼린저는 밴드폭이 6개월 저점일 때를 스퀴즈 부근으로 보고 있습니다.
(2)추세의 시작과 마지막 포착 : 강력한 추세는 스퀴즈로부터 시작되는데, 스퀴즈 후에 변동성이 커지면서 밴드폭이 급격히 커집니다. 강한 상승 추세에서는 하단 볼린저 밴드가 아래로 향합니다. 이후 밴드폭의 변동이 없거나 줄어들면서 볼린저 밴드가 추세 반대쪽으로 바꾸면 추세가 끝났다고 보는 것입니다.
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 볼린저 밴드 지표(%b, Bandwidth) 구하기
지난 포스팅에서 볼린저 밴드 구하는 방법을 알아보았습니다. 이번 포스팅에서는 판다스 열 연산(column operation)을 통해 볼린저 밴드 지표인 %b와 밴드폭을 구하는 부분이 추가되어 있습니다.
비트코인 가격 데이터를 파이썬 바이낸스 API로 가져오는 과정은 지난 포스팅과 동일합니다. 볼린저 밴드를 구하기 위해 사용한 판다스 rolling() 함수, 밴드를 회색으로 보여주기 위한 matplotlib.pyplot의 fill_between 함수를 다시 확인해 주시기 바랍니다. 더불어서 종이 한 장에 그래프 세 개를 나란히 넣기 위해 fig, axs를 지정하는 부분과 x축의 날짜 범위를 맞추기 위해 numpy를 사용한 부분은 시계열 데이터 분석에서 자주 활용될 중요한 부분입니다.
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 86 87 88 89 90 |
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 = '4h' #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'}) #06) Date 열의 형태를 epoch에서 Pandas.Timestamp로 변경 df['time_open'] = df['time_open'].apply(lambda date: pd.Timestamp(time.ctime(date/1000.))) # ====== 판다스 시계열 데이터 분석 : 볼린저 밴드(Bollinger Band) ====== #07-1) 시간 간격 개수 설정 : window 만큼 window = 20 #07-2) window 만큼의 시간 간격 기준 이동평균선 df['sma'] = df['close'].rolling(window).mean() #07-3) window 만큼의 시간 간격 기준 표준편차 df['stddev'] = df['close'].rolling(window).std() #07-4) 볼린저 밴드 : 상단(upper) ~ 하단(lower) df['upper'] = df['sma'] + ( 2.0 * df['stddev']) df['lower'] = df['sma'] - ( 2.0 * df['stddev']) #07-5) 볼린저 밴드 지표 : %b df['pb'] = (df['close']-df['lower'])/(df['upper']-df['lower']) #07-6) 볼린저 밴드 지표 : 밴드폭(Bandwidth) df['bandwidth'] = (df['upper']-df['lower'])/df['sma'] * 100. print('\n','#07) ---') print(df.tail(10)) #08) 시계열 데이터 가시화 : 비트코인 볼린저 밴드 #08-1) 볼린저 밴드 : 회색영역으로 표시 --> fill_between file_path = 'C:/_python/pandas/technical_analysis/' fig, axs = plt.subplots(3,1,figsize=(10,9)) axs[0].plot(df['time_open'],df['close'], label='close') axs[0].plot(df['time_open'],df['upper'], 'r--', label='upper band') axs[0].plot(df['time_open'],df['sma'], 'k--', label='SMA20') axs[0].plot(df['time_open'],df['lower'], 'c--', label='lower band') axs[0].fill_between(df['time_open'],df['upper'],df['lower'], color='0.9') axs[0].set_title('BTC Price(4h) & Bollinger Band(20*4h, 2 Std.Dev.)') axs[0].set_ylabel('Price (USDT)') axs[0].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-03-01')) axs[0].legend(loc='best') axs[0].grid(True) #08-2) %b axs[1].plot(df['time_open'],df['pb'], label='%b') axs[1].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-03-01')) axs[1].legend(loc='best') axs[1].grid(True) #08-3) Bandwidth axs[2].plot(df['time_open'],df['bandwidth'], label='Bandwidth') axs[2].set_xlim(np.datetime64('2022-12-01'), np.datetime64('2023-03-01')) axs[2].legend(loc='best') axs[2].grid(True) plt.savefig(file_path +'Bollinger_band_pb_bandwidth.png') plt.show() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ BINANCE ACCOUNT ACCESSED ] #07) --- time_open open high low close volume sma stddev upper lower pb bandwidth 530 2023-02-27 17:00:00 23423.88 23455.31 23332.65 23428.87 28495.85395 23304.2805 258.996954 23822.274407 22786.286593 0.620262 4.445483 531 2023-02-27 21:00:00 23428.87 23897.99 23379.25 23559.40 83616.02692 23290.7345 236.109647 23762.953793 22818.515207 0.784471 4.054997 532 2023-02-28 01:00:00 23557.66 23618.30 23150.00 23276.35 71456.59915 23260.3660 190.475545 23641.317091 22879.414909 0.520979 3.275538 533 2023-02-28 05:00:00 23276.34 23582.98 23106.77 23492.09 39061.14463 23267.4050 196.518646 23660.442292 22874.367708 0.785832 3.378437 534 2023-02-28 09:00:00 23492.09 23549.99 23349.57 23467.52 25897.10942 23281.6675 200.328894 23682.325289 22881.009711 0.731934 3.441831 535 2023-02-28 13:00:00 23467.01 23470.44 23212.80 23236.68 29133.30210 23284.2370 199.354862 23682.946724 22885.527276 0.440361 3.424718 536 2023-02-28 17:00:00 23235.63 23421.98 23200.00 23392.69 33078.50122 23299.9895 194.560472 23689.110444 22910.868556 0.619115 3.340095 537 2023-02-28 21:00:00 23391.96 23579.12 23315.42 23518.30 68386.61130 23320.0465 195.395543 23710.837587 22929.255413 0.753657 3.351546 538 2023-03-01 01:00:00 23519.08 23600.00 23205.06 23264.36 54116.84831 23334.0720 179.406559 23692.885118 22975.258882 0.402858 3.075444 539 2023-03-01 05:00:00 23263.38 23343.55 23020.97 23141.57 53528.62659 23340.8415 168.612744 23678.066988 23003.616012 0.204543 2.889574 |
마치며 …
파이썬 바이낸스 API로 시계열 데이터 분석을 계속하고 있습니다. 지금까지 파이썬 판다스로 이동평균선, 스토캐스틱, RSI, 볼린저 밴드와 같은 기술적 지표들을 직접 구해봤었습니다. 지난 포스팅에 이어 이번엔 볼린저 밴드 지표인 %b와 밴드폭(Bandwidth) 구하는 방법을 알아보았습니다.
주식 가격이나, 코인 가격에 대한 시계열 분석을 위해서는 분석 도구들을 많이 알면 많이 알수록 유리합니다. 다음 포스팅에서는 볼린저 밴드와 함께 사용할 수 있는 현금흐름지표(MFI, Money Flow Index)에 대해 알아보겠습니다.
함께 참고하면 더 좋은 글 :
1. 바이낸스 코인거래소 API Key로 계좌에 접속하는 파이썬 프로그래밍
2. 파이썬 바이낸스 API로 시계열 데이터를 가져오는 파이썬 프로그래밍
3. 바이낸스 API 보안을 위한 환경 변수 설정 : 윈도우 10
4. 파이썬 바이낸스 API 시계열 데이터분석. 판다스 시간 처리
5. 파이썬 바이낸스 API로 차트 분석 : 판다스 이동평균선
6. 파이썬 바이낸스 API로 차트 분석. 판다스 스토캐스틱
7. 파이썬 바이낸스 API로 차트 분석. 판다스 RSI (상대강도지수)
8. 파이썬 바이낸스 API로 시계열 데이터 분석. 판다스, 볼린저 밴드 (Bollinger Band)
9. 파이썬 프로그래밍 시작
참고자료
[1] 파이썬 바이낸스 API로 가져오는 ohlcv 데이터 : python-binance Docs >> get_historical_klines
[2] 김황후(2020), 파이썬 증권 데이터 분석, 한빛미디어
쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.