4-2. [트레이딩 전략 구현] 볼린저 밴드 지표 : %b, 밴드폭(bandwidth)
2021. 6. 13. 02:59ㆍFinancial Analysis
%b
볼린저 밴드 지표와 함께 사용되는 유용한 지표 중 하나가 %b이다.
%B quantifies a security's price relative to the upper and lower Bollinger Band. There are six basic relationship levels:
- %B is below 0 when price is below the lower band
- %B equals 0 when price is at the lower band
- %B is between 0 and .50 when price is between the lower and middle band (20-day SMA)
- %B is between .50 and 1 when price is between the upper and middle band (20-day SMA)
- %B equals 1 when price is at the upper band
- %B is above 1 when price is above the upper band
%b 지표는 위에 기술된대로의 규칙을 가지고 있다.
수식으로 나타내면 다음과 같다.
%b = (종가 - 하단 볼린저 밴드) / (상단 볼린저 밴드 - 하단 볼린저 밴드)
코드로 구현해보자.
class bollingerBand:
def get_bollinger_band(self, company, start_date):
mk = MarketDB()
df = mk.get_daily_price(company, start_date)
df['MA20'] = df['close'].rolling(window=20).mean()
df['stddev'] = df['close'].rolling(window=20).std()
df['upper'] = df['MA20'] + (df['stddev'] * 2)
df['lower'] = df['MA20'] - (df['stddev'] * 2)
df['PB'] = (df['close'] - df['lower']) / (df['upper'] - df['lower'])
df = df[19:]
return df
def show_bollinger_chart(self, df, company):
plt.plot(df.index, df['close'], color='#0000ff', label='Close')
plt.plot(df.index, df['upper'], 'r--', label='Upper band')
plt.plot(df.index, df['MA20'], 'k--', label='Moving average 20')
plt.plot(df.index, df['lower'], 'c--', label='Lower Band')
plt.fill_between(df.index, df['upper'], df['lower'], color='0.9')
plt.legend(loc='best')
plt.xticks(rotation=45)
str = company + ' Bollinger Band (20 Day, 2 Std)'
plt.title(str)
def show_pb_chart(self, df):
plt.plot(df.index, df['PB'], color='b', label='%B')
plt.grid(linestyle='dotted')
plt.legend(loc='best')
plt.xticks(rotation=45)
이전 장의 코드에서 약간의 변형이 생겼다.
df['PB'] = (df['close'] - df['lower']) / (df['upper'] - df['lower'])
%b 값을 계산하여 데이터프레임의 칼럼에 추가한다.
bB = bollingerBand()
df = bB.get_bollinger_band('S-Oil', '2019,12,16')
plt.subplot(2, 1, 1)
bB.show_bollinger_chart(df,'S-Oil')
plt.subplot(2, 1, 2)
bB.show_pb_chart(df)
plt.tight_layout()
plt.show()
확실히 종가가 볼린저 밴드의 상단에 가까울수록 %b의 값이 1에 가까워지고 하단에 가까워질수록
%b값이 0에 가까워진다.
밴드폭(Bandwidth)
밴드폭(bandwidth)은 하단 ~ 상단 볼린저 밴드 사이의 폭을 의미한다. 스퀴즈를 할 경우 확인해야하는 지표이다.
수식으로 나타내면 다음과 같다.
밴드폭 = (상단 볼린저 밴드 - 하단 볼린저 밴드) / 중간 볼린저 밴드
기존 get_bollinger_band 함수에 다음 코드를 추가하자.
df['bandwidth'] = (df['upper'] - df['lower']) / df['MA20'] * 100
def show_bandwidth_chart(self, df):
plt.plot(df.index, df['bandwidth'], color='m', label='bandwidth')
plt.grid(linestyle='dotted')
plt.legend(loc='best')
plt.xticks(rotation=45)
밴드폭 차트를 출력하는 함수도 구현한다.
bB = bollingerBand()
df = bB.get_bollinger_band('S-Oil', '2019,12,16')
plt.subplot(2, 1, 1)
bB.show_bollinger_chart(df,'S-Oil')
plt.subplot(2, 1, 2)
bB.show_bandwidth_chart(df)
plt.tight_layout()
plt.show()
상단 - 하단 볼린저 밴드의 거리가 멀어질수록 밴드폭 값이 증가하는 것을 확인할 수 있다.
'Financial Analysis' 카테고리의 다른 글
4-3. [트레이딩 전략 구현] 볼린저 밴드 매매 기법 : 반전 매매 기법 (0) | 2021.06.13 |
---|---|
4-2. [트레이딩 전략 구현] 볼린저 밴드 매매 기법 : 추세 추정 매매 기법 (0) | 2021.06.13 |
4-1. [트레이딩 전략 구현] 볼린저 밴드 지표 (0) | 2021.06.13 |
3-2. [트레이딩 전략 구현] 샤프 지수(Sharpe Ratio) (0) | 2021.06.12 |
3-1. [트레이딩 전략 구현] 효율적 투자선 구하기 (0) | 2021.06.12 |