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
반응형
'문송충의 코딩하기 > 퀀트 투자 스터디' 카테고리의 다른 글
[동퀀트] VAA(Vigilant Asset Allocation) 동적자산배분 파이썬으로 백테스팅 (1) | 2022.02.02 |
---|---|
MSFT 마이크로소프트 지난 5년간 주당배당금 연간 복리 성장률을 구해보자 (0) | 2022.01.25 |
파이썬으로 라오어 무한매수법 백테스팅, 이렇게 하는게 맞나? (0) | 2022.01.14 |
파이썬으로 포트폴리오 자산별 상관관계 구하기 (0) | 2022.01.14 |
파이썬으로 업비트 내 자산 잔고 조회하기 with pyupbit (0) | 2022.01.13 |
댓글