본문 바로가기
문송충의 코딩하기/퀀트 투자 스터디

S&P 500 50일 이동평균선을 활용한 SPY, SH 전략 백테스팅 with Python

by 동장군님 2022. 2. 20.
728x90
반응형

 

https://www.youtube.com/watch?v=HNP3B2fn-XQ 

내가 평소 애청하는 강환국 CFA님이 S&P 500을 기준으로 한 단순 전략을 소개해줘서 파이썬으로 한번 테스트해보고자 한다. 전략은 다음과 같다.

 

- S&P500 지수가 50일 이동평균선 위일 경우 SPY 매수

- S&P500 지수가 50일 이동평균선 아래일 경우 SH 매수

(SH는 지수 반대에 베팅하는 인버스 ETF다.)

- 강환국 유튜버께서는 매매 타이밍을 소개해주지 않아서 그냥 단순하게 종가 매수 후 익일 종가에 매도하는 기준으로 백테스팅해보겠다. 

 


1. SPY, SH ETF 2010년 ~ 현재까지의 주가 데이터 가져오기

import FinanceDataReader as fdr
import pandas as pd

spy = fdr.DataReader('SPY', '2010-01-01', '2022-02-18')['Close']
sh = fdr.DataReader("SH",'2010-01-01','2022-02-18')['Close']
df=pd.concat([spy,sh],axis=1)
df.columns=['SPY','SH']

2. SPY, SH ETF 50일 이동평균선 구하기

df['SMA50']=df['SPY'].rolling(window=50).mean()
df=df[~df['SMA50'].isnull()]

S&P 500 지수를 SPY 주가로 대체하겠다.

 

3. 1000불 투자한다면 2022년 2월 18일 얻을 수 있는 최종 잔액

import math

df['buy']=df.apply(lambda x: 'SPY' if x.SPY >= x.SMA50 else 'SH',axis=1)
df['SPY_pre']=df['SPY'].shift(1)
df['SH_pre']=df['SH'].shift(1)
df['buy_pre']=df['buy'].shift(1)
df=df[~df['SPY_pre'].isnull()]


initial=10000
total=[]

for x,y,x1,y1,z in zip(df['SPY'],df['SH'],df['SPY_pre'],df['SH_pre'],df['buy_pre']):
    if z =='SPY':
        number = math.floor(initial / x1)
        profit= x * number - x1 * number
        initial += profit
    else:
        number = math.floor(initial / y1)
        profit= y * number - y1 * number
        initial += profit
        
    total.append(initial)
    
df['amount']=total
df.tail(10)

위 코드가 출력되면 현재 수익률은 아래와 같이 7445 불인 점을 확인할 수 있다. 수익보다는 손실을 기록하고 있다. 단순히 매수 후 익일 매도보다는 보유하다가 50일 이동평균선 위아래로 돌파할 때 매매를 하는 게 아닌가 싶다. 

*파이썬 코드에 문제가 있으면 말씀 부탁드린다. 

728x90
반응형

댓글