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

실전 투자 전략 (35) - 단순 이평선 돌파 전략

by systrader79 eternity79 2017. 3. 26.
반응형

 이번 포스팅에서는 기술적 트레이딩 전략의 첫 번째 시간으로 가장 먼저 단순 이동 평균선 돌파 전략에 대해 알아보겠습니다.

 이동평균선은 주식 쌩초보조차 익히 알고 있을 정도로 기본적인 지표이고, 주식 입문서나 기법서에서도 '이평선 위에 있을 때 사야 한다, 이평선 정배열에서 사라'는 원칙들이 많이 나와 있지요. 

 이동 평균선을 이용한 전략은 다양합니다. 다중 이평선 배열을 이용해 트레이딩하는 방법도 있고, 이평선을 추세의 필터링 조건으로 이용하기도 하며, 이평선의 다이버전스를 이용하기도 하고..

 하지만 가장 대표적인 전략은 역시 이평선을 상향 돌파시 매수, 하향 돌파시 매도하는 이동 평균선 돌파 전략이라고 할 수 있겠습니다. 이평선 돌파 전략은 가장 대표적인 추세 추종 전략이자, 시스템 트레이딩의 "Hello, world!"라고 불릴만 합니다.

  

1. 단순 이동평균선 돌파 전략

  단순 이동 평균선이란, 최근 n일 간의 주가를 대상으로 단순한 평균(산술 평균)을 계산한 값을 의미합니다. 

 예를 들어, 최근 3일간의 주가가 100,150,200 이었다면, 3일 이동평균선은 (100+150+200)/3 = 150이 됩니다. 

 이동 평균선은 지극히 단순한 지표이지만, 누구나 편하게 이용할 수 있고, 모든 기술적 지표 중 가장 기본적인 지표이기 때문에 실제 트레이딩에서도 가장 널리 이용되는 지표이기도 합니다. 

 이동 평균선 돌파 전략은, 당일 주가가 최근 n일 이동평균선 상향 돌파시 매수, 하향 돌파시 매도하는 아주 간단한 전략입니다.


<코스피 지수에 적용한 20일 이평선 돌파 전략 - 휩소의 향연.jpg>


 즉, 주가가 최근의 평균적인 가격 수준을 돌파할 때 해당방향으로 추세가 생겼다고 가정하여 추세에 편승하는 추세 추종 전략입니다. 

 많은 사람들은 단순하고 간단하니 별로 효과가 없을 것이라고 생각을 하지만, 그렇지 않습니다. 지표나 전략의 복잡성은 성과와 아무런 관계가 없습니다. 

그러면 이제 본격적으로 단순 이평선 돌파 전략을 시뮬레이션 해 보겠습니다.

 

 

2. 시뮬레이션 1) -  코스피 20일 이평선 돌파 전략

   우선 가장 단순하게 코스피 지수를 대상으로 20일 이평선 돌파 전략을 확인해보겠습니다.

   매수 대상 : 코스피 지수

   매수 : 코스피 일종가 > 20일 이동평균선

   매도 : 코스피 일종가 < 20일 이동 평균선

 

 시뮬레이션 결과 수익곡선입니다. 


 어떻습니까? 마음에 드시나요?

 이 정도면 잘 먹힌다고 봐야 되나요? 아니면 쓸모없다고 생각하십니까? 만일 그렇게 생각하신다면 그 이유과 기준은 무엇입니까? 

 퍼포먼스를 판단하는 여러 객관적인 지표들 (Sharp ratio, MDD, 수익률 표준편차, Hit ratio, Sortino ratio, drawdown 지속 기간 등)이 많이 있지만, 여기서는 그냥 '그까이꺼 대충' 수익 곡선의 모양만 보고 러프하게 판단해보겠습니다. 

 보시는 바와 같이 코스피가 안정적으로 대세 상승기에 있었던 2000년대 초 중반에는, 전형적인 추세 추종 전략답게 수익 곡선도 안정적인 우상향을 보이는 것을 확인할 수 있었습니다. 

 하지만, 코스피가 횡보장에 접어든 최근 몇 년간의 성과는 상당히 나쁘지요? 

 그 이유는 추세 추종 전략은 오를 때 사서 떨어질 때 파는 전략이기 때문에, 주가가 오르면 그 이후에 더 올라줘야 수익이 나는 구조인데, 오르락 내리락 하면 꼭지에 사서 바닥에 파는 격이 되어 본전은 커녕 지속적으로 손실을 보는 구조이기 때문입니다. 

 이 문제를 어떻게 해결해야 할까요? 20일이라는 값이 '최적값'이 아니기 때문에 그럴까요? 

 그러면 한 번 20일이 아니라 다른 여러 값으로 한 번 바꿔서 테스트해봅시다. 

 

