momentum

jh_k·2023년 2월 5일
0

투자전략

목록 보기
3/7

절대모멘텀

  • 파일 로드
  • 파생변수 '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)
profile
Just Enjoy Yourself

0개의 댓글