Hidden Markov Model

Author

장경욱

1. 개요

주식시장의 방향성을 예측하는 방법 중, 변곡점을 예측하는 방법(Change point detection)과 국면을 판단하는 방법(Market regime)이 많이 사용됨. 이 중 국면을 판단하는 방법으로 자주 사용되는 모델이 Hidden Markov Model(HMM). 이번 리서치에서는 HMM의 컨셉을 간단히 살펴보고, 이를 적용해서 섹터 로테이션 전략을 적용한 페이퍼인 “Sector Rotation in Times of Crisis”의 내용을 간단히 요약해 봄. 이어서 SPY 지수에 HMM 모델을 적용하여 간단한 트레이딩 전략을 시뮬레이션 해 봄. 국면을 판단하는 모델은 응용 방법이 다양하므로, 향후 다양한 전략에 응용이 가능할 것으로 기대

2. 응용사례

  1. Pratiksha Sharma et al., “Sector Rotation in Times of Crisis”, Journal of Portfolio management
    VIX 지수에 HMM을 적용하여 변동성 확대/축소 국면을 나눈 뒤 변동성 확대 국면에 채권에 투자하는 비중을 높이거나 변동성이 낮은 섹터 지수에 투자하는 전략
  2. Ethan Johnson, “Using the Hidden Markov Model to Classify the S&P500, https://medium.datadriveninvestor.com/using-the-hidden-markov-model-to-classify-the-s-p500-9de74eacf452
    GARCH 모형을 이용해서 변동성을 예측한 후, 해당 값을 이용한 HMM 모델을 통해 다음 예측 시기의 Regime을 예측
  3. Matthew Wang et al., “Regime-Switching Factor Investing with Hidden Markov Models”, Risk and Financial Management,
    HMM으로 3가지 Regime 을 구별한 후, 5개 팩터모델(파마-프랜치, Modified 파마-프랜치, Carhart, Value, AQR)의 국면별 성과를 이용하여 모델을 Rotation하며 투자하는 전략.
  4. Kent Daniel et al., “A Hidden Markov Model of Momentum”, Colombia Business School
    HMM을 이용하여 국면을 나눈 후, 모멘텀 전략을 다르게 적용하여 Momentum crash를 방지하고 더 나은 out-of-sample 성과를 보임

3. HMM 모델의 컨셉

HMM은 시계열 관측치를 통해 우리가 관찰할 수 없는 Hidden state를 추정하고자 함. 모델은 이 Hidden state가 마코프 프로세스를 따른다고 가정. 즉, \(Z_t\)\(Z_{t-1}\) 에만 의존함. 관측치 \(X_t\) 는 Hidden state \(Z_t\) 에만 의존.

주식 시장에 적용한다면, 2개의 Hidden state를 가정할 때, 변동성 확대 국면/축소 국면 혹은 Bear/Bull market 등으로 해석할 수 있음. 경제에 적용할 경우 경기 확장/축소 혹은 금리 상승/인하 등.

HMM 모델은 아래 세 가지 정의에서 출발함.

  1. Initial State Probabilities :
    \[P(z_1)\sim Mult(\pi_1, \pi_2, ... , \pi_k)\]
  2. Transition Probabilities
    \[P(z_t^j = 1 |z_{t-1}^i = 1) = a_{i,j}\]
  3. Emission Probabilities
    \[P(x_t^j=1|z_t^j=1) = b_{i,j}\]

HMM에서 다루는 중요한 질문 세 가지는 아래와 같음.

  1. Evaluation question : HMM모형 \(M\)\(\pi, a, b, X\) 가 주어졌다고 할 때 \(P(X|M,\pi, a, b)\) 를 찾는 것. 즉 훈련된 모형에서 주어진 시퀀스 \(X\) 가 관찰된 확률이 어떻게 되는가? - Forward algorithm
  2. Decoding question : \(argmax_z P(Z|M, a, b, X)\) 를 찾는 것. 즉 우리가 관측한 데이터에 대해 가장 가능성이 높은 hidden state는 무엇인가? - Viterbi algorithm
  3. Learning question : \(argmax_{\pi, a, b}P(X|M,\pi,a,b)\) 관측치가 주어졌을 때 가장 확률이 높은 HMM의 파라미터는 무엇인가? - Baum-Welch algorithm