3. 시뮬레이션 2) - 20일, 60일, 90일, 120일, 200일 이동 평균선 돌파 전략

 어떻습니까? 

 사실 수익 곡선의 모양만 바뀌었을 뿐, 근본적으로 문제가 해결되지는 않았지요? 

 예를 들어, 60일 이평선 전략의 경우 상대적으로 20일 이평선 전략보다 성과가 우수한 구간도 있었지만, 상대적으로 성과가 떨어지는 구간도 있었고, 다른 값들도 다 마찬가지입니다. 

 시장의 사이클은 끊임없이 변하는데, 이를 정확히 예측할 수 있는 방법은 존재하지 않기 때문에, 시장의 사이클을 완벽하게 예측하는 단일한 마법의 값 따위는 존재하지 않습니다. 이것은 비단 이동 평균선 전략 뿐만 아니라 모든 기술적 전략도 다 마찬가지입니다. 

 '어? 내가 알기론 시장의 최적 주기를 다양한 방법으로 계산하여 동적으로 보정할 수 있는 방법도 있는 걸로 알고 있는데 이건 뭐냐?'

 네, 물론 있고, 이후에 살펴볼 예정입니다만, 그런 전략도 단순한 전략의 단점을 개선하는 분명한 장점은 있지만, 역으로 단순한 전략이 가지고 있는 장점을 누리지 못하는 단점도 존재하기 때문에 완벽한 전략은 없습니다. 

 따라서, 시장의 변동성이나 사이클이 그 때 그 때 지속적으로 변하기 때문에 특정 단일한 지표값에만 의존하면, 운이 좋아 시장의 사이클과 맞아 떨어질 때는 수익이 잘 나지만, 그렇지 않은 경우에는 반드시 '구조적'으로 성과가 나빠지게 되겠지요? 

 따라서, 가장 간단한 해결책은 여러 시장 사이클에 분산 투자하는 것입니다. 

 한 번 확인해봅시다.

 

4. 시뮬레이션 3) - 20일, 60일, 90일, 120일, 200일 이동 평균선 돌파 포트폴리오 전략

 투자 자산을 5등분하여, 총 5개의 이평선 돌파 전략에 분산 투자한 전략입니다. 리밸런싱은 하지 않았습니다.

 어떻습니까? 

 딱히 뭐 완벽한 우상향은 아니지만, 그래도 어느 특정 단일값에 의존한 것보다는 평균적으로 변동성이 감소한 것을 대략 확인할 수 있지요? 

 백테스트를 처음 하다 보면, 백테스트 결과에 고무되어 성과가 엄청나게 잘 나온 수익 곡선에 현혹되어, 그 값을 마법의 지표처럼 인식하고 착각하는 경우가 흔히 있는데요, 

 그 값이 마법의 값이라는 '논리적','상식적','합리적','단순 명쾌한' 설명이 불가능한데도 단순히 성과가 잘 나왔다는 이유 하나만으로 그 값을 쓰면 이는 전형적인 과최적화의 오류를 범하는 것인데요,

 과최적화된 지표는 논리적으로 반드시 실제 투자에서 시뮬레이션 결과보다 나쁜 결과를 초래하게 되어 있습니다. 

 '아니 아무리 그래도 시뮬에서 잘 나오면, 실제 투자에서도 잘 나올 가능성이 높지 않냐?'

 라는 단순한 의문이 들 수가 있는데요, 상식과는 달리 과최적화값이 실제 투자에서는 왜 반드시 나쁜 결과를 초래하는지에 대한 논리적이고 통계적인 근거는 나중에 알려드리겠습니다

 어쨌거나, 여러 타임 프레임에 분산 투자하니 특정 타임 프레임에 대한 종속성은 많이 줄어들어 비록 최고는 아니지만 시장 상황이 어떻게 변해도 적어도 '중간은 가는' 전략으로 탈바꿈한 것을 확인할 수 있습니다. 

 시장의 움직임을 완벽하게 예측하는 것이 불가능하다면, 최고를 정확히 알아내는 것는 것은 불가능합니다. 이런 관점에서 보면, '중간은 가는' 전략이 현실적으로는 차선책이자 최선책입니다. 

 유명한 월스트리트의 투자 금언도 이를 반증합니다. 

 'Diversification is the only free lunch.'

 자..그런데 해결되지 않은 문제가 있습니다. 

 코스피 시장에서만 이 전략이 통용되는지 다른 시장에서는 어떤지도 확인해봐야 하지 않겠습니까

 만일 코스피 시장에서 갑자기 이 전략이 빌빌댄다면, 이게 진짜 이 전략이 나빠서인지, 아니면 일시적으로 코스피의 움직임과 엇박자가 나서 그러는 것인지 알 방법이 없지요. 

 그러면 다른 시장에도 한 번 적용해봅시다. 

 대략 컨셉은 이해하셨을테니, 이제는 일일이 하나하나 시뮬 안하고 한꺼번에 시뮬하겠습니다. 

 

