퀀트

32. 볼린저 밴드를 이용한 투자 전략 : 상한선 위에서 매수 또는 하한선 아래에서 매수하는 경우

만 기 2023. 1. 29. 16:20

 

볼린저 밴드를 이용한 투자전략 : 상한선 위에서 매수 또는 하한선 아래에서 매수하는 경우

 

볼린저 밴드 상한선, 하한선 데이터 만들기

# 상한선 = 20일 이평선 값 + ( 20일 동안의 주가 표준편차 값 ) * 2
d['bbh_20d_2std'] = d['adj_close_sma20d'] + 2*d['adj_close'].rolling(20, axis=1).std()

# 하한선 = 20일 이평선 값 - ( 20일 동안의 주가 표준편차 값 ) * 2
d['bbl_20d_2std'] = d['adj_close_sma20d'] - 2*d['adj_close'].rolling(20, axis=1).std()

 

 

조건에 해당하는 종목과 날짜 필터링

# 폭이 좁을 때, 상한선 돌파한 경우 종목과 날짜
over_narrow_bbh_midxs = master_midxs[((d['bbw_20d_4std__adj_close'] < 0.1) & (d['adj_close'] > d['bbh_20d_2std'])).stack(dropna=False)]
# 폭이 좁을 때, 하한선 아래의 경우 종목과 날짜
under_narrow_bbl_midxs = master_midxs[((d['bbw_20d_4std__adj_close'] < 0.1) & (d['adj_close'] < d['bbl_20d_2std'])).stack(dropna=False)]


# 폭이 넓을 때, 상한선 돌파한 경우 종목과 날짜
over_wide_bbh_midxs = master_midxs[((d['bbw_20d_4std__adj_close'] > 0.25) & (d['adj_close'] > d['bbh_20d_2std'])).stack(dropna=False)]
# 폭이 넓을 때, 하한선 아래의 경우 종목과 날짜
under_wide_bbl_midxs = master_midxs[((d['bbw_20d_4std__adj_close'] > 0.25) & (d['adj_close'] < d['bbl_20d_2std'])).stack(dropna=False)]

 

 

기간별 수익률 데이터 저장

exp['ret_over_narrow_bbh'] = get_all_return_df_by(d, over_narrow_bbh_midxs)
exp['ret_under_narrow_bbl'] = get_all_return_df_by(d, under_narrow_bbl_midxs)

exp['ret_over_wide_bbh'] = get_all_return_df_by(d, over_wide_bbh_midxs)
exp['ret_under_wide_bbl'] = get_all_return_df_by(d, under_wide_bbl_midxs)

 

 

통계, 그래프 보기

describe_and_aggperf(exp['ret_under_wide_bbl'])

draw_meanmed_boxplot(exp['ret_under_wide_bbl'], _title='볼린저밴드 폭이 넓을 때,  주가가 하한선 아래에 위치한 경우,  보유기간별 수익률 통계 (%)');