위 그림에서 관측치 X1, X2, X3는 우리가 관찰할 수 없는 latent variable Z에 따라 결정되는 것. 아래에서는 2가지 다른 분포에서 생성된 데이터를 생성하고, 이를 통해 HMM의 컨셉을 간단히 이해해보고자 함.

우선, 2가지 국면에 대한 전이행렬(Transition matrix)을 정의.

\[ \begin{equation} P = \begin{pmatrix} p_{11} & p_{12} \\ p_{21} & p_{22} \end{pmatrix} \end{equation} \]

여기서 \(p_{ij}\) 는 현재 국면이 i일 때 j로 이행할 확률임. 전이확률을 보면 state i에서 i로 이행할 확률이 높은데, 이와 같은 구조로 인해 volatility clustering 과 같은 현상이 잘 모델링 됨.

# Set transition matrix
P <- matrix(c(0.95, 0.15, 0.05, 0.85), 2, 2)
P
     [,1] [,2]
[1,] 0.95 0.05
[2,] 0.15 0.85
s0 <- 1
st <- function(i) sample(c(1, 2), 1, prob = P[i, ])

set.seed(32)
s <- st(s0)
for(t in 2:100) {
  s <- c(s, st(s[t-1]))
}

이제 임의의 시계열을 만들기 위해 평균이 높고 변동성이 낮은 분포에서 뽑은 샘플을 상태 1에 매칭시키고, 평균이 낮고 변동성이 높은 분포에서 뽑은 샘플을 상태 2에 매칭시킴.

set.seed(1)
n_sample <- 100
x1 <- rnorm(n_sample, mean = 2, sd = 1)
x2 <- rnorm(n_sample, mean = -2, sd = 3)

이제 전체 데이터를 하나의 분포에서 나왔다고 가정하면 아래와 같은 결과가 나옴.

\[ x_t = \mu + \epsilon_t\\ \] \[ \epsilon_t \sim N(0, \sigma^2) \]

mu sig
(Intercept) 0.895 2.641

반면 국면이 2개인 HMM 모델을 적합하면 아래와 같은 결과를 얻을 수 있음. 이는 아래 수식과 같은 모형이 됨.

\[ [x_t|s_t = s] = \mu_s + \epsilon_t,_s \\ \] \[ \epsilon_t,_s \sim N(0,\sigma^2_s) \]

추정 결과로 얻은 전이행렬 또한 기존의 가정과 유사함을 알 수 있음.

Markov Switching Model

Call: msmFit(object = mod, k = 2, sw = c(TRUE, TRUE), p = 0)

       AIC      BIC    logLik
  374.0329 388.4536 -185.0164

Coefficients:

Regime 1 
---------
               Estimate Std. Error t value  Pr(>|t|)    
(Intercept)(S)   2.1019     0.1173  17.919 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.9776932
Multiple R-squared:     0

Standardized Residuals:
          Min            Q1           Med            Q3           Max 
-2.2574249387 -0.5520816901 -0.0008494965  0.4919211813  2.1296725973 

Regime 2 
---------
               Estimate Std. Error t value  Pr(>|t|)    
(Intercept)(S)  -3.1613     0.7047  -4.486 7.257e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.354697
Multiple R-squared:     0

Standardized Residuals:
       Min         Q1        Med         Q3        Max 
-4.5817286  0.1203298  0.1626861  0.3320539  4.0758409 

Transition probabilities:
           Regime 1  Regime 2
Regime 1 0.93644428 0.2138482
Regime 2 0.06355572 0.7861518

