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

실전 투자 전략 (27) - Adaptive momentum 전략 (2)

by systrader79 eternity79 2016. 11. 30.
728x90
반응형

 이번 포스팅에서는 지난 번(클릭)에서 간단하게 개념을 알아본 adaptive momentum 전략을 실제로 구현해보겠습니다. 


1. Adaptive momentum 전략의 기본 원리

 Adaptive momentum 전략 (동적 추세 추종 전략)의 기본 철학은 추세 추종 매매의 기본 원리에서 출발합니다. 

 추세 추종 매매에서 타임 프레임은 짧게 잡을 수도 있고 길게 잡을 수도 있습니다. 짧게 잡는 경우, 좀 더 빨리 진입하고, 좀 더 빨리 청산할 수 있어서 시장의 트렌드를 훨씬 더 빨리 캐치할 수 있고 기민하게 대응할 수 있다는 장점이 있지만, 자잘한 거짓 신호에 의해 손실을 볼 가능성이 높다는 단점이 있습니다. 

 길게 잡는 경우는 반대입니다. 자잘한 거짓 신호를 잘 거른다는 장점이 있지만, 추세가 시작되거나 꺾일 때 너무 늦게 신호가 발생한다는 점에서, 추세의 변곡점이나 횡보장에 치명적이라는 것이 단점입니다. 

 이런 관점에서 본다면, 추세가 안정적일 때에는 긴 타임 프레임을, 추세가 불안정할 때에는 짧은 타임 프레임으로 접근하는 것이 합리적이라고 추측할 수 있습니다. 

 따라서, 추세의 강도 내지는 추세의 안정성을 확인하는 지표를 선정한 후, 이 값이 강하면 그에 비례하여 긴 타임프레임을 적용하고 작으면 짧은 타임 프레임을 적용하면 adaptive time frame에 따라 투자할 수 있게 됩니다. 


2. 추세의 강도를 어떻게 정량할까? 

 현재의 시장이 추세장인지 횡보장인지 구분하는 기술적인 지표는 여러가지가 있습니다. 

 가장 대표적인 것이 ADX 같은 지표인데요, 우리나라에서는 그다지 많이 알려지지 않았지만, 해외에서는 활발하게 쓰이는 지표 중 하나가 Kaufman의 efficiency ratio입니다. 

 Kaufman의 efficiency ratio는 다음과 같은 공식으로 추세의 강도를 정량합니다. 

 ER (Efficiency ratio) 

   = 절대값 (현재가 - n일 전 종가) / 최근 n일간 합 (절대값 (종가 - 전일종가))

 공식에서 보는 바와 같이 주가가 10일 연속으로 상승하거나 10일 연속으로 하락하면 ER  = 1로 계산됩니다. 하지만, 주가가 오르락 내리락 계속 횡보만 한다면, 분모는 커지는데 분자는 작아지므로, 0에 가까워지게 됩니다. 

 즉, ER 값은 상방이건 하방이건 추세의 강도를 나타내며, 0~1 사이의 값을 가지게 되며, 추세가 강할 수록 1에 가까워지고, 변동성이 크거나 횡보가 강할수록 0에 가까워집니다. 


3. Efficiency ratio를 이용한 adaptive time frame 계산

 Efficiency ratio가 추세의 강도를 정량하는 지표라고 한다면, 이 값을 어떻게 이용하면 adaptive time frame을 구할 수 있을까요? 답은 간단합니다. 우리가 쓰고자하는 기본적인 긴 타임 프레임을 설정한 뒤, 실시간으로 계산되는 efficiency ratio를 곱해주면 됩니다. 즉, 

 Adaptive time frame = Efficiency ratio X 기본 time frame 의 정수값

 이 됩니다. 


4. Adaptive time frame을 이용한 momentum 전략

 이제 답이 거의 다 나왔죠? 이제는 adaptive time frame을 이용한 월간 모멘텀 전략을 실제 데이터에 적용해보겠습니다. 블로그에서 지속적으로 다룬 월간 모멘텀 전략의 maximum time frame이 12개월이었으므로, 기본 time frame도 12개월로 잡고 전략을 만들어보겠습니다. 


종목 : 각종 index

매수 : 매월 말 해당 종목의 12개월 adaptive time frame (12 X Efficiency ratio) 계산

        Adaptive time frame 절대 모멘텀 > 0 시 매수

매도 : 매월 말 해당 종목의 12개월 adaptive time frame (12 X Efficiency ratio) 계산

        Adaptive time frame 절대 모멘텀 < 0 시 매도


 예를 들어, 이번 달 말에 계산된 adaptive time frame 값이 7이었다면, 월말 종가 > 7개월 전 주가 (7개월 모멘텀 >0) 인 경우 매수하고, 매월 말 지속적으로 업데이트 되는 adaptive time frame 값에 해당하는 절대 모멘텀 <0 인 경우 매도하는 로직입니다. 

 기존의 고정된 모멘텀 전략의 경우, time frame이 12개월이나 6개월처럼 고정되어 있었지만, adaptive time frame 전략에서는 이 time frame 값이 매월 지속적으로 시장의 상황에 맞게 변동되는 구조가 됩니다. 


5. Adaptive time frame 전략 시뮬레이션 결과

 

 

< Adaptive momentum 모멘텀 전략 : KOSPI >


