바이낸스 API, 판다스 시계열 데이터 분석. 볼린저 밴드 지표 %b, 밴드폭(Bandwidth)

바이낸스 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

댓글 남기기