4-2. [트레이딩 전략 구현] 볼린저 밴드 지표 : %b, 밴드폭(bandwidth)

2021. 6. 13. 02:59Financial 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 차트

확실히 종가가 볼린저 밴드의 상단에 가까울수록 %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()

볼린저 밴드와 밴드폭 함수

상단 - 하단 볼린저 밴드의 거리가 멀어질수록 밴드폭 값이 증가하는 것을 확인할 수 있다.