5. 시뮬레이션 4) -  다양한 시장 index + multi time frame 전략

 총 7개의 주식 시장 인덱스에 총 5개의 타임 프레임으로 분산하여 이평선 전략을 적용한 결과입니다. (시장 인덱스 구성이 미국 쪽에 치우쳐 있어 이상적인 분산은 아닙니다. 야후에서 장기데이터를 받다보니...)

 S&P500

 MSCI EAFE

 Russell 1000 value

 Russell 1000 growth

 S&P Mid-Cap

 Russell 2000

 MSCI Japan

 

 즉, 사실상 분산은 8 X 5 = 40개로 이루어졌다고 할 수 있습니다. 

 어떻습니까? 1~4단계로 분산이 많이 진행될수록 이평선 전략도 생각보다 그럭저럭 쓸만하게 느껴지지시나요?

 그런데 문제는 뭘까요? 

 아무리 분산을 시켜도 drawdown이 좀 커지거나 길어지는 구간이 군데군데 나타난다는 점인데요. 이건 대체 왜 이러는 걸까요? 

 이유는 눈치 채신 분도 있겠지만, 지금 분산을 한 대상들이 모두 주가 지수라는, 상관성이 높은 동일 자산군이기 때문입니다. 

 분산 투자의 핵심은 '상관성이 낮은 자산'에 분산하는 것인데, 요즘처럼 글로벌 지수가 동조화 경향이 심한 시대에는 미국 지수가 빠지면, 전세계 지수도 같이 빠지는 경향이 흔하지요.

 그래서, 분산을 안 한 것보다는 낫지만, 동일 자산군내에 분산을 한 격이기 때문에 분산 효과가 떨어지게 됩니다. 

 그렇다면 어떻게 할까요? 네, 주식 시장과 구조적으로 상관성이 낮은 채권군까지 유니버스를 늘려서 테스트해보겠습니다. 

 