이론적인 내용에 대한 자세한 설명은 Edwith내 문일철 교수의 “인공지능 및 기계학습 개론 II” - “CHAPTER 9 - Hidden Markov Model” 참고.

4. 페이퍼 요약: Sector Rotation in Times of Crises

  • VIX 지수와 9개 섹터 ETF에 대해 2 State HMM 모델을 적합한 후, 이를 변동성 확대 국면과 축소 국면으로 해석. 모형을 적합할 시계열 데이터는 정상시계열이어야 하기 때문에 VIX는 지수 그대로, 섹터 ETF는 로그수익률 데이터에 대해 모형을 적합. 매일마다 모형을 재학습.

Hmm equation

  • VIX 지수에 대해 모형이 도출한 state는 아래와 같음. 주황선으로 표시된 state 1은 고변동성 국면으로, state 2는 저변동성 국면으로 해석.

  • VIX 지수 뿐 아니라 섹터 ETF에 대해서도 같은 방법으로 HMM 모델을 이용해 국면을 나눔.

  • 우선, VIX 지수에 기반한 아래 시그널 전략을 테스트

    • V1: 고변동성 국면에서 T-Bills로 교체하고, 저변동성 국면에서 섹터 ETF를 동일 가중으로 투자

    • V2: 저변동성 국면에서 T-Bills로 교체하고, 고변동성 국면에서 섹터ETF를 동일 가중으로 투자

    • 시뮬레이션 결과 V1 전략이 단순 SPY에 투자하는 것보다 더 우월한 Annualized return을 보임.

  • 다음으로 섹터 ETF의 국면을 이용하여 섹터를 스위칭하는 전략을 테스트

    • Fixed Weight : 저변동성 국면에 있는 섹터 ETF만 1/N씩 투자하고, 나머지 \((1-N)/9\) 만큼의 비중은 T-Bills에 투자

    • Variable Weight : 저변동성 국면에 있는 섹터 ETF를 동일가중으로 투자. 예를 들어 위의 V1케이스에서 저변동성 국면이 나와 섹터 ETF를 투자하게 되었고, 이때 2개 섹터 ETF가 저변동성 국면에 위치했을 경우 2개 ETF를 50%씩 투자.

    • 위의 V1, V2조합에 더해, 섹터 ETF를 투자할 경우 비중 투자 방식을 2가지로 나누어 총 4개의 조합에 대해 테스트

    • 시뮬레이션 결과 고변동성 국면에서 T-Bills로 교체하는 S1과 S3가 높은 성과를 보였으며, 그 중에서도 저변동성 국면 ETF만 1/9씩 투자하고 나머지 비중은 T-Bills에 투자하는 S1 전략이 가장 높은 수익률을 보임.

5. S&P 500 지수를 이용한 시뮬레이션

위 페이퍼와 비슷한 아이디어로, SPY ETF의 수익률에 대해 HMM 모형을 구하고, 국면에 따른 투자전략을 시뮬레이션 해봄.

5. 1. 전체 기간에 대한 모형

전체 기간에 대해 모형을 적합해 보고 과거의 국면이 어떠한지 살펴봄. 투자 관점에서 주된 관심은 현재 국면을 파악하거나 미래 국면을 예측하는 것이므로, 과거의 국면에 대한 정보는 유용성이 떨어질 수 있음. 그러나 해당 모형의 국면 판단 정보를 뒷부분에서 살펴볼 롤링 방식의 모형의 성과를 측정하기 위한 가이던스로 삼을 수 있음.

  1. 국면2에 해당하는 기간에 변동성이 커지고 시장이 하락하는 모습. 육안으로 봤을 때에는 대부분의 하락기간이 국면2에 할당됨.
  2. 왜도는 전체 샘플이 -0.6정도인 가운데 국면을 나눴을 때 왜도가 크게 줄어들면서 대칭에 가까운 분포로 바뀌는 모습. 특히 Regime1의 첨도는 0에 가까워서 정규분포와 비슷한 종모양의 형태.
  3. 분포로 봤을 때에는 국면 2가 왼쪽 꼬리가 더 긴 모습.
  4. 각 시점에서 국면의 판단은 확률에 기반하여 정해짐. 이 모형은 국면을 2개로 설정했기 때문에 0.5를 임계점으로 하여 국면이 나뉘게 됨. 확률을 8개의 구간으로 쪼개서 분포를 살펴볼 경우 Quantile1의 값이 가장 넓은 산포를 보임. 따라서 국면을 판단하는 임계값 0.5와 국면의 수 2개가 전체 기간을 적절히 설명하기에 부족할 수 있음.

