Ch.7 퀀트 트레이딩 특수 주제
이 책의 앞선 여섯 챕터는 자신만의 퀀트 전략을 조사·개발·실행하는 데 필요한 기본 지식 대부분을 다뤘다. 이 챕터는 퀀트 트레이딩의 중요한 주제들을 더 깊이 설명한다. 이 주제들은 통계적 차익거래 트레이딩의 근간을 이루며, 대부분의 퀀트 트레이더들은 이 주제들 중 일부 혹은 대부분에 정통하다. 또한 트레이딩에 대한 직관을 키우는 데도 매우 유용하다.
트레이딩 전략의 두 가지 기본 범주인 평균 회귀 전략과 모멘텀 전략을 설명한다. 평균 회귀 구간과 추세 구간은 일부 트레이더들이 *레짐(regime)*이라고 부르는 것의 예이며, 서로 다른 레짐 간의 전환은 이 챕터에서 다룰 주제다. 평균 회귀 전략은 시계열의 정상성(stationarity)과 공적분(cointegration) 개념에서 수학적 근거를 도출하는데, 이것도 이어서 설명한다. 그런 다음 많은 헤지펀드가 대형 포트폴리오를 관리하는 데 사용하며 성과에 많은 혼란을 야기해온 이론인 **팩터 모델(factor models)**을 설명한다. 트레이더들이 자주 논하는 다른 전략 범주로는 계절성 트레이딩과 고빈도 전략이 있다. 모든 트레이딩 전략은 포지션을 청산하는 방법을 필요로 하며, 이를 위한 다양한 논리적 방법을 설명한다. 마지막으로, 전략의 수익을 높이는 최선의 방법은 더 높은 레버리지와 더 높은 베타 주식을 거래하는 것 중 어느 것인지 고민해본다.
평균 회귀 전략과 모멘텀 전략
트레이딩 전략이 수익성을 가지려면 증권 가격이 평균 회귀하거나 추세를 따라야 한다. 그렇지 않으면 랜덤 워크를 하게 되고 트레이딩은 무의미해진다. 가격이 평균 회귀한다고 믿으며 현재 어떤 기준 가격 대비 낮다고 판단한다면, 지금 매수하고 나중에 더 높은 가격에 매도할 계획을 세워야 한다. 반대로, 가격이 추세를 따른다고 믿으며 현재 낮다고 판단한다면, 지금 (공)매도하고 더욱 낮아진 가격에 매수할 계획을 세워야 한다. 가격이 높다고 판단하는 경우에는 반대로 행동하면 된다.
학술 연구는 주가가 평균적으로 랜덤 워크에 매우 가깝다는 것을 보여준다. 하지만 이것이 특정 특수한 조건 하에서 일정 수준의 평균 회귀 또는 추세 행동을 나타낼 수 없다는 의미는 아니다. 더욱이, 어떤 시점에서든 주가는 관심 있는 시간 지평에 따라 평균 회귀하면서 동시에 추세를 따를 수도 있다. 트레이딩 전략을 구성하는 것은 본질적으로 특정 조건과 특정 시간 지평 하에서 가격이 평균 회귀할지 추세를 따를지 판단하고, 어떤 시점에서든 최초 기준 가격이 무엇이어야 하는지를 결정하는 문제다. (가격이 추세를 따를 때 “모멘텀”을 가진다고도 하며, 따라서 해당 트레이딩 전략을 흔히 모멘텀 전략이라고 부른다.)
가격이 동시에 평균 회귀하면서 추세를 따르는 현상을 주가의 “프랙탈(fractal)” 특성으로 묘사하는 사람들이 있다. 기술적 분석가나 차티스트들은 이런 현상을 분석하기 위해 소위 엘리어트 파동 이론을 즐겨 사용한다. 또 어떤 이들은 숨겨진 마르코프 모델, 칼만 필터, 신경망 등의 기법을 포함한 머신러닝 또는 인공지능 분야를 활용해 가격이 평균 회귀 “레짐”에 있는지 추세 “레짐”에 있는지 발견하려 한다. 저자 개인적으로는 이런 평균 회귀나 모멘텀에 관한 일반적인 이론들이 특별히 유용하다는 것을 발견하지 못했다. (단, 한 특정 주식의 레짐 전환을 예측하는 명백히 성공적인 시도를 설명하는 레짐 전환 섹션은 참조할 것.) 오히려, 회사의 예상 수익이 변하지 않는 한 주가는 평균 회귀한다고 가정하는 것이 대체로 안전하다고 본다. 실제로 금융 연구자들(Khandani and Lo, 2007)은 거래비용을 제외하고 여러 해에 걸쳐 수익성 있는 매우 단순한 단기 평균 회귀 모델을 구축했다. 물론, 평균 회귀가 충분히 강하고 일관해서 거래비용을 감안한 후에도 수익성 있게 거래할 수 있느냐는 별개의 문제이며, 그것이 충분히 강하고 일관한 특수한 상황을 찾아내는 것은 트레이더인 당신의 몫이다.
평균 회귀가 꽤 일반적임에도 불구하고, 수익성 있는 평균 회귀 전략을 백테스트하는 것은 상당히 위험할 수 있다.
역사적 금융 데이터베이스 중 상당수는 가격 호가에 오류를 포함하고 있다. 이런 오류는 평균 회귀 전략의 성과를 인위적으로 부풀리는 경향이 있다. 이유를 파악하기 쉽다: 평균 회귀 전략은 어떤 이동 평균보다 훨씬 낮은 허위 호가에서 매수하고, 이동 평균에 부합하는 다음 정확한 호가에서 매도해 이익을 남긴다. 평균 회귀 전략의 백테스트 성과를 완전히 신뢰하기 전에, 이런 허위 호가가 철저히 제거된 데이터를 사용해야 한다.
생존 편향도 3장에서 논의했듯이 평균 회귀 전략의 백테스트에 불균형하게 영향을 미친다. 극단적인 가격 움직임을 겪은 주식들은 인수됐거나(가격이 매우 높이 올라간 경우) 파산했을(가격이 0으로 내려간 경우) 가능성이 높다. 평균 회귀 전략은 전자를 공매도하고 후자를 매수해서 두 경우 모두 손실을 낸다. 그런데 이 주식들이 생존 편향이 있는 역사적 데이터베이스에 전혀 나타나지 않을 수 있어, 백테스트 성과를 인위적으로 부풀릴 수 있다. 어떤 데이터베이스에 생존 편향이 있는지 확인하려면 표 3.1을 참조하라.
모멘텀은 정보의 느린 확산에 의해 생성될 수 있다 — 특정 뉴스를 인식하는 사람들이 많아질수록 더 많은 사람들이 주식을 사거나 팔기로 결정하고, 그로 인해 가격이 같은 방향으로 움직인다. 앞서, 회사의 예상 수익이 변했을 때 주가가 모멘텀을 나타낼 수 있다고 언급했다. 이는 회사가 분기 실적을 발표할 때 발생할 수 있는데, 투자자들이 점진적으로 이 발표를 인식하거나 시장 충격을 최소화하기 위해 대규모 주문을 점진적으로 체결함으로써 이 변화에 반응한다. 그리고 실제로 이는 **PEAD(Post Earnings Announcement Drift, 실적 발표 후 드리프트)**라는 모멘텀 전략으로 이어진다. (이 전략에 관한 많은 참고 문헌이 있는 유용한 글은 quantlogic.blogspot.com/2006/03/pocket-phd-post-earning-announcment.html을 참조.) 본질적으로 이 전략은 주식의 실적이 기대치를 초과하면 매수하고, 미달하면 공매도할 것을 권한다. 더 일반적으로, 많은 뉴스 발표가 주식의 미래 수익 기대치를 바꿀 잠재력을 가지며, 따라서 추세 구간을 촉발할 잠재력도 갖는다. 어떤 종류의 뉴스가 이를 촉발하는지, 그리고 추세 구간이 얼마나 지속되는지는 당신이 스스로 알아내야 할 몫이다.
느린 정보 확산 외에도, 모멘텀은 유동성 필요나 대형 투자자의 사적 투자 결정으로 인한 대규모 주문의 점진적 체결에 의해 생성될 수 있다. 이 원인은 아마도 다른 어떤 원인보다 더 많은 단기 모멘텀 사례를 만들어낼 것이다. 그러나 대형 브로커리지들이 점점 정교한 체결 알고리즘을 사용함에 따라, 관찰된 모멘텀 뒤에 대규모 주문이 있는지 여부를 파악하기가 점점 어려워지고 있다.
모멘텀은 투자자들의 **군중 행동(herd behavior)**에 의해서도 생성될 수 있다: 투자자들이 타인의 (어쩌면 무작위적이고 무의미한) 매수·매도 결정을 자신의 트레이딩 결정의 유일한 근거로 해석하는 것이다. 예일대 경제학자 Robert Schiller가 뉴욕 타임즈(Schiller, 2008)에서 말했듯이, 완전히 정보에 입각한 금융 결정을 내리는 데 필요한 모든 정보를 가진 사람은 아무도 없다. 타인의 판단에 의존할 수밖에 없는데, 타인 판단의 질을 확실히 가늠할 방법도 없다. 더 문제적인 것은, 사람들이 서로 다른 시점에 금융 결정을 내리며, 한 자리에 모여 한 번에 합의에 이르는 것이 아니라는 점이다. 처음 집을 비싸게 산 사람은 집이 좋은 투자라고 다른 사람들에게 “알리며”, 이것이 또 다른 사람의 동일한 결정으로 이어지고, 이런 식으로 이어진다. 따라서 첫 번째 매수자의 어쩌면 잘못된 결정이 수많은 사람들에게 “정보”로 전파된다.
안타깝게도, 이 두 가지 원인(사적 유동성 필요와 군중 행동)에 의해 생성된 모멘텀 레짐은 예측하기 어려운 시간 지평을 가진다. 기관이 얼마나 큰 주문을 점진적으로 체결해야 하는지 어떻게 알 수 있을까? “군중”이 폭주하기에 충분할 만큼 커지는 시점이 언제인지 어떻게 예측할까? 악명 높은 변곡점(tipping point)은 어디일까? 이 시간 지평을 신뢰할 만하게 추정할 방법이 없다면, 이 현상들을 기반으로 모멘텀 거래를 수익성 있게 실행할 수 없다. 레짐 전환 섹션에서, 이 전환점 또는 “전환(turning)” 포인트들을 예측하려는 몇 가지 시도를 살펴보겠다.
평균 회귀 전략과 모멘텀 전략 사이에서 생각해볼 만한 마지막 대조점이 있다. 동일한 전략을 가진 트레이더들과의 경쟁 심화가 미치는 영향은 어떨까? 평균 회귀 전략의 경우, 그 영향은 전형적으로 차익거래 기회의 점진적 소멸이며, 따라서 수익률이 점진적으로 0으로 수렴한다. 차익거래 기회의 수가 거의 0에 가까워지면, 평균 회귀 전략은 점점 많은 비율의 트레이딩 신호가 평균 회귀하지 않을 주식의 펀더멘털 변화로 인한 것이라는 위험에 노출된다. 모멘텀 전략의 경우, 경쟁의 영향은 흔히 추세가 지속되는 시간 지평의 단축이다. 뉴스가 더 빨리 확산되고 더 많은 트레이더들이 이 추세를 일찍 활용할수록, 균형 가격에 더 빨리 도달한다. 이 균형 가격에 도달한 이후에 진입하는 모든 거래는 수익성이 없을 것이다.
레짐 전환*
레짐의 개념은 금융 시장에서 가장 기본적인 것이다. “강세장”과 “약세장”이 레짐이 아니면 무엇인가? 레짐 전환을 예측하려는 욕구 — 이는 *전환점(turning points)*으로도 널리 알려져 있다 — 는 금융 시장 자체만큼이나 오래됐다.
강세장에서 약세장으로의 전환을 조금이라도 성공적으로 예측할 수 있다면, 이 한 가지 유형의 전환에만 집중해서 끝낼 수 있을 것이다. 하지만 그렇게 쉽지 않다. 이 유형의 전환을 예측하는 어려움 때문에, 연구자들은 금융 시장에서 더 넓은 범위의 다른 유형의 레짐 전환을 살펴보게 됐으며, 기존 통계 도구로 더 잘 다룰 수 있는 것을 찾으려 했다.
이미 시장 및 규제 구조 변화로 인한 두 가지 레짐 전환(또는 이 두 예시는 이전 레짐으로 되돌아가지 않았기 때문에 “변환”이라고 하는 것이 더 적절하다)을 설명한 바 있다: 2003년 주가 10진법화(decimalization)와 2007년 공매도 상향 틱 규칙(plus-tick rule) 폐지. (자세한 내용은 챕터 5 참조.) 이런 레짐 변환은 정부가 사전에 발표하므로 예측이 필요 없지만, 규제 변화의 정확한 결과를 예측할 수 있는 사람은 거의 없다.
금융·경제학적으로 연구되는 가장 흔한 다른 레짐들로는 인플레이션 vs. 경기 침체 레짐, 고변동성 vs. 저변동성 레짐, 평균 회귀 vs. 추세 레짐이 있다. 이 중 변동성 레짐 전환이 GARCH(generalized autoregressive conditional heteroskedasticity) 모델(Klaassen, 2002 참조) 같은 고전적 계량경제학 도구로 가장 잘 다룰 수 있는 것으로 보인다. 금융 경제학자들이 주가 자체보다 변동성을 모델링하는 데 오랜 성공의 역사를 가지고 있는 것은 놀랍지 않다. 변동성 레짐 전환의 예측은 옵션 트레이더들에게 큰 가치가 있을 수 있지만, 안타깝게도 주식 트레이더들에게는 도움이 되지 않는다.
주가의 레짐 전환을 모델링하는 학문적 시도는 일반적으로 다음과 같이 진행된다:
- 두 가지(또는 그 이상의) 레짐이 가격의 서로 다른 확률 분포에 의해 특징지어진다고 가정한다. 가장 단순한 경우, 두 레짐의 로그 가격은 각각 정규분포로 표현될 수 있지만, 평균이나 표준편차가 다르다.
- 레짐들 사이에 어떤 종류의 전환 확률이 존재한다고 가정한다.
- 최대 우도 추정과 같은 표준적인 통계 방법을 사용해 과거 가격에 모델을 적합시킴으로써, 레짐 확률 분포와 전환 확률을 지정하는 정확한 파라미터를 결정한다.
- 위에서 적합된 모델을 기반으로, 다음 시간 단계에서의 기대 레짐과, 더 중요하게는, 기대 주가를 파악한다.
이런 접근 방식은 보통 마르코프 레짐 전환(Markov regime switching) 또는 **숨겨진 마르코프 모델(hidden Markov models)**이라고 불리며, 일반적으로 베이지안 확률론적 프레임워크를 기반으로 한다. 이런 접근 방식 중 일부에 대해 더 읽고 싶은 독자는 Nielsen and Olesen(2000), van Norden and Schaller(1993), 또는 Kaufmann and Scheicher(1996)를 참조하라.
이 우아한 이론적 프레임워크에도 불구하고, 마르코프 레짐 전환 모델들은 실제 트레이딩 목적으로는 대체로 쓸모가 없다. 이 약점의 이유는 모델이 항상 레짐 간 일정한 전환 확률을 가정하기 때문이다. 실제로 이는 어느 시점에서든(Nielsen and Olesen 논문에서 설명된 것처럼) 주식이 정상적인 안정 레짐에서 변동성 레짐으로 전환할 아주 작은 확률이 항상 존재한다는 것을 의미한다. 하지만 이는 전환 확률이 갑자기 급등하는 시점이 언제이고 정확히 어떤 조건에서인지 알고 싶은 트레이더들에게 쓸모가 없다. 이 질문을 다루는 것이 바로 **전환점 모델(turning points models)**이다.
전환점 모델은 데이터 마이닝 접근법을 취한다(Chai, 2007): 전환점 또는 레짐 전환을 예측할 수 있는 모든 가능한 변수를 입력한다. 현재 변동성, 직전 기간 수익률, 소비자 신뢰지수·유가 변화·채권 가격 변화 같은 거시경제 수치의 변화 등 다양한 변수들이 이 입력의 일부가 될 수 있다. 실제로, 부동산 시장의 전환점에 관한 경제학자 Robert Schiller(2007)의 매우 시의적절한 글에서, 다가오는 호황이나 불황에 대한 미디어 잡음의 고조 자체가 다가오는 전환점의 좋은 예측 변수가 될 수 있다고 제안됐다.
예시 7.1에서, 주가 계열에서 구축한 단순한 기술적 지표만을 입력으로 사용하고 여러 보유 기간의 주식 수익률을 출력으로 사용하는 데이터 마이닝 접근법으로 전환점을 어떻게 감지할 수 있는지 설명한다.
예시 7.1: 머신러닝 도구를 이용해 주식 시장의 레짐 전환에서 수익 내기
본문에서 논의한 것처럼, 레짐 전환은 방대한 수의 지표들이 어떤 것이 전환을 예측할 수 있는지 확인하는 데이터 마이닝 접근법으로 가장 쉽게 발견할 수 있다고 생각한다. 이는 MATLAB으로도 매우 번거로운 작업이지만, 다행히 최근의 머신러닝 프로그램이 이 발견 과정을 몇 시간 안에 수행할 수 있게 해준다.
여기서 사용할 도구는 Alphacet Discovery로, Alphacet, Inc.(www.alphacet.com. 완전 공시: Alphacet은 저자 회사의 고객이다.)가 최근 출시한 통합 백테스팅 및 실행 플랫폼이다. 이 플랫폼은 빠른 전략 프로토타이핑, 백테스팅, 분석, 실시간 배포에 필요한 모든 역사적 및 실시간 데이터를 통합할 뿐만 아니라, 우리가 찾고 있는 종류의 관계를 데이터 마이닝하는 데 적합한 신경망과 유전자 알고리즘 같은 머신러닝 프로그램의 확장 배열도 포함한다.
금융 섹터의 대표 종목으로 저명한 브로커리지 주식인 **GS(Goldman Sachs)**를 선택한다. 목표는 이 섹터에서 강세에서 약세로, 또 약세에서 강세로 전환하는 전환점을 감지할 수 있는지 확인하는 것이다. 초기 가설은 금리의 대폭적인 변화, 정부 거시경제 데이터 발표, 또는 실적 발표가 전환점의 주요 촉발 요인일 것이라는 점이다. 이 글을 쓰는 시점에서, Alphacet은 아직 거시경제 또는 기업 뉴스 데이터를 데이터베이스에 통합하지 않았다. 따라서 GS의 대규모 퍼센트 변화를 이런 뉴스 발표의 대리 변수로 사용할 것이다. 또한 GS가 이 대규모 하락 또는 상승이 발생하기 직전에 N일 고점 또는 저점에 도달할 때마다 이전 레짐이 종료될 신호라고 생각한다. 따라서 이 조건도 추가 입력으로 사용할 것이다.
우리가 직면한 탐색 문제는 이렇다: 레짐 전환을 촉발하기에 충분한 퍼센트 변화는 얼마인가? N일 고점/저점 조건에서 N은 얼마여야 하는가? 새로운 레짐은 일반적으로 얼마나 지속되는가? (즉, 최적 보유 기간은 얼마인가?) 이 질문들에 구식의 수동 방식으로 답하려면 독립 변수에 대한 여러 임계값과 종속 변수에 대한 여러 수익 지평으로 여러 번 시뮬레이션을 실행해야 하므로 매우 시간이 많이 걸린다. Alphacet Discovery가 이 과정을 자동화하는 데 도움이 될지 살펴보자.
모델의 독립 변수는 GS의 1일 수익률이다. 종속 변수는 다양한 보유 기간 내 GS의 미래 수익률이다. Discovery는 최적의 규칙, 또는 최적의 규칙 조합을 쉽게 찾아서 최고의 백테스트 성과로 이어질 수 있다. 우리의 경우, 각 퍼센트 변화 임계값을 하나의 규칙으로 캡슐화할 수 있다. 저자는 매수의 경우 두 개의 임계값을, 공매도의 경우 두 개를 입력했다: -1%, -3%, 1%, 3%. 마찬가지로, 각 보유 기간도 규칙으로 캡슐화할 수 있으며, 저자는 6개의 기간을 입력했다: 1, 5, 10, 20, 40, 60일.
이 탐색을 위한 가격, 퍼센트 변화, 10일 고점/저점 시계열을 준비하는 것은 매우 쉽다: Discovery에서 마우스로 드래그 앤 드롭으로 대부분의 작업을 할 수 있다. (간편함을 위해 여기서는 전략을 위해 N을 10으로 고정하지만, 이 파라미터도 최적화할 수 있다.) GS 가격 계열을 전략 편집기로 드래그하고 사용 가능한 컨트롤로 1일 빈도를 지정했다. (가격 계열은 2006년 12월부터 시작한다.) 그림 7.1의 박스 S1을 참조하라. 그런 다음 1일 퍼센트 변화와 계열의 단순 10일 이동 고점·저점을 계산하는 사전 패키지된 여러 “규칙(Rules)“을 전략 편집기로 드래그했다(그림 7.1의 박스 I2). 그리고 Symbol Group 박스에서 Program Group 박스로 화살표를 그어 원래 가격 계열을 Program Group에 연결했다.
이제 새 규칙 박스의 편집기 내에 있는 드롭다운 메뉴와 텍스트 박스를 사용해서 진입 규칙을 만들 수 있다. 그림 7.2는 ±1% 변화를 기반으로 한 매수·매도 규칙의 Rule 박스 R3 내부를 보여준다. ±3%에 대해서도 유사한 Rule 박스를 만들었다. 기본적으로, 이후의 진입 신호는 이전 신호로 설정된 포지션을 덮어쓴다는 점에 유의하라.
사전 패키지된 “Holding Period” 프로그램에 다른 파라미터를 적용해서 보유 기간을 지정할 수 있다. (실제로, Lisp 프로그래밍 언어를 안다면 이런 프로그램을 직접 만들 수 있다.) 이것들은 모두 박스 I5(±2% 규칙을 위한 I6)에 캡슐화된다. R3의 출력을 I5에 화살표로 연결하고, 마찬가지로 R4를 I9에 연결한다.
마지막으로, I7과 I9의 출력에 대해 퍼셉트론 학습 알고리즘을 실행한다(퍼셉트론은 일종의 신경망이다). 이 알고리즘은 이동 창(moving window)의 역사적 훈련 데이터를 기반으로 이 창에서 총 이익을 극대화하는 것을 목표로 다양한 보유 기간을 가진 서로 다른 규칙들의 최적 가중치(및 기타 파라미터)를 찾아낼 것이다. 이 최적화된 가중치를 기반으로, 퍼셉트론은 각 기간 말에 매수·매도 결정을 내릴 것이다. (선택할 수 있는 다른 알고리즘의 예로는 유전자 알고리즘과 K-최근접 이웃 클러스터링 기법이 있다.)
흥미롭게도, 퍼셉트론은 이동 창에서 컴포넌트 규칙이 그렇게 하도록 구성됐음에도 불구하고 우리가 정확히 N일 동안 포지션을 보유하도록 강제하지 않는다. 매일, 전략은 이동 창의 최신 데이터를 사용한 최신 파라미터 최적화와 서로 다른 규칙의 선형 가중 결정을 기반으로 매수, 매도, 또는 아무것도 하지 않을지를 결정할 것이다.
이제 이 전략의 성과 결과를 살펴볼 준비가 됐다. Discovery의 차팅 애플리케이션을 활용할 수 있다. 그림 7.3에서 퍼셉트론 최적화를 통해 도출된 최상의 자기자본 곡선 세 개를 보여줬다. 최상의 곡선은 최적화를 위해 50일 이동 창을 사용하는 모델에서 나왔다. (이동 창의 길이 자체도 최적화 대상이 될 수 있지만, 여기서는 이 단계를 생략한다.) 차팅 애플리케이션의 사이드바에서, 이 전략이 6개월 백테스트 기간에 걸쳐 89회의 왕복 거래로 37.93%의 총 누적 수익률을 달성했음을 확인할 수 있다. (비교를 위해, GS에 대한 매수 후 보유 전략의 수익률은 15.77%, 낙폭은 14%다.) 또한 최적화로 인한 개선 효과를 수치화하기 위해, 다양한 보유 기간 루틴 중 최상의 자기자본 곡선(R3에서 1% 규칙 기준 I5에서 10일 보유 기간)도 보여줬으며, 그 기간 총 누적 수익률은 18.55%다.
백테스트 기간이 짧음에도 불구하고, 이 수익률은 매우 인상적으로 보인다. 뭔가 잘못된 것이 있을까? 특히, 머신러닝이나 인공지능을 기반으로 하는 모든 전략에 스며드는 것처럼 보이는 그 악명 높은 데이터 스누핑 편향은 어떨까? Alphacet Discovery의 기본 철학은 이런 종류의 편향이 발생하는 것을 방지하는 것이다. 이론상으로는, 비록 여기의 특정 예시에서는 아니지만, 모든 규칙과 파라미터에 대한 최적화가 역방향 이동 창에서 수행될 수 있어 백테스트에 미래 데이터를 전혀 사용하지 않는다. 물론, 성과가 저조한 모델 범주 전체를 버리고 개선될 때까지 새로운 범주를 하나씩 시도할 수 있기 때문에 데이터 스누핑 편향은 여전히 스며들 수 있다. 하지만 이것은 우리가 백테스팅 업무에 종사하는 한 피할 수 없다.
또한 이 경우 탐색 엔진이 최적화할 수 있는 파라미터들이 실제로 상당히 제한적이라는 점도 주목해야 한다: 단지 서로 다른 보유 기간들뿐이다. 이는 데이터 스누핑 편향의 위험을 더욱 줄여준다.
백테스트 결과가 좋으니, 즉시 버튼 하나를 눌러 이 전략을 실시간 데이터에 적용해 모의 투자 또는 실제 트레이딩 계좌에서 주문을 생성할 수 있다.
보다시피, 역방향 이동 창에서 엄격하게 수행되는 대규모 파라미터 최적화가 가능하다면, 가장 단순한 기술적 지표만으로도 레짐 전환 모델을 만드는 것이 어렵지 않을 수 있다. (챕터 3의 “파라미터 없는 트레이딩 모델” 사이드바 참조.) 거시경제 또는 기업별 뉴스로 가격 움직임을 확인할 수 있다면 성과가 더욱 향상될 수도 있다. 이 기법은 많은 ETF, 선물, 심지어 통화 트레이딩에도 수익성 있게 적용될 수 있다고 생각한다.
Alphacet, Inc.의 최고기술책임자 Rosario Ingargiola의 Alphacet Discovery 활용 도움에 감사를 전한다.
정상성과 공적분
시계열이 초기값에서 점점 더 멀어지지 않는다면 **“정상(stationary)“**이라고 한다. 기술적 용어로, 정상 시계열은 “0차 적분,” 즉 I(0)이다. (Alexander, 2001 참조.) 증권의 가격 계열이 정상적이라면 평균 회귀 전략의 훌륭한 후보가 될 것임은 분명하다. 안타깝게도, 대부분의 주가 계열은 정상적이지 않다 — 상장 이후(즉, IPO) 초기 가격에서 점점 더 멀어지는 기하적 랜덤 워크를 나타낸다.
그러나 한 주식을 매수(롱)하고 다른 주식을 매도(숏)했을 때 그 페어의 시장 가치가 정상적이 되는 주식 페어를 종종 찾을 수 있다. 이 경우 두 개별 시계열은 **공적분(cointegrated)**되어 있다고 한다. 그렇게 불리는 이유는, 두 시계열의 선형 조합이 0차 적분이기 때문이다. 일반적으로 공적분 페어를 형성하는 두 주식은 같은 업종 그룹에 속한다. 트레이더들은 오래전부터 이 소위 페어 트레이딩(pair trading) 전략에 익숙하다. 이 페어로 구성된 주가 스프레드가 낮을 때 페어 포트폴리오를 매수하고, 스프레드가 높을 때 매도·공매도한다 — 전형적인 평균 회귀 전략이다.
공적분 가격 계열 페어의 예로, 예시 3.6에서 논의한 금 ETF GLD와 금광 ETF GDX가 있다. GLD 1주를 롱하고 GDX 1.6766주를 숏하는 포트폴리오를 구성하면, 그 포트폴리오의 가격이 정상 시계열을 형성한다(그림 7.4 참조). GLD와 GDX 주식의 정확한 수량은 두 구성 시계열의 회귀 분석으로 결정할 수 있다(예시 7.2 참조).
(그림 7.4: GLD와 GDX 스프레드로 형성된 정상 시계열 — GLD 1주 롱 / GDX 1.6766주 숏)
예시 7.2: 좋은 공적분(및 평균 회귀) 주식 페어 구성 방법
본문에서 설명했듯이, 같은 업종 그룹의 한 증권을 롱하고 다른 증권을 적절한 비율로 숏하면, 그 조합(즉 “스프레드”)이 정상 계열이 되는 경우가 있다. 정상 계열은 평균 회귀 전략의 훌륭한 후보다. 이 예시는 www.spatial-econometrics.com에서 무료로 다운로드할 수 있는 MATLAB 패키지를 사용해, 두 가격 계열이 공적분되어 있는지, 그렇다면 최적 “헤지 비율(hedge ratio)“(첫 번째 증권 1주 대비 두 번째 증권의 주 수)을 찾는 방법을 가르쳐준다.
공적분 검정에 사용되는 주요 방법은 공적분 확대 Dickey-Fuller 검정으로, 함수명이 cadf이다. 이 방법에 대한 자세한 설명은 앞서 언급한 웹사이트의 매뉴얼에서 찾을 수 있다.
다음 프로그램은 epchan.com/book/example7_2.m에서 온라인으로 이용할 수 있다:
% 이전에 정의된 변수 지우기 clear; % "GLD.xls" 스프레드시트를 MATLAB으로 읽어들이기 [num, txt]=xlsread('GLD'); % 첫 번째 열(2행부터)은 mm/dd/yyyy 형식의 거래일 tday1=txt(2:end, 1); % yyyymmdd 형식으로 변환 tday1=datestr(datenum(tday1, 'mm/dd/yyyy'), 'yyyymmdd'); % 날짜 문자열을 셀 배열로 변환 후 숫자 형식으로 tday1=str2double(cellstr(tday1)); % 마지막 열은 수정 종가 adjcls1=num(:, end); % "GDX.xls" 스프레드시트를 MATLAB으로 읽어들이기 [num2, txt2]=xlsread('GDX'); % 첫 번째 열(2행부터)은 mm/dd/yyyy 형식의 거래일 tday2=txt2(2:end, 1); % yyyymmdd 형식으로 변환 tday2=datestr(datenum(tday2, 'mm/dd/yyyy'), 'yyyymmdd'); % 날짜 문자열을 셀 배열로 변환 후 숫자 형식으로 tday2=str2double(cellstr(tday2)); adjcls2=num2(:, end); % GLD 또는 GDX 중 하나라도 데이터가 있는 모든 날 찾기 tday=union(tday1, tday2); [foo idx idx1]=intersect(tday, tday1); % 두 가격 계열 결합 adjcls=NaN(length(tday), 2); adjcls(idx, 1)=adjcls1(idx1); [foo idx idx2]=intersect(tday, tday2); adjcls(idx, 2)=adjcls2(idx2); % 하나라도 가격이 없는 날 찾기 baddata=find(any(~isfinite(adjcls), 2)); tday(baddata)=[]; adjcls(baddata,:)=[]; vnames=strvcat('GLD', 'GDX'); % 확대 Dickey-Fuller 검정으로 공적분 검사 실행 res=cadf(adjcls(:, 1), adjcls(:, 2), 0, 1); prt(res, vnames); % cadf 함수 출력: % 공적분 변수에 대한 확대 DF 검정: GLD, GDX % CADF t-통계량 # of lags AR(1) 추정치 % -3.35698533 1 -0.060892 % % 1% 임계값 5% 임계값 10% 임계값 % -3.819 -3.343 -3.042 % t-통계량 -3.36이 1% 임계값 -3.819와 % 5% 임계값 -3.343 사이에 있다는 것은 % 이 두 시계열이 공적분될 확률이 % 95% 이상임을 의미한다. results=ols(adjcls(:, 1), adjcls(:, 2)); hedgeRatio=results.beta z=results.resid; % hedgeRatio = 1.6766 이 발견됨. % 즉, GLD=1.6766*GDX + z 이고, z는 % 스프레드 GLD-1.6766*GDX로 해석할 수 있으며 % 정상적이어야 한다. % 그림 7.4와 유사한 차트가 생성된다. plot(z);같은 업종 그룹의 임의의 두 주식이 공적분될 것이라고 생각할 경우를 대비한 반례: KO(코카콜라) vs PEP(펩시). 예시 7.1에서 사용한 것과 동일한 공적분 검정을 적용하면 두 시계열이 공적분될 확률이 90% 미만임을 알 수 있다. (epchan.com/book/example7_3.m 프로그램을 직접 실행해보고 비교하라.) KO와 PEP 사이의 최적 선형 회귀를 사용하면, 시계열 도표는 그림 7.5와 유사해진다 — 비정상적인 스프레드.
주가 계열(주식 하나, 주식 페어, 또는 일반적으로 주식 포트폴리오)이 정상적이라면, 정상성이 미래에도 지속되는 한(물론 보장은 없지만) 평균 회귀 전략은 수익성이 보장된다. 하지만 그 역은 참이 아니다. 성공적인 평균 회귀 전략을 갖기 위해 반드시 정상 가격 계열이 필요하지는 않다. 비정상 가격 계열조차도 많은 트레이더들이 활용할 수 있는 단기 반전 기회를 많이 가질 수 있다.
많은 페어 트레이더들은 정상성과 공적분 개념에 익숙하지 않다. 하지만 대부분은 **상관관계(correlation)**에 익숙하다 — 표면적으로 공적분과 같은 의미처럼 보이지만 실제로는 상당히 다르다. 두 가격 계열 간의 상관관계는 실제로 어떤 시간 지평(구체적으로 예를 들면 1일)에 걸친 수익률의 상관관계를 말한다. 두 주식이 양의 상관관계가 있다면, 대부분의 날 가격이 같은 방향으로 움직일 가능성이 높다. 그러나 양의 상관관계가 있다고 해서 두 주식의 장기적 행동에 대해 아무것도 말할 수 없다. 특히, 두 주식이 대부분의 날 같은 방향으로 움직이더라도 장기적으로 가격이 점점 더 멀어지지 않는다는 보장이 없다. 그러나 두 주식이 공적분되어 있고 미래에도 그 상태를 유지한다면, 그 가격들은(적절히 가중치를 부여했을 때) 멀어질 가능성이 낮다. 반면 그들의 일별(또는 주별, 또는 다른 시간 지평) 수익률은 전혀 상관관계가 없을 수 있다.
공적분되어 있지만 상관관계가 없는 두 주식 A, B의 인위적인 예로 그림 7.6을 참조하라. 주식 B는 주식 A와 전혀 상관된 방식으로 움직이지 않는다: 어떤 날은 같은 방향으로, 어떤 날은 반대 방향으로 움직인다. 대부분의 날 주식 B는 전혀 움직이지 않는다. 하지만 A와 B의 주가 스프레드는 잠시 후 항상 약 1달러로 돌아온다는 점을 주목하라.
이 현상의 실제 사례를 찾을 수 있을까? KO vs PEP가 바로 그것이다. example7_3.m 프로그램에서 두 주식이 공적분되지 않는다는 것을 보였다. 하지만 일별 수익률의 상관관계를 검정해보면 상관계수 0.4849가 통계적으로 유의미함을 알 수 있다.
예시 7.3: KO와 PEP의 공적분 vs 상관관계 특성 검정
KO와 PEP의 공적분 검정은 예시 7.2의 GDX와 GLD 검정과 동일하므로 여기서 반복하지 않는다. (epchan.com/book/example7_3.m에서 이용 가능.) 공적분 결과는 확대 Dickey-Fuller 검정의 t-통계량이 –2.14로, 10% 임계값 –3.038보다 크다는 것을 보여준다 — 이는 두 시계열이 공적분될 확률이 90% 미만임을 의미한다.
그러나 다음 코드 조각은 두 시계열 간의 상관관계를 검정한다:
% 상관관계 검정 dailyReturns=(adjcls-lag1(adjcls))./lag1(adjcls); [R,P]=corrcoef(dailyReturns(2:end,:)); % R = % % 1.0000 0.4849 % 0.4849 1.0000 % % % P = % % 1 0 % 0 1 % P 값 0은 두 시계열이 유의미하게 상관되어 있음을 나타낸다.
정상성은 주식 스프레드에만 국한되지 않는다: 특정 통화 환율에서도 발견될 수 있다. 예를 들어, 캐나다 달러/호주 달러(CAD/AUD) 교차 환율은 꽤 정상적인데, 두 통화 모두 원자재 통화이기 때문이다. 선물의 경우도 많은 페어가 공적분될 수 있으며, 채권 같은 고정수익 상품도 마찬가지다. (공적분 선물 페어의 가장 단순한 예는 캘린더 스프레드: 같은 기초 원자재의 다른 만기 월물 선물을 롱·숏하는 것이다. 고정수익 상품의 경우, 같은 발행자이지만 만기가 다른 채권을 롱·숏할 수 있다.)
팩터 모델
금융 논평가들은 “현재 시장은 가치주를 선호한다,” “시장이 실적 성장에 집중하고 있다,” 또는 “투자자들이 인플레이션 수치에 주목하고 있다”와 같은 말을 자주 한다. 이런 공통 수익률 동인들을 어떻게 수량화할 수 있을까?
퀀트 금융에는 팩터 모델(factor models)(차익거래 가격 결정 이론[APT]으로도 알려진)이라는 잘 알려진 프레임워크가 있다. 이는 실적 성장률, 금리, 또는 기업의 시가총액과 같은 수익률의 서로 다른 동인들을 포착하려는 시도다. 이 동인들을 **팩터(factors)**라고 한다. 수학적으로, $N$개 주식의 초과 수익률(수익률에서 무위험 금리를 뺀 값) $R$을 다음과 같이 쓸 수 있다:
$$R = Xb + u$$
여기서 $X$는 팩터 노출도(**팩터 로딩(factor loadings)**으로도 알려진)의 $N \times N$ 행렬이고, $b$는 팩터 수익률의 $N$ 벡터이며, $u$는 특이 수익률의 $N$ 벡터다. (이 양들은 모두 시간에 따라 변하지만, 간편함을 위해 이 명시적 의존성을 생략한다.)
팩터 수익률(factor return), 팩터 노출도(factor exposure), **특이 수익률(specific return)**이라는 용어는 퀀트 금융에서 흔히 사용되며, 그 의미를 이해하는 것이 중요하다. 팩터 수익률은 주식 수익률의 공통 동인으로, 특정 주식에 독립적이다. 팩터 노출도는 이 공통 동인 각각에 대한 민감도다. 이 공통 팩터 수익률로 설명되지 않는 주식 수익률의 일부가 특이 수익률로 간주된다(즉, 해당 주식에 특이하며 APT 프레임워크 내에서 단순한 랜덤 노이즈로 본다). 각 주식의 특이 수익률은 다른 주식의 특이 수익률과 상관관계가 없다고 가정한다.
이를 파마-프렌치 3팩터 모델(Fama-French Three-Factor Model)(Fama and French, 1992)이라는 단순한 팩터 모델로 설명해보자. 이 모델은 주식의 초과 수익률이 세 가지 팩터 노출도에만 선형적으로 의존한다고 가정한다: 베타(시장 지수에 대한 민감도), 시가총액, 그리고 장부가-주가 비율(book-to-price ratio). 이 팩터 노출도는 주식마다, 그리고 각 시간 주기마다 다르다. (팩터 노출도는 종종 주식 우주 내에서의 평균이 0이 되고 표준편차가 1이 되도록 정규화된다.)
팩터 노출도를 계산하는 방법은 알았는데, 팩터 수익률과 특이 수익률은 어떻게 구할까? 팩터 수익률과 특이 수익률은 직접 계산할 수 없다 — 주식의 초과 수익률을 팩터 노출도에 대해 다변량 선형 회귀를 실행해서 그 값을 추론해야 한다. 이 선형 회귀에서 각 주식은 하나의 데이터 포인트를 나타내며, 각 시간 주기별로 별도의 선형 회귀를 실행하거나, 여러 시간 주기에 걸친 평균 값을 원한다면 모든 시간 주기의 값을 하나의 훈련 세트로 집계해서 한 번의 회귀를 실행하면 된다.
파마-프렌치 3팩터 모델에 대해 여러 시간 주기에 걸쳐 이 선형 회귀를 수행하면, 시가총액 팩터 수익률이 보통 음수임을 알 수 있다 — 즉, 소형주가 대형주보다 보통 높은 성과를 낸다는 것이다. 그리고 장부가-주가 비율 팩터 수익률은 보통 양수다 — 가치주가 성장주보다 보통 높은 성과를 낸다는 의미다. 대부분의 주식이 시장 지수와 양의 상관관계가 있으므로 베타 팩터 수익률도 양수다.
파마-프렌치 모델이 팩터 선택의 독점권을 가지는 것은 아니다. 창의성과 합리성이 허용하는 한 얼마든지 많은 팩터를 구성할 수 있다. 예를 들어 자기자본이익률(ROE)을 팩터 노출도로, 주식 수익률과 기준금리(prime rate)의 상관관계를 다른 팩터로 선택할 수 있다. 경제적·펀더멘털·기술적 팩터 중 원하는 것을 얼마든지 선택할 수 있다. 선택한 팩터 노출도가 합리적인지 여부가, 팩터 모델이 주식의 초과 수익률을 충분히 설명할 수 있는지를 결정한다. 팩터 노출도가 (결과적으로 모델 전체가) 잘못 선택되면 선형 회귀는 규모가 큰 특이 수익률을 만들어내며 적합의 $R^2$ 통계량은 낮아진다. 전문가들에 따르면(Grinold and Kahn, 1999), 1,000개 주식의 월별 수익률과 50개 팩터를 사용하는 좋은 팩터 모델의 $R^2$ 통계량은 전형적으로 30~40% 수준이다.
이런 팩터 모델들이 단지 사후적으로만 설명력을 가지는 것처럼 보일 수 있다 — 즉, 과거 수익률과 팩터 노출도가 주어지면 그 과거 기간의 팩터 수익률을 계산할 수 있다는 것이다. 하지만 그 역사적 팩터 수익률이 트레이딩에 무슨 소용인가? 팩터 수익률은 개별 주식 수익률보다 더 안정적인 경우가 많다는 것이 밝혀졌다. 다시 말해, 그것들은 모멘텀을 가진다. 따라서 현재 기간(회귀 적합으로 알 수 있는)의 값이 다음 시간 주기에도 변하지 않는다고 가정할 수 있다. 이것이 사실이라면, 물론 팩터 노출도가 잘 선택되어 시변(time-varying) 특이 수익률이 유의미하지 않은 한, 초과 수익률도 예측할 수 있다.
잠재적 혼란을 일으킬 수 있는 한 가지 점을 명확히 하겠다. 팩터 모델이 예측 모델로서(따라서 트레이딩을 위해) 유용하려면 팩터 수익률이 모멘텀을 가져야 한다고 했지만, 그것이 팩터 모델이 주식 수익률의 평균 회귀를 포착할 수 없다는 의미는 아니다. 실제로 평균 회귀를 포착하는 팩터 노출도를 구성할 수 있다 — 예를 들어 직전 기간 수익률의 음수(negative). 주식 수익률이 실제로 평균 회귀한다면 그에 대응하는 팩터 수익률은 양수가 될 것이다.
펀더멘털 팩터를 기반으로 한 트레이딩 모델을 구축하는 데 관심이 있다면, 역사적 팩터 데이터를 얻을 수 있는 공급 업체들이 있다:
- Capital IQ: www.capitaliq.com
- Compustat: www.compustat.com
- MSCI Barra: www.mscibarra.com
- Northfield Information Services: www.northinfo.com
- Quantitative Services Group: www.qsg.com
예시 7.4: 팩터 모델의 예로서 주성분 분석(PCA)
앞서 설명한 팩터 노출도의 예들은 전형적으로 경제적(예: 금리), 펀더멘털(예: 장부가-주가 비율), 또는 기술적(예: 직전 기간 수익률)인 것들이다. 대규모 주식 포트폴리오에 대해 이런 팩터 노출도의 역사적 값을 얻어서 팩터 모델을 백테스트하는 것은 보통 상당히 비싸고 독립 트레이더에게는 그다지 현실적이지 않다. (이런 데이터를 구입할 재정적 여유가 있는 사람은 본문의 목록을 참조하라.) 그러나 구성하는 데 역사적 수익률 외에 아무것도 필요 없는 팩터 모델이 하나 있다. 이 방법이 바로 **주성분 분석(Principal Component Analysis, PCA)**이다.
PCA를 사용해 팩터 노출도와 팩터 수익률을 구성하려면, 팩터 노출도가 추정 기간 동안 일정(시간 독립적)하다고 가정해야 한다. (이는 직전 기간 수익률에 의존하는 팩터 노출도인 평균 회귀나 모멘텀을 나타내는 팩터들을 배제한다.) 더 중요하게는, 팩터 수익률이 **비상관(uncorrelated)**이라고 가정한다 — 즉, 공분산 행렬 $\langle bb^T \rangle$이 대각 행렬이라는 것이다. APT 방정식 $R = Xb + u$에서 행렬 $X$의 열로 공분산 행렬 $\langle RR^T \rangle$의 고유벡터를 사용하면, 기초 선형대수학으로 $\langle bb^T \rangle$이 실제로 대각 행렬임을 알 수 있다. 더 나아가, $\langle RR^T \rangle$의 고유값은 팩터 수익률 $b$의 분산 바로 그것이다. 물론 팩터 수가 주식 수와 같으면 팩터 분석을 사용할 의미가 없다 — 보통 상위 몇 개의 고유값에 해당하는 고유벡터만 선택해서 행렬 $X$를 구성한다. 선택할 고유벡터의 수는 트레이딩 모델을 최적화하기 위해 조정할 수 있는 파라미터다.
다음 MATLAB 프로그램(epchan.com/book/example7_4.m)에서 PCA를 S&P 600 소형주에 적용하는 가능한 트레이딩 전략을 예시한다. 팩터 수익률이 모멘텀을 가진다는 가정, 즉 현재 시간 주기에서 다음 주기로 일정하게 유지된다는 가정을 기반으로 한 전략이다. 따라서 이 팩터들을 기반으로 기대 수익률이 가장 높은 주식을 매수하고, 기대 수익률이 가장 낮은 주식을 공매도할 수 있다. 이 전략의 평균 수익률이 음수임을 알게 될 것이다 — 이 가정이 상당히 부정확하거나 특이 수익률이 이 전략이 작동하기에 너무 크다는 것을 시사한다.
clear; % 팩터 노출도 결정을 위한 추정(훈련) 기간으로 룩백 일수 사용 lookback=252; numFactors=5; % 팩터 5개만 사용 % 트레이딩 전략: 기대 1일 수익률이 상위 topN개 주식 매수 topN=50; % SP600 소형주 테스트. (이 MATLAB 바이너리 입력 파일에는 % tday, stocks, op, hi, lo, cl 배열이 포함되어 있다.) load('IJR_20080114'); mycls=fillMissingData(cl); positionsTable=zeros(size(cl)); % dailyret의 행은 서로 다른 시간 주기의 관측값 dailyret=(mycls-lag1(mycls))./lag1(mycls); for t=lookback+1:length(tday) % R의 열은 서로 다른 관측값 R=dailyret(t-lookback+1:t,:)'; % 수익률이 없는 주식 제외 hasData=find(all(isfinite(R), 2)); R=R(hasData,:); avgR=smartmean(R, 2); % 수익률에서 평균 빼기 R=R-repmat(avgR, [1 size(R, 2)]); % 공분산 행렬 계산 (관측값을 행으로) covR=smartcov(R'); % X는 팩터 노출도 행렬, B는 팩터 수익률의 분산 % covR의 고유벡터를 열 벡터로 사용 [X, B]=eig(covR); % numFactors개만 유지 X(:, 1:size(X, 2)-numFactors)=[]; % b는 t-1에서 t까지의 팩터 수익률 results=ols(R(:, end), X); b=results.beta; % Rexp는 팩터 수익률이 일정하다는 가정 하에 % 다음 기간의 기대 수익률 Rexp=avgR+X*b; [foo idxSort]=sort(Rexp, 'ascend'); % 기대 수익률 최하위 topN개 주식 공매도 positionsTable(t, hasData(idxSort(1:topN)))=-1; % 기대 수익률 최상위 topN개 주식 매수 positionsTable(t, ... hasData(idxSort(end-topN+1:end)))=1; end % 트레이딩 전략의 일별 수익률 계산 ret=... smartsum(backshift(1, positionsTable).*dailyret, 2); % 트레이딩 전략의 연환산 평균 수익률 계산 avgret=smartmean(ret)*252; % 매우 저조한 수익률! % avgret = % % -1.8099이 프로그램은
smartcov라는 함수를 사용하는데, 이는 많은 주식의 일별 수익률 벡터를 기반으로 공분산 행렬을 계산한다. MATLAB 내장 함수cov와 달리 수익률이 없는 날(NaN 값)을 무시한다.
실제 트레이딩에서 팩터 모델의 성과는 어떨까? 당연히 어떤 팩터 모델을 사용하느냐에 대부분 달려 있다. 하지만 펀더멘털 및 거시경제 팩터에 지배되는 팩터 모델들에 대해 한 가지 일반적인 관찰을 할 수 있다 — 투자자들이 기업 가치를 평가할 때 동일한 지표를 계속 사용한다는 사실에 의존한다는 한 가지 주요 약점이 있다. 이는 팩터 모델이 작동하려면 팩터 수익률이 모멘텀을 가져야 한다는 것을 다른 방식으로 표현한 것에 불과하다.
예를 들어, 가치(장부가-주가 비율) 팩터 수익률은 보통 양수이지만, 1990년대 후반의 인터넷 버블 시기와 2007년 8월·12월처럼 투자자들이 성장주를 선호하는 기간이 있다. 이코노미스트지가 지적했듯이, 2007년에 성장주가 다시 인기를 되찾은 한 가지 이유는 가치주에 대한 가격 프리미엄이 크게 줄었다는 단순한 사실이다(Economist, 2007b). 또 다른 이유는 미국 경기가 둔화됨에 따라 투자자들이 경기 침체의 피해를 입은 기업 대신 여전히 증가하는 수익을 창출하는 기업을 점점 더 선호했기 때문이다.
따라서 투자자들의 밸류에이션 방법이 바뀌는 시기에 팩터 모델이 급격한 낙폭을 경험하는 것은 드문 일이 아니다 — 비록 짧은 기간에 불과하더라도. 하지만 이 문제는 주식을 오버나이트 보유하는 사실상 모든 트레이딩 모델에 공통적으로 나타난다.
청산 전략
진입 신호는 각 트레이딩 전략에 매우 특이적이지만, 청산 신호를 생성하는 방식에는 그다지 다양성이 없다. 청산 신호는 다음 중 하나에 기반한다:
- 고정 보유 기간
- 목표 가격 또는 이익 상한선
- 최신 진입 신호
- 스톱 가격
고정 보유 기간은 모멘텀 모델, 반전 모델, 또는 모멘텀 또는 반전 기반일 수 있는 계절성 트레이딩 전략 등 모든 트레이딩 전략의 기본 청산 전략이다. (계절성 트레이딩에 대해서는 나중에 더 설명한다.) 앞서 모멘텀이 생성되는 한 가지 방법은 정보의 느린 확산이라고 했다. 이 경우 프로세스는 유한한 수명을 가진다. 이 유한한 수명의 평균값이 최적 보유 기간을 결정하며, 이는 보통 백테스트에서 발견할 수 있다.
모멘텀 모델의 최적 보유 기간 결정에 관한 한 가지 주의 사항: 앞서 말했듯이 이 최적 기간은 정보 확산 속도의 증가와 이 트레이딩 기회를 포착하는 트레이더 수의 증가로 인해 보통 줄어든다. 따라서 백테스트 기간에 1주일의 보유 기간으로 잘 작동했던 모멘텀 모델이 지금은 1일 보유 기간으로만 작동할 수 있다. 더 나쁘게는, 전략 전체가 1년 후에는 수익성이 없어질 수도 있다. 또한 트레이딩 전략의 백테스트를 사용해 보유 기간을 결정하는 것은 데이터 스누핑 편향으로 가득할 수 있는데, 실제 거래 수가 제한될 수 있기 때문이다. 안타깝게도 뉴스나 이벤트로 촉발되는 모멘텀 전략에는 다른 대안이 없다. 그러나 평균 회귀 전략의 경우, 실제 거래 수에 의존하지 않는 최적 보유 기간을 결정하는 더 통계적으로 강건한 방법이 있다.
시계열의 평균 회귀는 오른슈타인-울렌벡(Ornstein-Uhlenbeck) 공식(Unlenbeck, 1930)이라는 방정식으로 모델링할 수 있다. 주식 페어의 평균 회귀 스프레드(롱 시장 가치 빼기 숏 시장 가치)를 $z(t)$로 나타내면 다음과 같이 쓸 수 있다:
$$dz(t) = -\theta(z(t) - \mu)dt + dW$$
여기서 $\mu$는 시간에 걸친 가격의 평균값이고, $dW$는 단순한 랜덤 가우시안 노이즈다. 일별 스프레드 값의 시계열이 주어지면, 스프레드의 일별 변화 $dz$를 스프레드 자체에 대해 선형 회귀 적합을 수행해서 $\theta$와 $\mu$를 쉽게 구할 수 있다. 수학자들에 따르면 $z(t)$의 평균값은 그 평균 $\mu$를 향해 지수적으로 감소하며, 이 지수적 감소의 **반감기(half-life)**는 $\ln(2)/\theta$로, 스프레드가 평균에서의 초기 편차의 절반으로 회귀하는 데 걸리는 기대 시간이다. 이 반감기를 평균 회귀 포지션의 최적 보유 기간을 결정하는 데 사용할 수 있다. 거래가 촉발된 날뿐만 아니라 전체 시계열을 사용해서 $\theta$의 최선 추정치를 구할 수 있기 때문에, 반감기 추정은 트레이딩 모델에서 직접 구한 것보다 훨씬 더 강건하다. 예시 7.5에서 GLD와 GDX 사이의 우리가 좋아하는 스프레드를 사용해 이 평균 회귀 반감기 추정 방법을 시연한다.
예시 7.5: 평균 회귀 시계열의 반감기 계산
예시 7.2에서 GLD와 GDX 사이의 평균 회귀 스프레드를 사용해 그 평균 회귀의 반감기 계산을 설명할 수 있다. MATLAB 코드는 epchan.com/book/example7_5.m에서 이용 가능하다. (프로그램의 첫 번째 부분은 example7_2.m과 동일하다.)
% === 여기 시작 부분에 example7_2.m을 삽입 === prevz=backshift(1, z); % 이전 시간 단계의 z dz=z-prevz; dz(1)=[]; prevz(1)=[]; % dz=theta*(z-mean(z))dt+w를 가정 % w는 오차항 results=ols(dz, prevz-mean(prevz)); theta=results.beta; halflife=-log(2)/theta % halflife = % % 10.0037프로그램은 GLD-GDX의 평균 회귀 반감기가 약 10일임을 발견한다. 이는 이 스프레드가 수익성이 생기기 전에 보유해야 할 기간이 대략 얼마인지를 알려준다.
증권이 평균 회귀한다고 믿는다면 이미 목표 가격이 준비되어 있다 — 증권 역사적 가격의 평균값, 즉 오른슈타인-울렌벡 공식의 $\mu$가 그것이다. 이 목표 가격은 반감기와 함께 청산 신호로 사용할 수 있다(두 기준 중 하나가 충족되면 청산).
목표 가격은 회사의 펀더멘털 밸류에이션 모델이 있는 경우 모멘텀 모델에서도 사용할 수 있다. 하지만 펀더멘털 밸류에이션은 기껏해야 부정확한 과학이므로, 목표 가격은 평균 회귀 모델에서만큼 모멘텀 모델에서 쉽게 정당화되지 않는다.
트레이딩 모델을 실행하고 있다고 가정해보자. 모델 신호에 기반해 포지션에 진입했다. 얼마 후 모델을 다시 실행했을 때 최신 신호가 기존 포지션과 반대임을 발견했다면(예: 기존 숏 포지션이 있는데 최신 신호가 “매수”인 경우), 두 가지 선택지가 있다. 최신 신호를 사용해 기존 포지션을 청산하고 플랫(flat)이 되거나, 기존 포지션을 청산한 다음 반대 포지션에 진입하는 것이다. 어느 쪽이든 최신 더 최근의 진입 신호를 기존 포지션의 청산 신호로 사용한 것이다. 이는 트레이딩 모델을 최적 보유 기간보다 짧은 간격으로 실행할 수 있을 때 청산 신호를 생성하는 일반적인 방법이다.
진입 모델 실행에 기반한 포지션 청산 전략은 스톱 로스 전략이 권장되는지도 알려준다. 모멘텀 모델에서 최근 진입 신호가 기존 포지션과 반대라는 것은 모멘텀의 방향이 바뀌었음을 의미하며, 따라서 포지션에서 손실(또는 더 정확하게는 낙폭)이 발생했다는 것이다. 지금 이 포지션을 청산하는 것은 스톱 로스와 거의 유사하다. 임의적인 스톱 로스 가격을 부과하여 추가 조정 가능한 파라미터를 도입하고 데이터 스누핑 편향을 불러오는 것보다, 최신 진입 신호에 기반한 청산은 모멘텀 모델의 근거에 명확히 정당화된다.
평균 회귀 모델을 실행하는 경우와의 병렬 상황을 생각해보자. 기존 포지션이 손실을 입었다면, 평균 회귀 모델을 다시 실행해도 같은 방향의 새로운 신호만 생성된다. 따라서 진입 신호를 위한 평균 회귀 모델은 절대 스톱 로스를 권하지 않는다. (오히려 반전이 너무 진행되어 반대 진입 임계값에 도달했을 때 목표 가격 또는 이익 상한선을 권할 수 있다.) 그리고 실제로, 보유 기간이나 이익 상한선에 기반한 평균 회귀 모델이 권하는 포지션을 청산하는 것이 스톱 로스보다 훨씬 합리적이다. 이 경우 스톱 로스는 흔히 가장 최악의 시점에 청산하는 것을 의미한다. (유일한 예외는 최근 뉴스 때문에 갑자기 모멘텀 레짐에 진입했다고 판단하는 경우다.)
계절성 트레이딩 전략
이 유형의 트레이딩 전략은 **캘린더 효과(calendar effect)**라고도 한다. 일반적으로 매년 특정 고정 날짜에 특정 증권을 매수 또는 매도하고, 다른 고정 날짜에 포지션을 청산할 것을 권한다. 이 전략들은 주식과 원자재 선물 시장 모두에 적용됐다. 하지만 저자의 경험에 따르면, 이 트레이딩 기회가 널리 알려졌기 때문인지 주식 시장의 계절성 상당 부분이 최근 몇 년 사이 약화되거나 심지어 사라졌다. 반면 원자재 선물의 일부 계절성 트레이딩은 여전히 수익성이 있다.
주식에서 가장 유명한 계절성 트레이딩은 **1월 효과(January effect)**라고 불린다. 실제로 이 트레이딩에는 많은 버전이 있다. 한 버전에 따르면 전년도 달력 연도에 최악의 수익률을 냈던 소형주가 1월에 최선의 수익률을 냈던 소형주보다 높은 수익률을 거둔다고 한다(Singal, 2006). 그 근거는 투자자들이 세금 손실 혜택을 위해 12월에 손실 종목을 매도하기를 좋아한다는 것이다 — 이것이 해당 주가에 추가적인 하락 압력을 만들어낸다. 이 압력이 1월에 사라지면 주가가 어느 정도 회복된다. 이 전략은 2006~07년에는 작동하지 않았지만, 2008년 1월에는 훌륭하게 작동했다 — 평균 회귀 전략에 눈부신 달이었다. (그 1월은 Société Générale에서 대규모 트레이딩 스캔들이 발생한 달로, 이것이 연방준비제도를 시장 개장 전에 긴급 75베이시스포인트 금리 인하를 단행하게 간접적으로 만들었을 수 있다. 이 혼란으로 많은 모멘텀 전략이 큰 타격을 입었지만, 평균 회귀 전략은 초기 급격한 하락과 이후 연준의 극적인 구제 조치로 크게 이익을 봤다.) 이 1월 효과 전략을 백테스트하는 코드는 예시 7.6에 제시한다.
예시 7.6: 1월 효과 백테스팅
S&P 600 소형주에 적용된 1월 효과 전략의 수익률을 계산하는 MATLAB 코드다. (소스 코드는 epchan.com/book/example7_6.m에서 찾을 수 있으며, 입력 데이터도 함께 제공된다.)
clear; load('IJR_20080131'); onewaytcost=0.0005; % 5bp 단방향 거래비용 years=... year(cellstr(datestr(datenum(cellstr(... num2str(tday)), 'yyyymmdd')))); months=... month(cellstr(datestr(datenum(cellstr(... num2str(tday)), 'yyyymmdd')))); nextdayyear=fwdshift(1, years); nextdaymonth=fwdshift(1, months); lastdayofDec=find(months==12 & nextdaymonth==1); lastdayofJan=find(months==1 & nextdaymonth==2); % lastdayofDec는 2004년부터 시작하므로 % lastdayofJan에서 2004년 제거 lastdayofJan(1)=[]; % 각 lastdayofJan 날짜가 % 해당 lastdayofDec 날짜 이후임을 보장 assert(all(tday(lastdayofJan) > tday(lastdayofDec))); eoy=find(years~=nextdayyear); % 연말(End Of Year) 인덱스 eoy(end)=[]; % 마지막 인덱스는 연말이 아님 % eoy 날짜가 lastdayofDec 날짜와 일치하는지 확인 assert(all(tday(eoy)==tday(lastdayofDec))); annret=.. (cl(eoy(2:end),:)-cl(eoy(1:end-1),:))./.. cl(eoy(1:end-1),:); % 연간 수익률 janret=.. (cl(lastdayofJan(2:end),:)-.. cl(lastdayofDec(2:end),:))./cl(lastdayofDec(2:end),:); % 1월 수익률 for y=1:size(annret, 1) % 유효한 연간 수익률이 있는 종목 선택 hasData=.. find(isfinite(annret(y,:))); % 전년도 수익률 기준으로 종목 정렬 [foo sortidx]=sort(annret(y, hasData), 'ascend'); % 수익률 하위 분위 종목 매수, % 수익률 상위 분위 종목 매도 topN=round(length(hasData)/10); % 포트폴리오 수익률 portRet=.. (smartmean(janret(y, hasData(sortidx(1:topN))))-. smartmean(janret(y, hasData(. sortidx(end-topN+1:end)))))/2-2*onewaytcost; fprintf(1,'Last holding date %i: Portfolio return=%7.4f\n', ... tday(lastdayofDec(y+1)), portRet); end % 출력값은 다음과 같아야 함 % Last holding date 20051230: Portfolio return=-0.0244 % Last holding date 20061229: Portfolio return=-0.0068 % Last holding date 20071231: Portfolio return= 0.0881이 프로그램은 여러 유틸리티 함수를 사용한다. 첫 번째는
assert함수로, 프로그램이 예상대로 작동하는지 확인하는 데 매우 유용하다.function assert(pred, str) % ASSERT 조건이 참이 아니면 오류를 발생시킨다. % assert(pred, string) if nargin<2, str = ''; end if ~pred s = sprintf('assertion violated: %s', str); error(s); end두 번째는
fwdshift함수로,lag1함수와 반대 방향으로 작동한다: 시계열을 한 스텝 앞으로 이동시킨다.function y=fwdshift(day,x) assert(day>=0); y=[x(day+1:end,:,:); .. NaN*ones(day,size(x,2), size(x, 3))];
주식 시장에서 또 다른 계절성 전략이 비교적 최근에 제안됐다 (Heston and Sadka, 2007). 전략은 매우 단순하다: 매달, 1년 전 같은 달에 가장 좋은 성과를 낸 종목들을 매수하고, 가장 나쁜 성과를 낸 종목들을 공매도한다. 2002년 이전에는 거래비용 차감 전 평균 연간 수익률이 13%를 넘었다. 그러나 저자가 확인한 바로는 그 이후로 이 효과가 사라진 것으로 나타났으며, 예시 7.7에서 직접 확인할 수 있다.
예시 7.7: 연도별 계절성 추세 전략 백테스팅
앞서 소개한 연도별 계절성 추세 전략의 MATLAB 코드다. (소스 코드는 epchan.com/book/example7_7.m에서 내려받을 수 있으며, 데이터도 함께 제공된다.) 데이터는 2007년 11월 23일 기준 S&P 500 지수를 바탕으로 하므로 생존 편향이 있음에 유의하라.
clear; load('SPX_20071123', 'tday', 'stocks', 'cl'); % 월말에 해당하는 날의 인덱스를 찾는다. monthEnds=find(isLastTradingDayOfMonth(tday)); monthlyRet=.. (cl(monthEnds,:)-lag1(cl(monthEnds,:)))./.. lag1(cl(monthEnds,:)); mycl=fillMissingData(cl); % 월별 수익률을 오름차순으로 정렬 [monthlyRetSorted sortIndex]=sort(monthlyRet, 2); % 전년도 같은 달의 정렬된 월별 수익률 prevYearMonthlyRetSorted=backshift(12, monthlyRetSorted); % 전년도 정렬 인덱스 prevYearSortIndex=backshift(12, sortIndex); positions=zeros(size(monthlyRet)); for m=13:size(monthlyRet, 1) hasReturns=. . . isfinite(prevYearMonthlyRetSorted(m,:)) & .. isfinite(cl(monthEnds(m-1),:)); mySortIndex=prevYearSortIndex(m, hasReturns); % 상위 분위 종목을 롱, 하위 분위 종목을 숏 topN=floor(length(mySortIndex)/10); positions(m-1, mySortIndex(1:topN))=-1; positions(m-1, .. mySortIndex(end-topN+1:end))=1; end ret=smartsum(lag1(positions).*monthlyRet, 2); avgannret=12*smartmean(ret); sharpe=sqrt(12)*smartmean(ret)/smartstd(ret); fprintf(1, .. 'Avg ann return=%7.4f Sharpe ratio=%7.4f\n', .. avgannret, sharpe); % 출력값은 다음과 같아야 함 % Avg ann return=-0.9167 Sharpe ratio=-0.1055이 프로그램에는 두 가지 유틸리티 함수가 포함된다. 첫 번째는
isLastTradingDayOfMonth로, 거래일 배열에서 해당 거래일이 월의 마지막 거래일인지를 나타내는 논리 배열을 반환한다.function isLastTradingDayOfMonth=.. isLastTradingDayOfMonth(tday) % isLastTradingDayOfMonth= % isLastTradingDayOfMonth(tday) 는 논리 배열을 반환한다. % tday(t)가 월의 마지막 거래일이면 True. tdayStr=datestr(datenum(num2str(tday), 'yyyymmdd')); todayMonth=month(tdayStr); tmrMonth=fwdshift(1, todayMonth); % 내일의 월 isLastTradingDayOfMonth=false(size(tday)); isLastTradingDayOfMonth(todayMonth~=tmrMonth & .. isfinite(todayMonth) & isfinite(tmrMonth))=true;두 번째는
backshift함수로,lag1과 유사하지만 1스텝이 아닌 임의의 기간만큼 이동할 수 있다.function y=backshift(day,x) % y=backshift(day,x) assert(day>=0); y=[NaN(day,size(x, 2), size(x, 3));x(1:end-day,:,:)];최근 5년간의 데이터만으로 테스트해도 평균 수익률이 더욱 나쁜 것을 확인할 수 있다.
주식의 계절성 전략과 달리, 원자재 선물의 계절성 전략은 여전히 건재하다. 특정 원자재에 대한 계절적 수요가 단순한 투기가 아닌 “실질적인” 경제적 필요에 의해 움직이기 때문일 것이다.
가장 직관적인 원자재 계절성 거래 중 하나는 가솔린 선물 거래다: 4월 중순에 5월물 가솔린 선물 계약을 매수하고, 4월 말에 매도한다. 이 거래는 2008년 4월 기준으로 최근 11년간 매년 수익을 냈다. 여름 드라이빙 시즌이 다가오면서 봄철에 북미의 가솔린 선물 가격이 상승하는 것은 예측 가능한 패턴으로 보인다.
가솔린 선물 계절성 거래
여름 드라이빙 시즌이 다가오면 가솔린 선물 가격이 계절적으로 상승할 것임은 놀랄 일이 아니다. 트레이더에게 남은 문제는 어느 월물을 사고, 얼마나 보유하느냐다. 문헌을 검토한 결과, 지금까지 찾은 가장 좋은 거래는 NYMEX에서 거래되는 무연 가솔린 선물(심볼: RB) 1계약을 4월 13일 종가(휴일이면 다음 거래일)에 매수하고, 4월 25일 종가(휴일이면 이전 거래일)에 매도하는 것이다. 역사적으로 1995년 이후 매년 수익을 냈다. 다음은 이 포지션의 연간 P&L과 최대 낙폭(진입일인 1일째부터 측정)이다 (2007–08년 수치는 실제 거래 결과):
연도 P&L (달러) 최대 낙폭 (달러) 1995 1,037 0 1996 1,638 −2,226 1997 227 −664 1998 118 0 1999 197 −588 2000 735 −315 2001 1,562 0 2002 315 0 2003 1,449 −38 2004 361 −907 2005 6,985 −25 2006 890 0 2007* 2,286 −9,816 2008* 4,741 0 *실제 거래 결과는 2 × QU로 표시됨.
리스크를 줄이고 싶다면, NYMEX에서 거래되는 미니 가솔린 선물 QU(RB의 절반 크기)를 매수할 수 있지만 유동성이 낮다.
(이 연구는 PFGBest.com의 Paul Kavanaugh가 발표한 월별 계절성 거래에서 영감을 받았다. Fielden, 2005 또는 Toepke, 2004 참조.)
가솔린 수요 외에도, 여름이 다가오면서 에어컨 전력 공급을 위한 발전소의 수요 증가로 천연가스 수요도 올라간다. 이 글을 쓰는 시점 기준으로 13년 연속 수익을 낸 천연가스 선물 거래가 있다: 2월 말에 6월물 천연가스 선물 계약을 매수하고, 4월 중순에 매도한다.
천연가스 선물 계절성 거래*
여름 시즌은 에어컨 전기 공급을 위한 발전소의 수요 증가로 천연가스 수요도 증가하는 시기다. 이는 NYMEX 천연가스 선물(심볼: NG) 6월물을 2월 25일 종가(휴일이면 다음 거래일)에 매수하고, 4월 15일(휴일이면 이전 거래일)에 포지션을 청산하는 계절성 거래를 제안한다. 이 거래는 이 글을 쓰는 시점 기준으로 14년 연속 수익을 냈다. 다음은 이 거래의 연간 P&L과 최대 낙폭(백테스트 및 실제 거래 결과 모두 포함)이다:
연도 P&L (달러) 최대 낙폭 (달러) 1995 1,970 0 1996 3,090 −630 1997 450 −430 1998 2,150 −1,420 1999 4,340 −370 2000 4,360 0 2001 2,730 −1,650 2002 9,860 0 2003 2,000 −5,550 2004 5,430 0 2005 2,380 −230 2006 2,250 −1,750 2007 800 −7,470 2008* 10,137 −1,604 *실제 거래 결과는 4 × QG로 표시됨.
천연가스 선물은 변동성이 악명 높게 크며, 헤지펀드(예: Amaranth Advisors, 60억 달러 손실)와 대형 은행(예: 몬트리올 은행, 4억 5천만 달러 손실)에서 대규모 손실이 발생한 전례가 있다. 이 거래를 시도하려면 전체 NG 계약의 절반 크기인 미니 QG 선물로 소규모 자본부터 시작하는 것이 신중하다.
*이 글은 저자의 구독 서비스(epchan.com/subscription)에 최초 게재됐으며 최신 수치로 업데이트됐다. 사용자 이름 “sharperatio”와 비밀번호로 접근할 수 있다.
원자재 선물 계절성 거래에는 한 가지 단점이 있다: 연간 단 한 번만 거래가 발생하므로 백테스트 성과가 데이터 스누핑 편향의 결과인지 판단하기 어렵다. 이를 완화하는 방법 중 하나는 약간 다른 진입·청산 날짜를 적용해 수익성이 유지되는지 확인하는 것이다. 또한 경제적으로 합리적인 계절성 거래만 고려해야 한다. 가솔린과 천연가스 거래는 이 두 가지 기준을 충분히 충족한다.
고빈도 트레이딩 전략
챕터 6에서 언급했듯이 샤프 비율 극대화가 목표라면, 주식을 오버나이트로 보유하기보다 고빈도로 거래하는 것이 유리하다.
고빈도 트레이딩이란 무엇이며, 왜 더 높은 샤프 비율을 낼까? 일부 전문가들은 몇 초 이상 포지션을 보유하는 전략은 고빈도가 아니라고 하지만, 여기서는 오버나이트 포지션을 보유하지 않는 모든 전략을 포함하는 넓은 정의를 사용한다. 초기 고빈도 전략 대부분은 풍부한 유동성 덕분에 외환 시장에 적용됐고, 이후 선물 시장으로 확장됐다. 최근 6~7년 사이에는 주식 시장의 유동성 증가, 고빈도 역사적 데이터베이스의 이용 가능성, 그리고 컴퓨팅 파워의 급격한 성장에 힘입어 주식 트레이딩에도 광범위하게 적용되고 있다.
이 전략들의 샤프 비율이 높은 이유는 단순하다: **대수의 법칙(law of large numbers)**이다. 하루에 수백에서 수천 건의 베팅을 하면, 수가 많을수록 평균 수익률 대비 편차는 더 작아진다. 전략이 건전하고 양의 평균 수익률을 생성한다면, 하루하루의 편차를 최소화할 수 있다. 이 높은 샤프 비율 덕분에 레버리지를 장기 전략보다 훨씬 높게 설정할 수 있고, 이는 자기자본 대비 수익률을 종종 놀라운 수준으로 끌어올린다.
물론, 대수의 법칙이 왜 특정 고빈도 전략이 애초에 양의 평균 수익률을 내는지는 설명하지 못한다. 고빈도 전략에는 평균 회귀하는 것도 있고 추세를 따르는 것도 있으며, 시장 중립적인 페어 트레이더도 있고 롱 온리 방향성 트레이더도 있다. 공통점은 있다: 이 전략들은 시장의 작은 비효율성을 활용하거나, 소액의 수수료를 받고 일시적인 유동성 수요를 충족해준다. 이런 비효율성과 유동성 필요는 하루하루 꾸준히 지속되어 일관된 일별 수익을 가능하게 한다. 또한, 고빈도 전략은 통상 소규모 포지션으로 거래하므로 리스크 관리가 비교적 용이하다. 손실이 발생하면 빠르게 레버리지를 낮출 수 있고, 상황이 심각해지면 완전히 현금화할 수도 있다.
반면, 보유 기간이 분 단위 또는 초 단위로 줄어들면 백테스트가 쉽지 않다. 거래비용이 무엇보다 중요해지며, 최종 가격 데이터만으로는 부족하다 — 매수·매도 호가(bid/ask)와 최종 호가가 있어야 체결 방향에 따른 수익성을 확인할 수 있다. 때로는 역사적 오더북 정보까지 필요하다. 진정한 검증은 매우 정교한 시뮬레이터가 없는 한 실시간 운용을 통해서만 가능한 경우가 많다.
백테스트는 고빈도 트레이딩에서 게임의 일부일 뿐이다. 전문 고빈도 트레이딩 회사들은 전략을 C로 작성하고, 마이크로초 단위 지연을 줄이기 위해 서버를 거래소나 인터넷 백본 근처에 배치한다. 따라서 샤프 비율이 매력적이더라도 진정한 고빈도 트레이딩은 독립 트레이더가 처음부터 달성하기 쉽지 않다. 그러나 전문성과 자원이 축적됨에 따라 점진적으로 이 목표를 향해 나아가는 것은 충분히 가능하다.
고레버리지 포트폴리오 vs. 고베타 포트폴리오: 무엇이 더 나은가?
챕터 6에서는 켈리 공식을 바탕으로 최적 레버리지를 논의했다. 이 챕터 앞부분의 팩터 모델 섹션에서는 파마-프렌치 3팩터 모델을 설명했는데, 이 모델은 포트폴리오(또는 개별 주식)의 수익률이 베타에 비례한다고 제안한다. 다시 말해, 레버리지를 높이거나 고베타 주식을 선택함으로써 수익률을 높일 수 있다. 두 가지 방법 모두 합리적으로 보인다.
저베타 포트폴리오에 더 높은 레버리지를 적용해 고베타 포트폴리오의 베타와 맞추는 것은 어렵지 않다. 포트폴리오 주식들의 평균 시가총액과 장부가치가 동일하다면, 파마-프렌치 모델에 따르면 평균 수익률도 동일해진다. 그렇다면 어느 포트폴리오를 보유하든 무관한가?
답은 아니다. 챕터 6을 상기하면, 켈리 레버리지를 사용할 때 포트폴리오의 장기 복리 성장률은 평균 수익률이 아닌 샤프 비율의 제곱에 비례한다. 따라서 두 포트폴리오의 평균 수익률이 동일하다면, 리스크(표준편차)가 더 낮은 포트폴리오를 선호해야 한다. 실증 연구에 따르면 저베타 주식으로 구성된 포트폴리오는 리스크가 낮고 샤프 비율이 더 높은 경향이 있다.
예를 들어, PanAgora Asset Management의 Edward Qian 박사는 논문 “Risk Parity Portfolios”에서 전형적인 주식 60%/채권 40% 배분이 위험 자산인 주식에 과중하게 배분돼 최적이 아니라고 주장했다. 대신, 동일한 리스크 수준에서 더 높은 샤프 비율을 달성하려면 23% 주식/77% 채권으로 배분하되 전체 포트폴리오에 1.8배 레버리지를 적용하도록 권고했다.
시장은 어떤 식으로든 고베타 주식의 가치를 만성적으로 낮게 평가하고 있는 셈이다. 따라서 고베타 포트폴리오와 저베타 포트폴리오 중 선택해야 한다면, 저베타 포트폴리오를 선택하고 최대 복리 성장률을 달성하기 위해 레버리지를 높이는 것이 낫다.
한 가지 주의사항이 있다. 이 모든 논리는 수익률 분포의 정규분포(가우시안) 가정에 기반한다. 실제 수익률 분포는 두터운 꼬리(fat tails)를 가지므로, 원래 저베타인 주식에 과도한 레버리지를 적용하는 것은 매우 신중해야 한다.
요약
이 책은 투자 업계에서 **통계적 차익거래(statistical arbitrage)**라고 불리는 특정 유형의 퀀트 트레이딩을 주로 다뤘다. 이 거창한 이름에도 불구하고, 통계적 차익거래는 개념적으로나 수학적으로나 파생상품(예: 옵션) 또는 고정수익 상품 거래보다 훨씬 단순하다. 이 책에서 다룬 표준 무기고를 요약하면 다음과 같다: 평균 회귀와 모멘텀, 레짐 전환, 정상성과 공적분, 차익거래 가격결정 이론(팩터 모델), 계절성 트레이딩, 고빈도 트레이딩.
중요한 포인트를 정리하면:
- 평균 회귀 레짐이 추세 레짐보다 더 일반적이다.
- 평균 회귀 전략의 백테스트에는 이상값 호가와 생존 편향이라는 까다로운 데이터 문제가 수반된다.
- 추세 레짐은 일반적으로 새로운 정보의 확산, 대형 기관 주문의 체결, 또는 군중 행동에 의해 촉발된다.
- 트레이더 간의 경쟁은 평균 회귀 트레이딩 기회의 수를 줄이는 경향이 있다.
- 트레이더 간의 경쟁은 모멘텀 거래의 최적 보유 기간을 단축시키는 경향이 있다.
- 레짐 전환은 다수의 입력 피처를 활용하는 데이터 마이닝 접근법으로 탐지할 수 있는 경우가 있다.
- 정상적인 가격 시계열은 평균 회귀 거래에 이상적이다.
- 두 개 이상의 비정상적 가격 시계열이 공적분 관계에 있다면 정상적인 하나의 시계열을 형성할 수 있다.
- 공적분과 상관관계는 다른 개념이다: 공적분은 두 종목 이상의 가격에 관한 장기 행동이고, 상관관계는 수익률에 관한 단기 행동이다.
- 팩터 모델(차익거래 가격결정 이론)은 펀더멘털 팩터가 주식 수익률에 선형적으로 미치는 영향을 모델링하는 데 흔히 사용된다.
- 가장 잘 알려진 팩터 모델 중 하나인 파마-프렌치 3팩터 모델은 주식 수익률이 베타 및 장부가·시장가 비율에 비례하고 시가총액에는 반비례한다고 가정한다.
- 팩터 모델은 레짐 전환으로 인해 통상 보유 기간이 길고 낙폭이 크다.
- 청산 신호는 평균 회귀 전략과 모멘텀 전략에서 다르게 설계해야 한다.
- 평균 회귀 전략의 최적 보유 기간 추정은 오른스타인-울렌벡 공식 덕분에 꽤 견고할 수 있다.
- 모멘텀 전략의 최적 보유 기간 추정은 신호 수가 적어 오류가 발생하기 쉽다.
- 스톱 로스는 모멘텀 전략에는 적합할 수 있지만, 평균 회귀 전략에는 적합하지 않다.
- 주식의 계절성 거래 전략(캘린더 효과)은 최근 몇 년 사이 수익성이 약화되거나 사라졌다.
- 원자재 선물의 계절성 거래 전략은 여전히 수익성이 있다.
- 고빈도 트레이딩 전략은 높은 샤프 비율의 원천인 “대수의 법칙”에 의존한다.
- 고빈도 트레이딩 전략은 높은 샤프 비율 덕분에 가장 높은 장기 복리 성장률을 창출하는 경향이 있다.
- 고빈도 트레이딩 전략은 백테스트하기 매우 어렵고, 체결 측면에서 기술 의존도가 매우 높다.
- 저베타 주식으로 구성된 고레버리지 포트폴리오는 레버리지 없는 고베타 주식 포트폴리오보다 장기적으로 더 높은 복리 성장률을 창출해야 한다.
대부분의 통계적 차익거래 전략은 이러한 효과와 모델들의 조합이다: 수익성이 있느냐 없느냐는 이론적으로 옳고 그름의 문제라기보다, 어디서 언제 적용하느냐의 문제다.