본문 바로가기
실전 투자 기법

실전 투자 전략 (24) - Modified PAA model을 이용한 절대 수익 전략 (3)

by systrader79 2016. 11. 18.
반응형

 이번 포스팅에서는 지난 2회에 걸쳐 살펴본 Modified PAA 모델의 구체적인 로직에 대해 살펴보겠습니다.

로직의 컨셉 및 구체적인 방법론에 대해서는 지난 포스팅(클릭)을 참조해주시기 바랍니다. 


1. 투자 대상 : ETF로 투자가 가능한 다양한 자산군의 index

  - 주식 (국가) : 5 종목

     한국주식 (KOSPI 200), 미국주식(S&P500), 유럽주식(Eurostoxx50), 중국주식(상해종합), 일본(토픽스)

  - 주식 (국내 섹터) : 10 종목

    국내 코스피 섹터 (에너지, 소재, 산업재, 경기 소비재, 필수소비재, 의료, 금융, IT, 통신서비스, 유틸리티)

  - 주식 팩터 (국내 스마트 베타) : 4 종목

    로우볼, 모멘텀, 컨트래리안, 퀄리티 밸류

  - 채권 (국내 장기 국고채) :1 종목

    10년 만기 국고채 총수익 지수

  - 현금 (국내 단기 국고채) 1 종목

    3년 만기 국고채 총수익 지수


