본문 바로가기
파이썬/주식

Python으로 모멘텀 전략 구현, Python Momentum Strategy

by 행복론자 2019. 12. 1.

모멘텀 전략이란 최근 수익률이 좋았던 주식을 사는 전략입니다.

지금까지 잘 올라왔던 주식이 앞으로도 올라갈 것이라는 기대로 "비싸게 사서 더 비싸게 판다"는 철학을 가지고 있습니다.

 

회귀분석 계수 R^2값과 90일간의 지수 회귀 기울기를 곱한 값으로 모멘텀을 구합니다.

 

기업들의 모멘텀을 구하기 위해서 기업별/일자별 종가 데이터를 생성하는 작업을 해보갰습니다.

 

1.종가 데이터 저장하기

import pandas as pd
import FinanceDataReader as fdr
from time import time
from concurrent.futures import ProcessPoolExecutor

df_krx = fdr.StockListing('KRX')
codes = df_krx['Symbol']

def getPrice(code):
    df_price = fdr.DataReader(code, '2017-01-01', '2019-11-29') # 2017-01-01부터 2019-11-29일자 종가
    df_price = df_price[['Close']] # 당일 고가, 저가 등 다른 데이터 제외하고 종가만 저장
    df_price.columns = [code] # column을 code로 변경
    return df_price

if __name__ == '__main__':
    start = time()
    
    pool = ProcessPoolExecutor(max_workers=32)
    results = list(pool.map(getPrice,codes))
    stocks = pd.concat(results, axis=1)

    end = time()
    print(end-start)
    stocks.to_excel('datas.xlsx')

 

 

df_krx에는 한국거래소에서 취급하는 종목코드 및 기타 정보들이 들어가고 그 중 Symbol 즉 코드값만 뽑아냅니다.

이 코드를 가지고 다시 DataReader를 통해 종가를 가져와 엑셀에 저장하는 작업을 합니다.

concurrent 모듈의 ProcessPoolExecutor를 사용하는 이유는 2천개가 넘는 종목의 약 3년치 정보를 가져오는 일이 만만한 일은 아니라서 병렬처리를 했습니다.

위 코드를 수행하면 다음과 같은 모양의  datas.xlsx 엑셀 파일이 생깁니다.

Pycharm에서 실행해보면 생성되는데도 시간이 조금 걸립니다.

 

 

이렇게 기초 데이터를 만들어두고 모멘텀을 계산해보겠습니다.

 

2.모멘텀 계산하기 

import pandas as pd
import matplotlib.pyplot as plt
import sys
from scipy.stats import linregress
import numpy as np
from time import time

fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)

stocks = pd.read_excel('datas.xlsx',index_col=0) #아까 저장한 datas.xlsx을 읽어옴
# stocks = stocks.iloc[:, :5] #2천여개를 가져오기 빡세면 5개만 추출 
codes = stocks.columns

start = time()
def momentum(closes):
    returns = np.log(closes)
    x = np.arange(len(returns))
    slope, _, rvalue, _, _ = linregress(x, returns)
    return ((1 + slope) ** 252) * (rvalue ** 2)  # annualize slope and multiply by R^2

momentums = stocks.copy(deep=True)

for code in codes:
    momentums[code] = stocks[code].rolling(90).apply(momentum) #각 종목마다 모멘텀 구하는 함수적용

bests = momentums.max().sort_values(ascending=False).index[:5] # 모멘텀 값이 가장큰 상위 5개 종목을 bests에 넣음  

for best in bests:
    end = momentums[best].index.get_loc(momentums[best].idxmax()) # 모멘텀이 가장 높은 시점 
    
    if end - 90 < 0 : #모멘텀이 최고인 시점의 90일 이전이 최초 설정한 2017-01-01보다 이전이면 그냥 생략해버림 
        continue

    rets = np.log(stocks[best].iloc[end - 90 : end]) 
    momentum_point = stocks[best].index[end].strftime("%Y/%m/%d") # 모멘텀이 최고인 시점을 label에 표현하기 위함       

    x = np.arange(len(rets))
    slope, intercept, r_value, p_value, std_err = linregress(x, rets) # 회귀함수 

    try:
        plt.plot(np.arange(180), stocks[best][end-90:end+90], label=[best,momentum_point]) # 모멘텀이 최고인 시점의 90일 전후 종가          
        plt.plot(x, np.e ** (intercept + slope*x)) # 회귀 함수의 결과를 그림 
    except:
        continue

ax.legend(loc=5)
plt.show()
end = time()
print(end - start)

 

 

3.결과 

위 코드를 수행하면 모멘텀이 가장 큰 기업 5개를 그려냅니다.

 

 

다들 소싯적에 많이들 올랐었네요.

x축은 모멘텀이 최고인 시점(end)을 기점으로 0-180일을 나타나내는 숫자들로써 같은 x축에 있더라도 서로 같은 날의 종가를 의미하지는 않습니다.

 

또 잘 올라갔다가 고꾸라질 경우도 많습니다.

 

 

4.기타 자료 

마지막으로 모멘텀을 이용한 저평가주를 찾는 유튜브 링크를 첨부합니다.

https://www.youtube.com/watch?v=BkmTYojCcrA

 

 

 

유튜브 요약

(유튜브는 모멘텀 전략 + 가치평가를 통한 기업 고르기 전략 )

 

 

5.포스팅 작성에 참고자료

https://teddykoker.com/2019/05/momentum-strategy-from-stocks-on-the-move-in-python/

 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글