본문 바로가기
미래걱정/주식

Finterstellar (핀터스텔라)를 활용한 3년간 S&P500에 대한 단기투자 백테스팅

by JHistory_ 2023. 2. 13.
반응형

 

 
미국 주식으로 시작하는 슬기로운 퀀트투자
이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀트투자 전략을 만들기 위해서는 유명한 전략들이 어떻게 만들어졌는지 개념을 이해하고, 어떻게 구현됐는지 기본기를 따라 하며 배워야 한다. 다만 투자 대가들의 전략을 소개한 책은 쉽게 찾아볼 수 있지만, 그 전략을 구현한 기술적인 방법을 담은 책은 매우 찾아보기 어렵다. 또한 퀀트투자 전략을 공부하기 위해서는 코딩이나 수학 등 부가적인 배경지식이 필요하다. 이 책은 이미 잘 알려진 투자 대가들의 전략을 소개하고 자신의 컴퓨터에서 이 전략을 구현해보며 응용하는 방법을 알려준다. 책을 따라 미국 주식 퀀트투자 과정을 배우고 나면 자신만의 투자 전략을 스스로 개발할 수 있을 것이다.
저자
김용환, Yubin Kim
출판
한빛미디어
출판일
2021.09.30

https://jhhistory.tistory.com/25

 

슬기로운 퀀트투자 3장 - 단기 투자의 기술 편 (보조지표를 통한 백테스팅)

미국 주식으로 시작하는 슬기로운 퀀트투자 이 책은 서학개미를 위한 미국 주식 퀀트투자 입문+실습서이다. 퀀트투자는 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법이다. 퀀

jhhistory.tistory.com

 

해당 책과 3장을 실습해보면서 항상 의문을 가졌던 RSI와 stochastic slow가 과매도 구간이 중첩될 때 매수하고 과매도 구간일 때 매도하게되면 정말 괜찮은 결과를 가질까? 라고 생각해본적이 있는데, 위의 내용을 응용해서 한 번 셀프 백테스팅 프로그램을 만들어보겠다. 

symbol = 'SPY'
df=fs.get_price(symbol, start_date='2020-01-01', end_date='2022-12-31')
fs.draw_chart(df,right=symbol)

S&P500을 추종하는 SPY라는 ETF의 주가이다. 시고저종을 모두 불러오고 stochastic 계산과 rsi 계산을 함께 수행한다.

df=fs.get_ohlc(symbol,start_date='2020-01-01',end_date='2022-12-31')
fs.stochastic(df,symbol,n=9,m=5,t=5)
fs.rsi(df,w=14)
df.tail()

그 다음에 df에 's1'에 스토캐스틱 시그널을 집어넣고 's2'에 rsi 시그널을 집어넣고 백테스트를 수행하면 아래와 같다.

df['s1']=fs.indicator_to_signal(df,factor='slow_k',buy=20,sell=80)
df['s2']=fs.indicator_to_signal(df,factor='rsi',buy=30,sell=70)
fs.combine_signal_and(df,'s1','s2')

fs.position(df)
fs.evaluate(df,cost=0.0025)
fs.performance(df,rf_rate=0.01)
fs.draw_trade_results(df)

 s1에다가 Stochastic 20에서 매수 80에서 매도를 깔고 s2에다가 RSI 30에서 매수 70에서 매도를 깔고 이를 and조건으로 섞었다. 

와우 이게 하락장을 맞이 할 때마다 뼈를 못추수리고 개미가 보이는 그대로의 행동패턴을 보이게 되었다. 떨어질 때 팔고 올라갈 때 못사고 고점에서 샀다가 또 손해보고...

 

 or로 바꾸어보면

df['s1']=fs.indicator_to_signal(df,factor='slow_k',buy=20,sell=80)
df['s2']=fs.indicator_to_signal(df,factor='rsi',buy=30,sell=70)
fs.combine_signal_or(df,'s1','s2')

fs.position(df)
fs.evaluate(df,cost=0.0025)
fs.performance(df,rf_rate=0.01)
fs.draw_trade_results(df)

 상승장 때는적당히 먹었는데, 하락장에서 뼈를 못추린다. 

 

이번엔 모멘텀 전략 느낌으로 오히려 과매수때 사서 과매수가 풀리면 파는 전략으로 바꿔봤다.

df['s1']=fs.indicator_to_signal(df,factor='slow_k',buy=80,sell=50)
df['s2']=fs.indicator_to_signal(df,factor='rsi',buy=70,sell=50)
fs.combine_signal_or(df,'s1','s2')

fs.position(df)
fs.evaluate(df,cost=0.0025)
fs.performance(df,rf_rate=0.01)
fs.draw_trade_results(df)

 그랬더니 수익률은 적당히 개선되었고, 벤치마크 MDD도 적당히 방어가 되는데, 벤치마크 수익률보다는 좋지 않다. 다만, MDD를 -12.17%까지 방어했다. 역시 떨어지는 칼날을 잡는게 더 어려운 것 같다. 

 이걸 and로 한 번 바꿔보면

전략이 쓰레기가 되었다. 

 


교훈 : 지수를 샀으면 들고 그냥 가만히 있자.

반응형

댓글