[KRISS] Bollinger Band

min·2023년 5월 24일
post-thumbnail

퀀트 학회에서 진행했던 볼린저 밴드 관련 프로젝트에 대해 기록을 남겨보고자한다.
볼린저밴드는 가격이 이동평균선(Simple Moving Average)을 중심으로 상한선 및 하한선 이내에서 등락을 반복한다는 개념에 기반한 지표로, 상한선 및 하한선은 각각 중심선을 기준으로 +- 2std로 전제한다.

Hypothesis
종목 : 셀트리온(068270), 맥쿼리인프라(088980)
셀트리온은 높은 변동성을 가진 종목, 맥쿼리는 낮은 변동성을 가진 종목으로 보고 테스팅
기간 : 2022.04.01 - 2022.06.30

  1. 관련 패키지 및 라이브러리 import
import pandas as pd
import FinanceDataReader as fdr
import matplotlib.pyplot as plt
import talib as ta
  1. 종목 데이터 수집
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일로 지정
  1. Bollinger Bands Data Calculation - MA20, std, upper, lower, %b
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
  1. Plot Bollinger Chart with %b
  • %b : 주가가 볼린저밴드 위 어디에 위치해있는지 알려주는 지표 ( 하단밴드 : 0 , 상단밴드 : 1 )

  1. Golden Cross & Death Cross
  • 장기 이동 평균선과 단기 이동 평균선이 교차하는 부분을 뜻한다
    Golden Cross : 단기 이동 평균선이 중장기 이동 평균선을 아래에서 위로 뚫고 올라가는 현상으로, 강세신호로 받아들인다.
    Death Cross : 단기 이동 평균선이 중장기 이동 평균선을 위에서 아래로 뚫고 내려가는 현상으로, 약세신호로 받아들인다.

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

0개의 댓글