6. 시뮬레이션 5) - multi stock index + multi asset + multi time frame 전략

 앞서 언급한 주식 시장 index + 미국 10년 만기 국채 + 20년 만기 국채 + 회사채 + 1-3년 만기 국채(현금)으로 유니버스를 넓혀 시뮬레이션 해보겠습니다.

 채권군의 종목 수가 주식 종목군 수의 절반 정도라, 자산군 배분비를 1:1로 맞추어 시뮬레이션 합니다. 

 훨씬 나아졌죠? 이 정도면 실제 투자하는데도 아무런 지장이 없는 수준이라고 할 수 있습니다. 

 '그래도 중간에 떨어지는 구간이 있는데? 이건 뭐가 잘못된거냐?' 고 물으신다면


 

 투자 전략의 목적은 리스크를 줄이는 것이지 리스크를 없애는 것이 아닙니다. 리스크를 완벽하게 없애는 방법은 걍 은행 적금 드는 것 외에 없죠.

 그래도 더 줄이고 싶으면, 분산을 더 하면 됩니다. 자산군의 개수를 더 늘리거나, 현금을 섞거나, 이평선 전략이 아닌 다른 전략에 또 분산하거나, 추세 추종과는 상반된 역추세 전략에도 분산하거나, 인버스에도 분산하거나, 아니면 수익 곡선에 system stop을 걸거나, 전략의 포트폴리오를 구성하거나, market regime detection을 하는 필터를 추가하거나...

 이제 감이 오시죠? 

 안정된 수익을 내는 쉽고 확실한 방법은 '백테스트상 결과가 좋아서가 아닌' '구조적'으로 상관성이 낮은 대상에 끝없이 분산'하는 것입니다.

 '구조적'이라는 단어가 매우 매우 중요합니다.

 구조적으로 상관성이 낮은 방법은 백테스트가 사실 전혀 필요없고, 여러분이 뛰어난 프로그래밍 실력이나 수학 실력이 없어도 얼마든지 생각해 낼 수 있습니다. 

 상관성이 낮다는 말을 더 쉽게 표현하면, '반대가 되는, 상반이 되는'이라고 생각하면 편합니다. 

 그래도 어려우면 초등학생 아들한테 물어보면 됩니다. 

 

 뜨거운 <---> 차가운

 기분좋은 <---> 기분나쁜

 주식 <---> 채권

 짧은 주기 <---> 긴주기

 추세 추종 <---> 역추세 

 밸류 <---> 모멘텀

 기준선 돌파 전략 <---> 다이버전스 전략

 단기 채권 <---> 장기 채권

 경기 민감주 <---> 경기 방어주

 High beta <---> low beta (low volatility)

 가격 추세 <---> 가격 변동성

 등등...

 

 어차피 백테스트 결과가 좋건 나쁘건 죽어라 쳐다봐도 이게 과최적화인지 아닌지 수치로 알 수 있는 방법은 없습니다. 

 결국 과최적화 여부를 판단하기 위해서는, 수익곡선을 평가한 후 로직의 구조와 논리, 철학을 확인해야 하는데, 이는 굳이 백테스트를 하지 않아도 검증이 가능한 부분이죠.

 초등학생도 이해할 수 있을 정도로 명쾌한 로직이거나, 비록 어렵더라도 건전한 상식과 논리에 부합한다면, 이는 과최적화일 가능성이 낮겠습니다. 

 따라서, 구조적으로 상관성이 낮은 투자 전략을 '상식선'에서 만든 다음, 백테스트 상에서 검증하여 삐뚤삐뚤하지만 비록 안정적으로 우상향하는 전략이 나오면, 이는 robust 한 전략이라고 추측할 수 있습니다.

  안정적인 절대 수익 전략을 만드는데, 꼭 MIT 수학 박사 학위가 필요한 것은 아닙니다.

 간단한 방법으로도 얼마든지 비슷한 성과를 낼 수 있고, 첫 단추를 숫자 놀음에서 시작하지 않고 상식적이지만 분명한 로직 분산에서 출발하면 오히려 무의미한 data mining 보다 장기적으로 시장에서 살아남을 가능성이 더 높습니다. 

 

7. 시뮬레이션 6) - multi index + multi asset + multi time frame 전략 vs (muti index + multi asset ) + multi time frame 전략

 6번의 전략은 개별 종목을 대상으로 분산이 이루어진 전략인데, 전체 종목을 하나의 바스켓으로 묶어 마치 한 종목으로 취급한 상태에서 multi time frame 전략을 구사하면 어떻게 될까요? 

 결과는 아래와 같습니다. 

 이 전략 뿐만 아니라 다른 전략에서도 테스트를 해보면, 전반적으로 비슷하거나 후자의 경우가 성과가 약간 좋은 경우가 많았습니다. 

 단, 통계적으로 엄밀하게 검증한 것은 아니니, 큰 의미는 두지 않으셨으면 합니다. 

 얼핏 생각하면 개별 종목 단위에서 세밀하게 컨트롤 하는 것이 전체를 하나로 묶은 뒤 컨트롤 하는 것보다 성과가 좋을 것 같은데 꼭 그렇지 않은 이유는 뭘까요? 

 정답은 모르지만, 제 생각은 이렇습니다. 

 첫째, 개별 종목 단위로 나누어 접근하면 전체를 하나로 묶어 접근하는 경우보다 시장에 머무르는 시간이 적어져, 장기 수익 곡선상 수익률이 다소 저하된다. 

 둘째, 전체를 하나로 묶어 접근하면 포트폴리오 전체의 변동성이 낮아진 상태로 진행되기 때문에, 노이즈가 적은 자산군에 투자하는 격이 되어 추세 추종이 좀 더 잘 먹힐 수 있다. 

 어디까지나 개인적인 추정입니다. 

 이런 관점에서 본다면, 주식 종목들을 대상으로 멀티 팩터 포트폴리오 + 듀얼 모멘텀 전략을 구사할 때, 개별 종목 단위로 듀얼 모멘텀 전략을 접근하는 게 나으냐, 아니면 멀티 팩터 포트폴리오 전체 수익 곡선에 듀얼 모멘텀을 적용하는게 나으냐에 대한 실마리가 될 수도 있을 것 같습니다. 

 결론은, 정답은 없지만 전체 대상으로 접근해도 성과가 그리 나쁘지 않고, manage 하기는 후자가 더 편하다. 

 라고 추정해 볼 수 있겠습니다. 

 

 어떻습니까? 

 단순 이평선 전략, 충분히 쓸만한 전략입니다. 

 단, 내가 원하는 단 한 종목, 내가 원하는 오직 이 순간, 내가 원하는 단 하나의 지표값에서, 내가 원하는 수준의 높은 수익률만 노리지 않고, 그렇게 성과가 안난다고 징징대며 억지만 부리지 않으면 말이죠. 

 무한 개의 변수가 무한 개의 가능성을 만들어 반영하는 가격이라는 움직임을 내가 만든 딱 한가지 숫자, 딱 한가지 전략에 맞춰서 설명하려고 하는게 상식적으로 생각해도 말이 안되는데, 깊이 고민해보지 않으면 대부분의 투자자들은 이런 상식적인 오류를 깨닫지 못합니다. 

  

 분산이라는 절차는 가격의 변화무쌍함이라는 냉정한 현실을 아무런 편견없이 수용하는 관점에서 본다면, 내가 가격의 움직임을 완벽하게 컨트롤하지 못한다는 한계를 인정해야 하기에 '자존심'은 상하고 굴욕적일 수 밖에 없습니다. 하지만, 이것이 냉정한 사실이기 때문에 이렇게 무식해보이는 전략의 수익곡선은 역설적으로 절대 수익 곡선에 더 가깝게 됩니다.     

 