Regime Mean Median Sd Skewness Kurtosis Obs. Percentage
1 0.360 0.386 1.478 -0.139 0.084 0.704
2 -0.351 -0.401 3.970 -0.167 1.986 0.296

5. 2. Walk-forward analysis

주단위 데이터에 대해 특정 time-window를 rolling 하면서 현재 국면을 판단해 봄. 모형의 성과는 그닥 좋지 않은데, 개별 모형에서 정의된 hidden state의 특성이 다르기 때문일 수도 있을 듯. 예를들면 T 시점에서 과거 5년으로 계산한 모형은 저변동성 국면에 regime 1을 할당하고, 고변동성 국면에 regime 2를 할당. 그런데 T+1시점에서 계산한 모형에서는 저변동성 국면에 regime 2가 할당될 수 있음.

Regime Mean Median Sd Skewness Kurtosis Obs. Percentage
1 0.317 0.396 2.066 0.104 3.796 0.509
2 0.178 0.342 2.523 -0.822 5.480 0.491

각 시점별 모형에 대해 국면의 평균 변동성을 계산해 본 후 변동성이 높은 구간에 할당된 regime을 살펴봄. 우선 각 regime에 대해 계산된 표준편차를 도시해보면, 모형이 변동성이 높은 구간과 낮은 구간을 명확히 나누고 있음을 알 수 있음.

하지만 변동성이 높은 구간에 할당된 regime을 조사해보면 일관성이 없게 나타남.

5. 3. 국면을 이용한 트레이딩 전략 - SPY / TLT

5. 3. 1. Weekly data - 10y window

국면에 따른 트레이딩 전략을 시뮬레이션 해봄. 고변동성 국면에서는 TLT를 40% 주식을 60% 보유하고, 저변동성 국면에서는 주식을 100% 보유하는 전략.

  • 매매수수료는 ETF임을 감안하여 15bp를 적용.
  • 해당 날짜의 종가를 이용해서 국면에 대한 정보를 얻은 이후에는 그 다음 영업일 종가로 리밸런싱 한다고 가정. (예를들면 1월 27일 종가를 이용해서 구한 모델에 대한 리밸런싱은 29일 수익률부터 적용)

각 모형은 사용한 기간의 모든 국면 정보를 도출하는데, 각 국면에 대해 표준편차가 더 큰 국면을 High_Vol 국면으로 정의하고, 낮은 국면을 Low_Vol 국면으로 정의. 고변동성 국면에서는 SPY 40%, 채권 ETF 60%를 보유하고, 저변동성 국면에서는 SPY를 100% 보유하는 전략을 백테스트.

현재 모형에서는 국면이 2개이기 때문에, 확률이 50%가 넘으면 해당 국면으로 분류됨. 변동성 확대와 축소 기간에 대한 분류의 통계적인 특성은 전체 기간에 대해 분류한 부분과 유사하게 나타남. 다만 5.1. 전체 기간에 대한 국면 분류와 달리, 노이즈가 다소 발생하는 모습. 이로인해 전략의 턴오버가 크게 나타남.

