ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬/백테스트] 할로윈 투자 전략
    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일부터..

     

    참고

    Financial-data-reader

    timedelta(months=1) 시각에 달 빼고 더하기 연산

    안정적이고 높은 수익을 올리는 seasonality 전략에 대한 고찰

    반응형
Designed by Tistory.