< Adaptive momentum 모멘텀 전략 : S&P500 >


 일반적인 모멘텀 전략 (보통 6~12개월의 장기 타임프레임이 흔히 쓰입니다)의 경우, 최근 5년 이상 횡보하는 코스피 같은 시장 상황을 만나면, 수익 곡선이 횡보하는 것이 아니라 하락하게 됩니다 (추세 추종 전략은 횡보장에서 손실이 누적될 수 밖에 없으므로). 하지만, adaptive time frame 전략을 구사하면 보시는 바와 같이 시장의 변동성이 커지거나 비추세적인 움직임을 보일 때 efficiency ratio가 감소하여 time frame이 자동적으로 짧게 교정되기 때문에 진입이나 이탈 신호가 너무 늦게 나와 큰 손실이 누적되는 것을 구조적으로 막아주는 효과가 나타납니다. 그래서 위의 코스피에 적용한 수익곡선처럼 추세 추종 매매의 단점을 상당히 개선시킨 결과를 기대할 수 있습니다. 


5. Adaptive time frame 전략의 적용 및 시사점

 Adaptive time frame 전략은 기존의 rigid한 time frame을 적용하는 방법에 비해 이론적으로나 구조적으로 더 의미 있는, 발전된 접근 방법으로 볼 수 있겠습니다. 따라서, 고정된 time frame을 이용하면서 어떤 time frame이 최적이네 마네를 따지는 의미없는 논쟁을 벌이는 것보다는 훨씬 더 실제적이고 이상적인 툴로 이용할 수 있을 것입니다. 

 기존 동적 모멘텀 전략의 time frame을 결정할 때에 어떤 time frame을 써야 할지 고민이 되거나 결정하기 힘들 때, 훌륭한 대안으로 쓸 수 있고, 절대 모멘텀 전략과 상대 모멘텀 전략에 모두 적용이 가능한 간단하면서도 효과적인 방법으로서의 가능성을 엿볼 수 있습니다. 


6. Adaptive time frame momentum 전략 파이썬 코드

# 1. 라이브러리 import
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader.data as web

#2 . 함수 설정
def 주가(종목, 시작일):
    주가 = web.DataReader(name=종목, data_source='yahoo', start=시작일)['Adj Close']
    return 주가.div(주가.iat[0]).resample('M').last().to_frame('주가')

a = 주가('^KS11', '2000-01-01')

def 프랙탈(데이터, 주기):
    df = pd.DataFrame()
    데이터['절대값'] = 데이터['주가'].diff(주기).abs()
    데이터['변동성'] = 데이터.주가.diff().abs().rolling(주기).sum()
    데이터['프랙탈'] = 데이터['절대값']/데이터['변동성']
    df = pd.concat([df, 데이터['프랙탈']], axis=1)
    return df
    
def 가변주기(데이터, 주기):
    df = pd.DataFrame()
    데이터['절대값'] = 데이터['주가'].diff(주기).abs()
    데이터['변동성'] = 데이터.주가.diff().abs().rolling(주기).sum()
    데이터['가변주기'] = (데이터['절대값']/데이터['변동성']*주기).dropna().astype(int)
    df = pd.concat([df, 데이터['가변주기']], axis=1)
    return df

a['가변주기'] = 가변주기(a, 12)
a.dropna(inplace=True)

# 3. 가변 모멘텀 설정 (참고 : https://stackoverflow.com/questions/38523920/variable-shift-in-pandas)
def 가변모멘텀(x):
    return a['주가'].shift(x['가변주기'])[x.name]
a['가변모멘텀'] = a.apply(가변모멘텀, axis=1)
a['수익'] = np.where(a.주가.shift(1)>a.가변모멘텀.shift(1), a.주가/a.주가.shift(1),1.03**(1/12)).cumprod()
a['현금혼합'] = np.where(a.주가.shift(1)>a.가변모멘텀.shift(1),(a.주가/a.주가.shift(1)+1.03**(1/12))/2,1).cumprod()

#4. Plotting
(a.주가/a.주가.ix[0]).plot()
a.수익.plot()

plt.show()

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


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


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

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

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

     강의 소개 (클릭)

     * 강의 바로가기 (클릭)



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




728x90
반응형

댓글7

  • 서진원 2017.03.21 17:24

    절대값 (현재가 - n일 전 종가) / 최근 n일간 합 (절대값 (종가 - 전일종가))

    공식이 좀 이해되지 않아서 질문드립니다


    분모의 최근n일간 합은 최근 n일간의 종가를 다 더하는 것인가요?

    그리고
    12개월 타임프레임에 er을 쓰려면

    위 공식에서 n일을 12개월로 바꾸나요?

    N일의 기준을 어디로 잡아야할지 모르겠네요

    절대값 (현재가 - 12개월 전 종가) / 최근 12개월간 합 (절대값 (종가 - 전일종가)) ???
    답글

  • listenkw@gmail.com 2017.07.25 10:33

    "4. Adaptive time frame" 단락에서 질문이 있습니다.
    매도 : 매월 말 해당 종목의 12개월 adaptive time frame (12 X Efficiency ratio) 계산
    Adaptive time frame 절대 모멘텀 < 0 시 매도

    라고 하셨는데,
    Efficiency ratio값이 절대값이기 때문에 0보다 작게 나오는 경우는 없는 것 같아서요..
    제가 잘 이해를 못한 것인지도 모르겠습니다만..
    답변 부탁드립니다.
    답글

  • listenkw@gmail.com 2017.07.25 14:00

    그리고 혹시 adaptive time frame값이 소수점으로 나왔을 경우는 어떻게 처리하시나요?
    답글

  • 이나강 2017.08.03 21:57

    답변 감사드립니다.
    답글

  • 달식이 2019.07.21 14:24

    12개월 기본 time frame에서 efficiency ratio를 구할 때에 "일 단위"로 종가 변화를 보는게 아니라, "월 단위"로 종가 변화를 보는 것이 맞나요? 일 단위로 보면 분모가 엄청 커져서 항상 0에 가까울 것 같습니다.
    답글