
퀀트 학회에서 진행했던 볼린저 밴드 관련 프로젝트에 대해 기록을 남겨보고자한다.
볼린저밴드는 가격이 이동평균선(Simple Moving Average)을 중심으로 상한선 및 하한선 이내에서 등락을 반복한다는 개념에 기반한 지표로, 상한선 및 하한선은 각각 중심선을 기준으로 +- 2std로 전제한다.
Hypothesis
종목 : 셀트리온(068270), 맥쿼리인프라(088980)
셀트리온은 높은 변동성을 가진 종목, 맥쿼리는 낮은 변동성을 가진 종목으로 보고 테스팅
기간 : 2022.04.01 - 2022.06.30
import pandas as pd
import FinanceDataReader as fdr
import matplotlib.pyplot as plt
import talib as ta
df_c = fdr.DataReader(symbol='068270', start='2021-03-04', end='2022-06-30')
df_m = fdr.DataReader(symbol='088980', start='2021-03-04', end='2022-06-30') # 처음 20일은 종가가 이동평균 산출에 쓰이므로 4월 1일부터의 데이터를 보고싶으면 20일 전인 3월 4일로 지정
df_c['MA20'] = df_c['Close'].rolling(window=20).mean() # 20개 종가를 사용해 20일 이동평균 산출
df_c['std'] = df_c['Close'].rolling(window=20).std() # 20개 종가를 이용해 20일 표준편차 산출
df_c['Upper'] = df_c['MA20'] + (df_c['std'] * 2) # 상단 볼린저 밴드
df_c['Lower'] = df_c['MA20'] - (df_c['std'] * 2) # 하단 볼린저 밴드
df_c['%b'] = (df_c['Close'] - df_c['Lower']) / (df_c['Upper'] - df_c['Lower']) # %b 지표 -> 현재 주가가 밴드를 기준으로 어디쯤에 있는지를 수치로 표현
df_c = df_c[19:] # 19번째 행까지는 NaN이므로 값이 있는 20번째 행부터 사용
df_c




추가적으로 간단하게 골든크로스와 데스크로스를 사용한 투자기법을 통해 백테스팅 또한 진행해보았다. (관심이 있다면 첨부된 링크를 참고바란다) 결론적으로 말해보자면, 볼린저밴드의 가장 큰 문제점은 이 지표를 만든 존 볼린저가 언급하였던 듯이 후행성 지표라는 점이다. 백테스팅용으로는 용이하나, 실제 투자에 있어서 사용하기에는 time lagging 문제가 크다고 사려되므로 RSI같은 모멘텀 지표들과 함께 사용하는 것이 권장된다.