본문 바로가기
systrader79 칼럼/실전 투자 전략

실전 투자 전략 (17) - 자산군 비중 배분 X 평균 모멘텀 스코어 배분 (파이썬 코드)

by systrader79 2016. 10. 2.
728x90
반응형
728x170

 본 블로그에서 핵심적으로 소개한 모멘텀 기반의 포트폴리오 전략인 자산군 평균 모멘텀 스코어 배분 전략(클릭) 을 파이썬 코드로 변환해보았습니다.   

  파이썬은 R과 함께 데이터 분석에 가장 널리 쓰이는 프로그래밍 언어로서, R이 통계나 계산에 특화된 반면 파이썬은 범용 프로그래밍 언어로서 데이터 분석 이외의 다양한 분야에도 적용이 가능하여 최근 전세계적으로 폭발적인 인기를 끌고 있습니다. 

 엑셀로도 충분히 시뮬레이션이 가능한 단순한 로직이지만, 투자 종목을 변경하거나 업데이트할 때마다 새로 데이터를 다운받아야 하는 단점이 있어, 야후 파이낸스에서 종목을 다운받아 시뮬레이션하는 코드를 만들어 보았습니다. 

 파이썬 독학 초보이고, 데이터 분석에 이용되는 pandas 라이브러리도 사용도 익숙치 않아 코드가 많이 어설프지만, 필요한 분에게 조금이나마 도움이 되었으면 하는 바램입니다. 

 

파이썬 코드 

import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

import pandas_datareader.data as web


# EFA : iShares MSCI EAFE ETF

# IWD : iShares Russell 1000 Value ETF

# IWF : iShares Russell 1000 Growth ETF

# IJH : iShares Core S&P Mid-Cap ETF

# IWM : iShares Russell 2000 ETF

# EWJ : iShares MSCI Japan ETF

# LQD : iShares iBoxx $ Investment Grade Corporate Bond ETF


주식리스트 = ['SPY', 'EFA', 'IWD', 'IWF', 'IJH', 'IWM', 'EWJ']

채권리스트 = ['IEF', 'TLT', 'LQD']

현금리스트 = ['SHY']

전체리스트 = 주식리스트 + 채권리스트 + 현금리스트


주식개수 = 7

채권개수 = 3

현금개수 = 1

모멘텀스코어역치 = 0


월말지수 = pd.DataFrame()

월간수익률 = pd.DataFrame()

평균모멘텀 = pd.DataFrame()

평균모멘텀스코어 = pd.DataFrame()

투자비중 = pd.DataFrame()


class 모멘텀시뮬:

    def __init__(self, 종목, 시작일):

        self.종목 = 종목

        self.시작일 = 시작일


    def 월말지수(self):

        수정종가 = web.DataReader(name=self.종목, data_source='yahoo', start=self.시작일)['Adj Close']

        수정수익률 = 수정종가 / 수정종가[0]

        return 수정수익률.resample('M').last()


    def 월간수익률(self):

        return self.월말지수() / self.월말지수().shift(1)


    def 평균모멘텀(self):

        초기값 = 0

        for i in range(1, 13):

            초기값 = self.월말지수() / self.월말지수().shift(i) + 초기값

        return 초기값 / 12


    def 평균모멘텀스코어(self):

        a = self.평균모멘텀().copy()

        초기값 = 0

        for i in range(1, 13):

            초기값 = np.where(self.월말지수() / self.월말지수().shift(i) > 1, 1, 0) + 초기값

        모멘텀스코어 = np.where(초기값 / 12 > 모멘텀스코어역치, 초기값 / 12, 0)

        a[a > -1] = 모멘텀스코어

        return a


    def 평균모멘텀스코이(self):

        초기값 = 0

        for i in range(1, 13):

            초기값 = np.where(self.월말지수().values / self.월말지수().shift(i).values > 1, 1, 0) + 초기값

        모멘텀스코어 = np.where(초기값 / 12 >= 모멘텀스코어역치, 초기값 / 12, 0)

        return pd.DataFrame(모멘텀스코어, columns=self.평균모멘텀().columns, index=self.평균모멘텀().index)



