4-1. [트레이딩 전략 구현] 볼린저 밴드 지표

2021. 6. 13. 00:19Financial Analysis

볼린저 밴드

볼린저 밴드는 기술적 분석에서 사용되는 지표 중 하나로, 20일간의 이동 평균선과 이를 기준으로 형성된 상단선과

 

하단선으로 구성되어 있다. 주가의 상대적인 고점, 저점을 판단하는 기준으로 사용된다. 

 

- 상단 볼린저 밴드 : 중간 볼린저 밴드 + 2*표준편차

- 중간 볼린저 밴드 : 20일간 이동 평균선

- 하단 볼린저 밴드 : 중간 볼린저 밴드 - 2*표준편차

 

해당 프로젝트에서는 볼린저 밴드의 기준을 20일, 2배로 설정하였다. 

 

이를 구현해보자. 

import matplotlib.pyplot as plt
from Investar.MarketDB import MarketDB

class bollingerBand:

    def get_bollinger_band(self, company, start_date):
    ### 회사명과 시작일을 인수로 받아 볼리저 밴드를 계산한다.

    def show_bollinger_chart(self, df, company):
    ### 계산된 볼린저 밴드 데이터프레임을 그래프로 나타낸다.

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 = df[19:]
        self.show_bollinger_chart(df, company)

먼저 company의 데이터를 DB에서 추출하여 df에 저장한다. 

 

df에 총 MA20, stddev, upper, lower 컬럼이 추가되는데, 이동평균선인 MA20은 rolling 함수를 이용하여 

 

20일 간의 평균을 구한다. stddev 역시 마찬가지로 20일간의 표준편차를 구한다. 

 

상단 볼린저 밴드와 하단 볼린저 밴드는 이동평균선에서 표준편차의 2배를 더하거나 뺀다. 

 

rolling 함수에서 window를 20으로 설정했기 때문에 데이터프레임의 20번째 행(19 index) 이전의 값은 버린다. 

    def show_bollinger_chart(self, df, company):
        plt.figure(figsize=(9,5))
        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')
        str = company + ' Bollinger Band (20 Day, 2 Std)'
        plt.title(str)
        plt.show()

show_bollinger_chart 함수에서는 볼린저 밴드 그래프를 출력한다.

 >>> bB = bollingerBand()
 >>> bB.get_bollinger_band('S-Oil', '2019,12,16')

볼린저 밴드