Regime Mean Median Sd Skewness Kurtosis Obs. Percentage
Low_Vol 0.367 0.387 1.480 -0.095 0.253 0.802
High_Vol -0.228 -0.208 4.209 -0.109 0.470 0.198

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.1 0.77 0.13 0.07 0.3 0.01 2.35
  • regime의 잦은 변경을 방지하기 위해 regime 확률을 평활화(Smoothing)

    • Smoothing 함수 : mean, median, min, max 등
    • smoothing 기간 : 0주~5주
    • 국면 판단을 위한 Threshold 조절
  • 이에 대한 그리드 서치를 진행했으나, 그만큼 오버피팅의 확률도 높음. 이상적으로는 training set과 test set을 분리하고 training set에서 hyperparameter를 조절해야 함. 그러나 아래 결과는 전체 샘플에 대해 실시한 것.

  • 아래 그림은 10년 time window로 학습했을 때의 그리드 서치 결과. 그 외 1년 3년, 5년 time window 또한 시뮬레이션 하였으나, 10년이 가장 적합하다고 판단.

  • MAX 함수를 사용했을 때, 전반적으로 변동성 혹은 Downside Deviation (하락구간에서의 변동성)이 낮은 것으로 나타남.

이를 바탕으로 threshold 0.15, 평활화 함수로 MAX 함수 사용, 평활화 기간은 3주를 적용하였을 때 아래 그림과 같이 국면이 구분됨. max 함수를 썼을 때 drowdown이 전반적으로 개선되고, 적당한 평활화를 적용했을 때 턴오버가 유의미하게 낮아지기 떄문. Threshold는 5.1. 에서 분석한 수익률 분포를 바탕으로 0.1 ~ 0.15 정도로 설정.

분포

Regime Mean Median Sd Skewness Kurtosis Obs. Percentage
Low_Vol 0.293 0.342 1.348 -0.182 0.165 0.604
High_Vol 0.171 0.478 3.263 -0.377 2.066 0.396
결과

모델을 구하기 위한 Time window로 10년(52주 * 10) 데이터를 사용. 급락 구간에서 TLT로 교체하면서 수익률을 방어하는 모습. 그러나 코로나 이후 급상승장에서 주식 비중을 변동시키고, 22년 하락 장에서 TLT의 하락폭이 주식보다 크게 나타나면서 최근 성과는 부진한 모습. (22년 SPY 하락폭 18.37%인 반면, TLT는 31.11%)

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.1 0.85 0.12 0.08 0.31 0.01 1.31

5. 3. 2. Weekly Data 10y cumulative

위에서는 모든 모형이 10년 윈도우로 계산되었으나, 이번에는 데이터를 누적하여 모델을 구해봄. 과거의 값을 얼마나 모형에 사용할 것인가의 문제.

분포

Regime Mean Median Sd Skewness Kurtosis Obs. Percentage
Low_Vol 0.296 0.363 1.32 -0.172 0.007 0.593
High_Vol 0.169 0.405 3.24 -0.374 2.079 0.407
결과

수익률 측면에서 봤을 때에는 유의미한 개선이 있다고 보기 어려움. 하지만 일관되게 변동성이 크게 증가하는 급락 구간에서 중간에 TLT로 교체하면서 수익률을 방어.

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.11 0.94 0.12 0.08 0.31 0.01 1.27

5. 3. 3. TLT 대신 CASH

2022년 주식과 채권의 상관관계가 높아지면서 변동성이 높아진 때에 채권에 투자하는 전략은 수익률이 떨어짐. 이에 TLT의 국면이 고변동성일 때 현금으로 교체하는 전략과 SPY와 TLT의 1년 상관계수가 커질 때 현금으로 교체하는 전략을 테스트해봄.

  • TLT의 국면이 고변동성 국면일 때 현금으로 교체한다면? : 주식이 고변동성 국면일 때 채권도 고변동성 국면인 경우가 많아 현금을 보유하는 기간이 길어짐. 이로 인해 오히려 성과가 악화됨.

  • TLT와 SPY간의 1년 상관계수가 -0.3 보다 커지는 경우 TLT가 아닌 현금을 보유한다면?

  • 컷오프 값을 -0.3으로 설정한 이유는 전체 기간 혹은 10년 정도의 1년 롤링 상관계수의 미디언 값이 -0.3에 가깝기 때문. (미래참조 편향)

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.12 1.12 0.11 0.1 0.14 0 1.63