for i in 전체리스트:

    a = 모멘텀시뮬(i, '2000-01-01')

    월말지수[i] = a.월말지수()

    월간수익률[i] = a.월간수익률()

    평균모멘텀[i] = a.평균모멘텀()

    평균모멘텀스코어[i] = a.평균모멘텀스코어()


주식모멘텀순위 = 평균모멘텀.iloc[:, 0: len(주식리스트)].rank(1, ascending=0)

채권모멘텀순위 = 평균모멘텀.iloc[:, len(주식리스트): len(주식리스트) + len(채권리스트)].rank(1, ascending=0)

현금모멘텀순위 = 평균모멘텀.iloc[:, len(주식리스트) + len(채권리스트): len(주식리스트) + len(채권리스트) + len(현금리스트)].rank(1, ascending=0)


주식모멘텀비중 = pd.DataFrame(np.where(주식모멘텀순위 < 주식개수 + 1, 1 / 주식개수, 0))

채권모멘텀비중 = pd.DataFrame(np.where(채권모멘텀순위 < 채권개수 + 1, 1 / 채권개수, 0))

현금모멘텀비중 = pd.DataFrame(np.where(현금모멘텀순위 < 주식개수 + 1, 1 / 현금개수, 0))


투자비중 = pd.concat([주식모멘텀비중, 채권모멘텀비중, 현금모멘텀비중], axis=1)

투자비중.columns = 월말지수.columns

투자비중.index = 월말지수.index

최종수익률 = pd.DataFrame(월간수익률.values * 투자비중.shift(1).values * 평균모멘텀스코어.shift(1).values).sum(axis=1) / pd.DataFrame(투자비중.shift(1).values * 평균모멘텀스코어.shift(1).values).sum(axis=1)

최종수익률 = pd.DataFrame(최종수익률.cumprod())

최종수익률.columns = ['수익']

최종수익률.index = 월말지수.index


k = len(월말지수.index)-len(월말지수.dropna().index)+12


월말지수1 = 월말지수.drop(월말지수.index[0:k])

최종수익률1 = 최종수익률.drop(최종수익률.index[0:k])


차트 = pd.concat([월말지수1, 최종수익률1], axis=1)

차트.index = 최종수익률1.index

차트.columns = 전체리스트+['수익']


차트 = 차트.div(차트.ix[0])

차트.plot()

plt.show()


file=pd.ExcelWriter('N:\\모멘텀255.xlsx')

월말지수.to_excel(file,sheet_name='월말지수')

월간수익률.to_excel(file,sheet_name='월간수익률')

평균모멘텀.to_excel(file,sheet_name='평균모멘텀')

평균모멘텀스코어.to_excel(file,sheet_name='평균모멘텀스코어')

투자비중.to_excel(file,sheet_name='투자비중')

최종수익률.to_excel(file,sheet_name='최종수익률')

차트.to_excel(file, sheet_name='차트')

file.save()


나가시기 전에 블로그 글 맨 하단의 배너 광고를 한 번만 클릭해주시면 더 좋은 콘텐츠를 만드는데 큰 도움이 됩니다~ 감사합니다! >


1. 네이버 카페 '실전주식투자 연구소' (클릭) 으로 오시면, 본 블로그의 모든 내용을 순서대로 확인하실 수 있고, 다양한 실전 투자 정보도 얻을 수 있습니다~


2. 'systrader79의 주식 단기 매매 전략 온라인 강좌'가 뉴지스탁에서 진행 중입니다!

   개별 주식을 이용한 단기 매매 기법, 뉴지스탁을 통한 완전 자동 투자 매매 구현에 관한 폭넓         은 노하우를 다루고 있으니, 많은 성원 부탁드립니다~

   첫 번째 강의는 수강 신청없이 무료로 시청 가능합니다 (아래 링크 클릭 --> 1번 방송 클릭)

     강의 소개 (클릭)

     * 강의 바로가기 (클릭)



3. 여러분의 인생이 걸린 너무나도 중요한 소식! --- > 여기를 클릭하세요!





728x90
반응형
그리드형

댓글