다음 포스팅에서는 또 다른 단순 무식한 추세 추종 전략을 살펴보고, 단순한 전략이 직관과는 달리 얼마나 강력한 투자 모델이 될 수 있는지 계속 알아보겠습니다.


본 포스팅의 시뮬레이션 파이썬 코드입니다. 

import pandas as pd

import matplotlib

import matplotlib.pyplot as plt

import numpy as np

from talib.abstract import *

import pandas_datareader.data as web

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


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

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

현금리스트 = ['SHY']

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


def 주가(stock, start):

    주가 = web.DataReader(name=stock, data_source='yahoo', start=start)['Adj Close']

    a = pd.DataFrame(주가.div(주가.iat[0]))

    a.columns = [stock]

    return a

    

def 이평선(데이터, 주기):

    a = pd.DataFrame()

    b = list(데이터)

    for i in b:

        a[i] = 데이터.iloc[:,0]

        a[i+'SMA'] = SMA(데이터, timeperiod=주기, price=i).shift(0)

        a[i+'수익'] = np.where(a[i].shift(1) > a[i+'SMA'].shift(1), a[i]/a[i].shift(1),1).cumprod()

    return a[i+'수익']

    

def 다중이평선(데이터, 주기1, 주기2, 주기3, 주기4, 주기5):

    a = pd.DataFrame()

    b = [주기1, 주기2, 주기3, 주기4, 주기5]

    for i in b:

        a[str(i)] = 이평선(데이터, i)

    return a.mean(axis=1)


def 전체데이터():

    a = pd.DataFrame()

    for i in 전체리스트:

        a = pd.concat([a,주가(i,'2003-01-01')],axis=1)

    return a


a = pd.DataFrame()

for i in 전체리스트:

    a = pd.concat([a,다중이평선(주가(i,'2003-01-01'),20,60,90,120,200)],axis=1)

a['mean'] = a.mean(axis=1)



전체데이터().mean(axis=1)

b = 전체데이터().mean(axis=1).to_frame()

b.columns = ['a']

다중이평선(b,20,60,90,120,200)



x = pd.DataFrame()

x = pd.concat([x, a['mean'],전체데이터().mean(axis=1),다중이평선(b,20,60,90,120,200)],axis=1)

x.columns = ['종목다중평균','전체평균','전체다중평균']


x.plot()

plt.show()


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


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


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

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

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

     강의 소개 (클릭)

     * 강의 바로가기 (클릭)



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


반응형

댓글1

  • 노미 2017.05.13 13:56

    안녕하세요.
    내용 중에 궁금한 부분이 있어서 문의드립니다.

    7번 시뮬의 결과 그래프에서 전체 평균 의미는 무엇인가요?

    항상 잘 보고 있습니다 ~~.


    답글