2. 투자 방법

  -  Step 1

    *  현금을 제외한 나머지 총 20 종목을 대상으로 각 종목에 개별적으로 다음 트레이딩 로직을 적용

     1 단계 : 평균모멘텀스코어 분산투자전략 (현금 혼합) 적용 (클릭: 3번 전략)

              투자 자산군에 대한 현금 기본 비중은 1이나, 이 값을 낮추면 좀 더 공격적인 운용 가능

              (ex : A 자산 모멘텀 스코어 : 현금 모멘텀 스코어 = 0.8 : 1 

                    공격적인 운용 원할시 현금 비중을 줄여 0.8 : 0.5와 같은 방식으로 조절 가능함)

     2 단계 : 1 단계를 통해 발생한 수익 곡선을 하나의 종목처럼 간주, 수익곡선모멘텀을 적용

               투자 자산 비중 : 현금 비중 = 수익 곡선모멘텀 스코어 : 1 - 수익곡선 모멘텀 스코어

               (ex : A 자산 수익곡선의 평균 모멘텀 스코어가 0.8 인 경우,

                     A 자산 수익곡선 투자 비중 : 현금 비중 = 0.8 : 0.2

     * 두 단계를 거쳐 발생한 최종 수익 곡선이 우리가 기본적으로 투자하고자 하는 기본 수익 곡선이 됨

     (Modified PAA 전략에서는 투자 자산군의 가격 자체가 기본 투자 대상이 되는 것이 아니라, 이렇게 2단계로 가공한 수익 곡선이 기본 투자 대상이 됨)


  - Step 2

    * 개별 종목의 수익 곡선이 모두 완성되면 상대 모멘텀 전략 적용

    * 국가, 섹터, 팩터, 채권의 4가지 자산군을 대상으로, 각 자산군내의 최종 수익 곡선의 1~12개월 평균 모멘텀이 가장 큰 상위 n개 종목을 선정 (ex : 국가 5 종목중 모멘텀 상위 3개 선정, 섹터 10개 중 5개 선정, 팩터 4종목중 2개 선정, 채권은 1개이므로 1개 선정)

    * 각 자산 내에서 선정된 n개 종목을 대상, 동일 비중 포트폴리오 구성 --> 자산군 대표 모멘텀 포트폴리오

   (ex : 국가 ---> 모멘텀 상위 3종목 동일 비중 포트폴리오, 섹터 ---> 모멘텀 상위 5종목 동일 비중 포트폴리오..)


 - Step 3

    * Step 2에서 최종적으로 선정된 각 자산군 대표 포트폴리오를 대상으로 자유롭게 투자 비중 결정 

       4가지 자산군에 동일하게 분산시 ---> 국가:섹터:팩터: 채권 = 1 : 1 : 1 : 1 

       주식군과 채권군에 동일하게 분산시 ---> 국가:섹터:팩터:채권 = 1 : 1 : 1 : 3

       주식군에만 몰빵시 ---> 국가:섹터:팩터:채권 = 1 : 1 : 1 : 0

       국가군의 비중을 높이고 싶을 때 ---> 국가:섹터:팩터:채권 = 2 : 1 : 1 : 1

   * 결정한 투자 비중에 따라 매월 step 2의 수익곡선 포트폴리오를 매월말 리밸런싱


4. 데이터 및 전략 파이썬 코드 다운로드

  전략은 파이썬을 기반으로 시뮬레이션했기 때문에, 우선 파이썬을 실행시킬 수 있는 툴킷을 설치해야 하고, 다음으로 인덱스 자료가 있는 엑셀 파일을 다운받아야 합니다. 이 상태에서 코드를 실행시키면 되는데, 순서대로 따라하시면 됩니다. 


  - Step 1 : Anaconda 설치

     * Anaconda는 파이썬 실행 프로그램과 관련 라이브러리를 한 번에 설치할 수 있는 프로그램입니다.

     * https://www.continuum.io/downloads 에 접속, 본인의 운영체제에 맞는 설치 파일 다운, 설치

  

  - Step 2 : 데이터 파일, 시뮬레이션 코드 파일 다운로드

     * http://cafe.naver.com/invest79/1303 에 접속, 첨부 파일 2개를 다운, 적당한 폴더에 저장

  

  - Step 3 : 파이썬 프로그램 상에서 시뮬레이션 실행

     * Anaconda 설치가 완료되면 Spyder라는 파이썬 프로그램이 생성되는데, Spyder를 실행

     * Spyder - File - Open 메뉴에서 아까 다운 받은 1.+모멘텀+포트폴리오.py 파일을 선택합니다

     * 여기까지 제대로 되었다면 아래와 같은 코드가 뜰 것입니다. 


# coding: utf-8


# ### Modified PAA model by Scott Lee, systrader79

# 1. 전략의 컨셉

#  

#  - 다중 모멘텀 기반의 multi asset dynamic asset allocation model

#  

#  - 모멘텀 스코어 + 현금 배분 ---> 수익 곡선 모멘텀 ---> 상대 모멘텀 동일 비중, 자산군 비중 배분로직

#  

# 2. 기존 모멘텀 전략 대비 장점

#  

#  - 추세 추종 전략의 노이즈를 먼저 제거한 상태에서 상대 모멘텀 전략 적용 ---> 훨씬 안정적

#  

#  - 모든 자산과 구조적으로 상관성이 낮을 수 밖에 없는 현금을 2회 연속 혼합한 수익 곡선을 하나의 자산군으로 이용 ---> 개별 자산 간의 상관성이 높아지는 구간에서도 낮은 포트폴리오 상관성 유지 가능 ----> 구조적인 drawdown 감소 효과

#  

#  - 복잡한 계산이 불필요 (상관성, 변동성 불필요) 하면서도 낮은 MDD와 높은 CAGR 달성 가능

#  

#  - 최적화를 배제 ---> input 데이터와 무관하게 구조적으로 robust 

#    (실제로 어떤 자산군, 어떤 정도의 상대 모멘텀을 적용하더라도 수익곡선에는 큰 변화가 없음)

#    

#  - 수익곡선 모멘텀을 처음 적용하는 시점에서 현금 비율 조절함으로써, aggressive, moderate, conservative 모델로 기호에 따라 자유롭게 조절 가능

#  

#   - 현금 조절 로직과 더불어 투자하기 원하는 자산군 및 해당 투자 비중을 투자자 구미에 맞게 조절 가능 ---> DIY 포트폴리오 운용 가능

#   

#   - ETF를 이용한 로보어드바이저나, 개인화된 투자 솔루션에 최적

#  


# In[1]:


#1. 데이터 가져오기


import pandas as pd

import matplotlib.pyplot as plt

import numpy as np

import pandas_datareader.data as web

import matplotlib


matplotlib.rc('font', family='Malgun Gothic',size=8, weight = 'bold')


파일 = pd.ExcelFile('N:\투자\투자시뮬\포트폴리오 데이터 가공.xlsx')

자산군 = 파일.sheet_names

자산군


# In[2]:


#2. 자산군별 데이터 프레임 설정


자료 = {}

for i in 자산군:

    자료[i] = 파일.parse(i)

    자료[i].index = 자료[i].날짜

    자료[i].drop('날짜', axis = 1, inplace=True)

    print(i+'개수',len(자료[i].columns))

    

# In[3]:


#3. 함수 설정


def 월간수익률(데이터):

    return 데이터 / 데이터.shift(1)


def 변동성대비모멘텀(데이터):

    return (데이터/데이터.shift(12))/pd.rolling(12).std(데이터)


def 연평균수익률(데이터):

    return 데이터/데이터.shift(12)


def 평균모멘텀(데이터):

    초기값 = 0

    for i in range(1, 13):

        초기값 = 데이터 / 데이터.shift(i) + 초기값

    return 초기값 / 12


def 평균모멘텀스코어(데이터):

    a = 평균모멘텀(데이터).copy()

    초기값 = 0

    for i in range(1, 13):

        초기값 = np.where(데이터 / 데이터.shift(i) > 1, 1, 0) + 초기값

    a[a > -1] = 초기값/12

    return a


def 현금혼합모멘텀수익곡선(데이터, 현금비율=0.5):

    x = 월간수익률(자료['현금'])*현금비율

    a = pd.DataFrame((월간수익률(데이터).values*평균모멘텀스코어(데이터).shift(1).values+x.values)/(현금비율+평균모멘텀스코어(데이터).shift(1).values)).cumprod() 

    a.index = 데이터.index

    a.columns = 데이터.columns

    return a


def 수익곡선모멘텀(데이터):

    x = 월간수익률(자료['현금'])

    y = 현금혼합모멘텀수익곡선(데이터)

    a = pd.DataFrame((월간수익률(y).values*평균모멘텀스코어(y).shift(1).values+(1-평균모멘텀스코어(y).shift(1).values)*x.values)).cumprod() 

    a.index = 데이터.index

    a.columns = 데이터.columns

    return a


def 수익곡선순위(데이터, 순위):

    x = 평균모멘텀(수익곡선모멘텀(데이터))

    y = x.iloc[ : , 0: len(x.columns)].rank(1, ascending=0)

    y[y <= 순위] = 1

    y[y > 순위] = 0

    return y


def 자산군통합포트(데이터, 순위):

    x = 월간수익률(수익곡선모멘텀(데이터))

    y = 수익곡선순위(데이터, 순위).shift(1)

    return ((x*y).sum(1)/(y.sum(1))).dropna().cumprod()


def 통합모멘텀():

    a = 자산군통합포트(자료['국가'],5)

    b = 자산군통합포트(자료['섹터'],10)

    c = 자산군통합포트(자료['팩터'],4)

    d = 자산군통합포트(자료['채권'],1)

    e = pd.concat([a, b, c, d], axis=1)

    e.columns = ['국가', '섹터', '팩터', '채권']

    return e


def 최종수익곡선(국가비중, 섹터비중, 팩터비중, 채권비중):

    x = 월간수익률(통합모멘텀())

    y = ((x.국가*국가비중+x.섹터*섹터비중+x.팩터*팩터비중+x.채권*채권비중)/(국가비중+섹터비중+팩터비중+채권비중)).cumprod()

    return y.dropna()

    

# In[4]:


#4. 결과 plot

# 국가, 섹터, 팩터, 채권


a = 최종수익곡선(1,1,1,0)

b = 자료['국가'].한국/자료['국가'].한국.ix[0]

c = pd.concat([a, b], axis=1).dropna()

c.columns = ['포트폴리오', '코스피']

c.divide(c.ix[0]).plot(figsize =(8,6))

plt.show()


#5. MDD

최대하락 = c.포트폴리오.rolling(min_periods=1, window = 500).max()

당월하락 = c.포트폴리오/최대하락 - 1.0

최대하락폭 = 당월하락.rolling(min_periods=1, window=500).min()


당월하락.plot(subplots=True, figsize = (7.8,2), linestyle='dotted')

최대하락폭.plot(subplots=True, figsize = (7.8,2), color = 'red', linestyle='dotted')

plt.show()



5. 시뮬레이션 방법

 - Step 1 

   * 엑셀 파일 가져오기 : 다운로드 받은 엑셀 파일의 위치를 찾아 아래 코드의 엑셀 파일 부분의 주소를 수정 (아래 코드 그대로 하라는 의미가 아니고 본인이 다운 받은 주소로 바꾸라는 의미)


 - Step 2

   * 현금 비중 지정 : 현금 비중이 늘어나면 안정성이 커지지만 수익이 떨어지고, 현금 비중을 낮추면 수익률은 높아지지만 변동성은 커집니다. 본인의 투자 성향에 맞게 현금 비율을 0 ~ 1 사이에서 자유롭게 수정합니다. 1보다 커져도 상관은 없지만, 이렇게 되면 현금 비중이 너무 높아져 투자의 의미가 별로 없어집니다. 개인적으로는 공격적 투자(0.25), 보통(0.5), 보수적(1) 값을 추천합니다. 


 

 - Step 3

  * 자산군별 모멘텀 랭킹 상위 종목 개수 선정 

    각 자산군 내에서 모멘텀이 큰 종목 몇개를 고를지 결정하는 과정입니다.

    개수를 늘리면 안정성이 좋아지지만 상대적으로 수익률은 떨어지고, 개수가 적으면 수익률은 높으나 변동성이 커집니다. 자유롭게 테스트하면서 결과를 확인해보시죠. 개인적으로는 전체 자산군 개수의 절반 정도를 추천합니다. 물론 채권군에는 1개 밖에 없으니 어쩔 수 없이 1을 지정해야겠죠?

    자료['국가'], 뒤의 숫자가 모멘텀 상위 종목의 개수이고 이 값을 자유롭게 변경하시면 됩니다.  

    이 숫자가 각 자산군에 속한 종목의 총 개수보다 크면 당연히 안되겠지요? 



 - Step 4

    * 자산군간 비중 결정 

      각 자산군간 대표 모멘텀 포트폴리오가 완성되었으므로, 각 자산군간의 배분 비중을 여러분의 구미에 맞게 설정해줍니다. 

      a = 최종수익곡선(1,1,1,0) 의 괄호 안의 4가지 숫자가 순서대로 각각 국가, 섹터, 팩터, 채권군의 배분 비중입니다. 자유롭게 값을 바꿔보시기 바랍니다. 


 


이제 끝입니다. 값을 다 설정했으면 F5 키를 누르고 수익 곡선을 확인하시면 됩니다. 

위의 그래프는 수익 곡선이고, 아래 그래프는 MDD 그래프입니다.



 

 

5. Modified PAA 전략의 우수성

 위의 그래프는 코스피 대비한 수익 곡선(채권 비중 0, 현금 비중 0.25) 입니다. 현금 비중을 상당히 낮추고 장기 채권을 전혀 넣지 않았음에도 불구하고 MDD가 -10% 대에 불과하면서, 연평균 수익률은 12%를 넘습니다. 스마트 베타 인덱스의 과최적화 오류를 배제하게 위해 국가와 섹터만 가지고 시뮬레이션 해도 안정적인 우상향 곡선은 변하지 않습니다. 

 현재 수많은 자산군을 대상으로 한 ETF 상품이 끝없이 나오고 있고, 전략적인 알파를 추구할 수 있는 스마트 베타 인덱스를 추종하는 ETF도 지속적으로 발전하고 있는 상황을 고려하면 Modified PAA 전략의 투자군도 훨씬 더 다변화시킬 수 있다는 점에서 고무적입니다. 

 백테스트 자료에 국내에 출시된 훨씬 더 성과가 뛰어난 스마트 베타 인덱스나 대체 자산군(상품, 환율, 인버스)도 얼마든지 넣을 수 있었지만, 일단은 가장 기본적인 자산군만 넣고 평가한 이유는 현재 나온 스마트 베타 인덱스 중 과최적화가 의심되는 것들도 있어서입니다. 

 하지만, 실제 투자에서 과최적화가 발생한다고 하더라도 모멘텀 전략을 2중으로 적용시켜 투자하면 성과가 나쁜 종목은 자연스레 포트폴리오에서 빠지는 구조이므로, 과최적화된 상품마저도 실제 퍼포먼스에 영향을 주지 않는다는 강력한 장점이 있습니다. 

 (다만 백테스트상에서는 과최적화된 상품의 퍼포먼스가 실제 퍼포먼스보다 과장되게 나타날 수 있다는 점에서 스마트 베타 인덱스를 많이 넣지는 않았습니다.) 

 장기적인 관점에서 볼 때 환율이나 인버스 같은 지수는 cash flow를 창출하는 자산군이 아니므로 일반적으로 모멘텀 기반의 추세 포트폴리오의 편입 자산군으로는 적절치 않지만, Modified PAA 전략을 이용하면, 얼마든지 보조적인 수단으로 이용이 가능합니다.

 이를 테면, 주식 인버스 지수를 주식군에 넣고 모멘텀 상위 selelction 로직을 적용하면, 전반적인 상승장에서는 자연스레 일반 주식 인덱스가 강세를 보이므로 탈락하게 되지만, 하락장에서는 자연스레 인버스가 강세를 보여 편입이 되는 구조이므로 카멜레온처럼 시장 상황을 정확하게 반영하고 포트폴리오의 안정성에 기여할 수 있는 좋은 수단이 됩니다. 

 여러분이 다양한 방법으로 시뮬레이션 해보면 아시겠지만, Modified PAA 전략은 기본적으로 가격의 노이즈를 현금이라는 가장 안정적이고 모든 자산군과의 상관성이 낮은 자산과 모멘텀 기반으로 2번에 걸쳐 혼합시켜 희석시킨 구조이기 때문에, 타 자산과의 상관성이 수학적으로 또 구조적으로 낮게 됩니다. 

 그렇기 때문에 EAA나 minimum correlation algorithm 같은 수학적으로 더 세련된 장치가 없음에도 불구하고 타 자산군과의 상관성이 급증하는 시기에도 기본적으로 포트폴리오의 변동성을 완화하는 구조적인 장치가 내재되어 있어 퍼포먼스가 안정적입니다. 

 또한, 타임 프레임의 선정 과정에도 과최적화의 개념을 아예 배제시켰기 때문에 시장이 어떻게 움직이더라도 최소한 어느 정도는 부분적으로나마 시장의 가장 확실한 움직임을 추적하게 되어 있기 때문에 수익률의 편차도 상당히 적게 나타납니다. 이는 기존의 동적 자산 배분 모델과 가장 확실하게 대비되는 Modified PAA 모델의 특장점이라고 할 수 있겠습니다. 

 Modified PAA 전략의 수익 구조의 핵심은 위험 자산의 움직임이 아닌 현금 자산의 비중을 조절하는 것인데, 현금성 자산은 리스크와 변동성이 가장 낮다는 점에서 포트폴리오 리밸런싱에 의한 rebalancing gain을 얻기에 가장 뛰어난 투자수단입니다. 

 Modified PAA 모델에서는 타임 프레임을 첫번째 모멘텀 스코어 적용단계에서 12단계로 분산시킨 후, 2번째 수익 곡선 모멘텀 단계에서도 다시 한번 12단계로 분산시키고 현금을 2단계로 희석, 리밸런싱하는 구조이기 때문에, 단일 종목에 투자함에도 불구하고 무려 24번의 분산 투자 로직이 내재된 구조라고 할 수 있는데, 이는 기존의 동적 자산 배분 모델이 단일한 타임 프레임을 기준으로 switch on / off 하는 시스템에 비해 월등한 분산효과를 보여줍니다. 

 Modified PAA 전략에서는 기본적으로 자산군의 가격 자체가 트레이딩 대상이 되는 것이 아니고, 횡보장에 대한 대비, 변동성 리스크에 대한 대비가 어느 정도 가미되어 노이즈가 제거된 수익 곡선이 투자 대상이 됩니다. 

 이런 장점 때문에 투자 자산간의 복잡한 상관관계를 고려하지 않고 아무렇게나 동일 비중으로 포트폴리오를 구성해도, 투자 자산의 개수가 너무 적지만 않고 집중되지만 않으면 어떤 조합에서도 유사한 퍼포먼스를 보인다는 점도 큰 장점입니다. 

 이는 투자자가 스스로 입맛에 맞게 투자 유니버스만 선정하고, 현금 비중, 자산군간의 배분비를 그 어떤 방향으로 선정해도 변동성이 구조적으로 낮고 안정적인 수익 곡선을 기대할 수 있다는 점에서 최근 이슈가 되고 있는 ETF 기반의 동적 자산 배분 펀드나 솔루션에 최적화된 구조라고 할 수 있습니다. 

 상기 전략을 바탕으로 한 개인투자자도 쉽게 따라할 수 있는 절대 수익형 DIY ETF 솔루션을 개발, 런칭할 계획입니다. 관심이 있으신 분은 여기를 클릭하시기 바랍니다. 


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


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


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

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

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

     강의 소개 (클릭)

     * 강의 바로가기 (클릭)



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





반응형

댓글5

  • 이준석 2017.10.16 13:40

    고맙습니다.
    답글

  • 민트 2017.12.08 15:35

    아이디어 창고 감사합니다
    답글

  • 오혜성 2019.04.02 10:20

    이 전략의 코드와 17번 자산배중 + 평균모멘텀스코어 전략 코드의 차이가 무엇인가요..?
    답글

  • 오혜성 2019.04.10 15:37

    시스템 손절매는 코드에 반영이 되어있지 않은거죠?
    답글

  • 기삼 2019.05.26 17:21

    이 MPAA 전략의 17~19년 백테스트 결과가 궁금합니다.
    또한 삼성에서 이 전략으로 etf가 나온 것으로 알고 있는데요, 해당 etf가 이 전략을 그대로 구현하고 있는지 차이가 있는지 궁금합니다.
    답글