바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)
파이썬 바이낸스 API로 시계열 데이터 분석 중입니다. 볼린저 밴드를 구하고 가시화까지 했던 지난 포스팅에 이어, 이번에는 시계열 데이터 분석용 볼린저 밴드 지표를 알아보겠습니다. %b와 밴드폭(Bandwidth)까지 가시화 할 수 있다면 이번 포스팅의 목적을 달성한 것입니다.
글의 순서
볼린저 밴드란?
볼린저 밴드 지표 : %b
볼린저 밴드 지표 : 밴드폭 (Bandwidth)
파이썬 코드 : 파이썬 바이낸스 API, 판다스로 볼린저 밴드 지표(%b, Bandwidth) 구하기
볼린저 밴드란?
주식이나 암호화폐 거래에서 투자자들이 사용하는 보조지표는 이동평균선, 일목균형표, 볼린저 밴드 순으로 활용 빈도가 높습니다. 볼린저 밴드(Bollinger band)는 주가의 변동이 정규분포를 따른다고 가정해서 만든 것입니다. 시계열 그래프에서 현재 가격의 위아래에 밴드를 표시해서 현재 가격이 상대적으로 높은 상태인지, 낮은 상태인지를 알 수 있습니다.
볼린저 밴드 지표 : %b
주식이나 코인 가격이 볼린저 밴드의 어느 위치에 있는지를 나타내는 지표가 %b입니다. %b가 1일 때는 상단 밴드, 0.5일 때 중간, 0일 때 하단 밴드에 위치합니다.
%b =(종가 – 하단 볼린저 밴드)/(상단 볼린저 밴드 – 하단 볼린저 밴드)
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()
[ 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