절대모멘텀
- 파일 로드
- 파생변수 'STD-YM' 생성 -> Date 컬럼의 값을 년-월 추출 대입
- 년,월 별 마지막날 month_last_dt 데이터프레임 삽입
- 전월의 종가의 값을 가지는 파생변수 생성
- 전년도의 종가의 값을 가지는 파생변수 생성
- 전월, 전년도의 종가를 가지고 거래내역 생성
- 수익율 계산
import pandas as pd
import numpy as np
df = pd.read_csv("../csv/SPY.csv")
## 새로운 파생변수 STD-YM 생성
## Date 컬럼을 기준으로 년-월 추출해서 파생변수 대입
## Date 컬럼을 데이터형을 datetime 변경 ( pd.to_datetime() )
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')
## STD-YM 컬럼을 만들어서 Date컬럼에서 년(4자리)-월 추출
df['STD-YM'] = df['Date'].dt.strftime("%Y-%m")
month_last_df = pd.DataFrame()
month_list = df['STD-YM'].unique()
for i in month_list:
last_df = df[df['STD-YM'] == i].tail(1)
month_last_df = pd.concat([month_last_df, last_df])
month_last_df.info()
## 'Date' 컬럼을 인덱스 변환
month_last_df.set_index(['Date'], inplace=True)
## month_last_df 파생변수 2개 생성
## 'BF_1M' 전월의 종가(Adj Close)의 값
## 'BF_12M' 전년도의 종가(Adj Close)의 값
## NaN이 나온다면 0으로 대체
month_last_df["BF_1M"] = month_last_df.shift(1)['Adj Close'].fillna(0)
month_last_df["BF_12M"] = month_last_df.shift(12)['Adj Close'].fillna(0)
df.set_index(['Date'], inplace=True)
## 거래내역 추가
## 구매 조건 -> 전월 종가 / 전년도 종가 - 1의 값이 0보다 크고 무한대가 아닌 경우
df['trade'] = ""
for i in month_last_df.index:
signal = ""
# 절대 모멘텀 계산
momentum_index = month_last_df.loc[i, "BF_1M"] / month_last_df.loc[i, "BF_12M"] - 1
# print(momentum_index)
# 절대 모멘텀 지표에 따라서 True / False 구분
flag = True if((momentum_index > 0) and (momentum_index != np.inf)
and (momentum_index != -np.inf)) else False
if flag:
signal = 'buy'
print("날짜 :", i, '모멘텀 인덱스 :', momentum_index,
"flag :", flag, 'signal :', signal)
df.loc[i, "trade"] = signal
df['trade'].value_counts()
rtn = 1.0
df['return'] = 1
buy = 0
sell = 0
for i in df.index:
##구매한 날짜를 체크 : 현재 행의 trade = 'buy' 전 행의 trade = ""인 경우
if df.loc[i, 'trade'] == 'buy' and df.shift(1).loc[i, 'trade'] == "":
buy = df.loc[i, 'Adj Close']
print("구매일 :", i, "구매 가격 :", buy)
elif df.loc[i, 'trade'] == "" and df.shift(1).loc[i, 'trade'] == 'buy':
sell = df.loc[i, 'Adj Close']
rtn = (sell - buy) / buy + 1
df.loc[i, 'return'] = rtn
print("판매일 : ", i, "판매 가격 :", sell, "수익율 :", rtn)
if df.loc[i, 'trade'] == "":
buy = 0
sell = 0
acc_rtn = 1
for i in df.index:
rtn = df.loc[i, 'return']
acc_rtn *= rtn
df.loc[i, 'acc_rtn'] = acc_rtn
print('누적 수익율 :', acc_rtn)