5. 4. 국면을 이용한 트레이딩 전략 - 섹터 ETF

Sector Rotation in Times of Crises 에서 사용된 전략을 그대로 구현해 봄.

구성
  1. SPY가 고변동성일 때 주식 40%/TLT 60%, 저변동성일 때 주식 100%
  2. Fixed weight : 주식 투자 포트폴리오 내에서는 섹터 ETF 중 저변동성 국면인 ETF를 1/9씩 투자. 잔여 비중은 SPY로 보유.
  3. Variable weight : 주식 비중에 대해 저변동성 국면에 있는 ETF를 동일가중으로 투자. 만약 SPY 고변동성 국면에서, 저변동성 국면에 있는 ETF가 2개일 경우, 전체 포트폴리오에서 해당 ETF를 각각 \(0.4 / 2 = 0.2\) 씩 투자.
결과 - Fixed weight

코로나 직후 반등 시기에 급등했던 테크놀로지 섹터 ETF를 편입하지 않아 최근 상대적으로 부진한 수익률을 보임.

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.09 0.81 0.11 0.07 0.28 0.01 1.45


결과 - Variable weight

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.08 0.73 0.11 0.07 0.28 0 1.63

5. 5. Daily data를 이용한 결과

  • 데일리 데이터를 이용해서도 비슷한 방식으로 시뮬레이션 진행.

  • 데일리로 모델을 적합할 경우 노이즈가 더 심하기 때문에, 스무딩이 없을 경우 지나친 턴오버 발생.

  • 스무딩 함수로 max를 적요할 경우 지니차게 많은 구간이 고변동성 국면으로 분류. 전체 샘플 중 대략 25% ~ 30% 정도가 고변동성 국면으로 분류되기를 희망.

  • 아래 결과는 threshold 0.4, 평활화 기간 21일, 평활화 함수 Mean을 적용한 결과. 여러 실험 결과 중 좋은 결과를 뽑은 것으로, 과적합 우려가 있음.

Regime Mean Median Sd Skewness Kurtosis Obs. Percentage
Low_Vol 0.053 0.066 0.817 -0.684 5.548 0.712
High_Vol 0.047 0.053 1.620 -0.346 6.086 0.288
AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.11 0.85 0.13 0.08 0.3 0.01 1.5

6. 결론

의의

  • HMM 모형을 이용하여 국면에 따라 주식 편입비를 적용한 결과 급락구간에서 하락폭을 줄일 수 있음을 확인.

  • SPY뿐 아니라 원자재 등 다른 자산에 대해서도 트레이딩 전략에 적용할 수 있음.

한계

  • 변동성 확대/축소 구간을 식별하는 데에는 용이하나, 급락이후 급등하는 국면에도 높은 변동성을 보이기 때문에, 이 때 편입비를 확대하지 못하는 모습이 나타남.
  • 급락 구간 외에서의 시그널도 존재. 그러나 국면의 수를 증가시키면 변동성 확대/축소 구간을 보다 잘 식별할 수 있다는 페이퍼도 존재. 그러나 본고에서는 국면 수를 증가시켰을 때 수치적으로 모델이 실패하는 경우가 다수 발생하여 국면수를 2개로 한정.

7. 참고

시뮬레이션 기간 SPY 수익률

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.12 0.69 0.18 0.06 0.34 0.01 0

시뮬레이션 기간 60:40 포트폴리오 수익률 (분기 단위 리밸런싱)

AnnualizedReturn AnnualizedSharpe(Rf=0%) AnnualizedStdDev SortinoRatio(MAR=0%) maxDrawdown.1 DownsideDeviation.1 avg_turnover
0.09 0.96 0.1 0.09 0.28 0 0.09