-
[파이썬/백테스트] 할로윈 투자 전략Python/파이썬과 주식 2021. 5. 25. 07:19반응형
* 이 글은 저의 개인적인 정리물일 뿐입니다.
* 투자 권유, 투자 참고의 목적이 아닙니다.11월에 주식을 사서, 다음 해 4월에 매도하는 전략입니다.
계절성(시즈널리티, seasonality) 투자 전략이라고도 합니다.KOSPI 지수를 기준으로 백테스트 해보겠습니다.
단순 보유시 수익률
# 단순 보유 2000.11~2021.04 import FinanceDataReader as fdr kospi = fdr.DataReader('KS11', '2000') start_value = kospi.loc['2000-01'].iloc[0]['Open'] end_value = kospi.loc['2021-04'].iloc[-1]['Close'] total_earnings_rate = end_value / start_value print(total_earnings_rate) # 3.0611379615493086
2000.01~2021.04 동안 수익률은 약 3.06 배입니다.
연이율(단리): 10.05 %
연이율(복리): 5.61 %
(슬리피지 제외)할로윈 투자 수익률
# 할로윈 투자 전략 2000.11~2021.04 import FinanceDataReader as fdr kospi = fdr.DataReader('KS11', '2000') total_earnings_rate = 1 for year in range(2000, 2021): buy_month = f'{year}-11' sell_month = f'{year + 1}-04' buy_price = kospi.loc[buy_month].iloc[0]['Open'] sell_price = kospi.loc[sell_month].iloc[-1]['Close'] earnings_rate = sell_price / buy_price total_earnings_rate *= earnings_rate print(total_earnings_rate) # 6.18585306815823
2000.11~2021.04 동안 수익률은 6.19배 정도가 나옵니다.
연이율(단리): 25.29 %
연이율(복리): 9.29 %
(슬리피지 제외)단순 보유보다 2배 정도 높은 수익률을 보여줍니다. ㄷㄷㄷ
할로윈 투자 시 가장 수익률이 높았던 / 낮았던 구간
from datetime import date import FinanceDataReader as Fdr from dateutil.relativedelta import relativedelta def trick_or_treat(df, start_year, end_year, start_month, term): total_earning_ratio = 1.0 for year in range(start_year, end_year): buy_month = str(date(year, start_month, 1))[:7] sell_month = str(date(year, start_month, 1) + relativedelta(months=term))[:7] buy_value = df.loc[buy_month].iloc[0]['Open'] sell_value = df.loc[sell_month].iloc[-1]['Close'] earning_ratio = sell_value / buy_value total_earning_ratio *= earning_ratio # print(f'수익률:{total_earning_ratio}, 시작:{start_month}월, 종료:{sell_month}월 기간:{term + 1}개월') return total_earning_ratio def main(): start_year = 2000 end_year = 2020 kospi = Fdr.DataReader('KS11', str(start_year)) earning_ratio_max, term_max, start_month_max = 0, 0, 0 earning_ratio_min, term_min, start_month_min = float('inf'), float('inf'), float('inf') for term in range(0, 12): for start_month in range(1, 13): earning_ratio = trick_or_treat(kospi, start_year, end_year, start_month, term) if earning_ratio > earning_ratio_max: earning_ratio_max, term_max, start_month_max = earning_ratio, term, start_month if earning_ratio < earning_ratio_min: earning_ratio_min, term_min, start_month_min = earning_ratio, term, start_month print(f'최고수익률: {earning_ratio_max * 100:0.2f}%') print(f'시작: {start_month_max}월, 기간: {term_max + 1}개월') print(f'최저수익률: {earning_ratio_min * 100:0.2f}%') print(f'시작: {start_month_min}월, 기간: {term_min + 1}개월') main()
2000-01-01부터
2020-11-30까지
백테스트를 해보았습니다.최고수익률: 498.29%
시작월: 11, 투자기간: 11최저수익률: 54%
시작월: 5, 투자기간: 6코로나 영향을 제외하기 위해
2000-01-01부터
2019-11-30까지
백테스트를 해보았습니다.최고수익률: 478.89%
시작월: 11, 투자기간: 6최저수익률: 57.05%
시작월: 5, 투자기간: 6코로나영향을 제외해도
수익률에는 큰 차이가 없었고,
시작월은 11월로 변하지 않았습니다.결론
주식은 11월 1일부터..
참고
반응형