1. 시장 상황 예측 필요성
- 금융시장에서 거래를 할 때 momentum인지, mean-reversion인지에 따라 전략이 바뀐다. 예를 들어, 모멘텀이 유지되는 장에서는 현재 추세를 앞으로도 따라갈 것이므로 하락하고 있었으면 앞으로도 하락할 것으로 예측하여 short 포지션을 취하고 위험에 대비한다. 반대로 mean-reversion인 경우, 몇 번의 outlier 상황은 있겠지만 장기적인 패턴을 따라갈 것이라는 가정 하에 거래를 하게 된다. mean-reverting 정도가 강하다면 지금 비록 어떤 금융자산이 급격히 상승했더라도 다시 long-term 평균 값으로 회귀할 것이라고 가정할 수 있다. 따라서 금융시장에서 시장 상황을 파악하고 예측하는 것은 매우 중요하다. 이번 포스트에서는 하나의 수단으로 허스트 지수를 간단하게 설명하고 이후에 허스트 지수를 산정하는 두 가지 방식을 소개하려고 한다.
2. Hurst Exponent
(1) 의미
- Long-term memory of time series(0<H<1): how much a time series deviates from a random walk
xt=log(St)Var(τ)=<|xt+τ−xt|2>Var(τ)∼τ2H
- H=0.5,→Var(τ)∼τ : Geometric Brownian Motion을 따른다.(Stochastic Process 파트 참고)
- H<0.5 : <|xt+τ−xt|2> 가 time lag τ 보다 작다. 즉, 어떤 기간동안의 변동성이 그 기간 보다 작았다는 것이고 움직이긴 했으나 평균 주변에서 오르락 내리락 했을 것이며 mean-reverting 정도라고 해석할 수 있다.
- H>0.5 : <|xt+τ−xt|2> 가 time lag τ 보다 크다. 위와 반대로 어떤 기간동안의 변동성이 컸다는 것인데 그 만큼 평균에서 점점 멀어졌다는 의미이므로 추세가 유지되었다고 볼 수 있으며 momentum 정도라고 해석할 수 있다.
(2) 금융시장에서 적용
- Regime: 어떤 금융자산의 가격 흐름이 주어진 기간 동안 어떤 상태였는지(momentum/trend 유지, mean-reverting, random walk)를 대략적으로 파악 가능하다.
- Pair trading: mean-reversion을 바탕으로 거래하는 만큼, mean-reverting을 많이하는 pair를 잘 선택했는지 허스트 지수를 통해 대략적으로 파악할 수 있다.
3. 예시
import pandas as pd
import numpy as np
import FinanceDataReader as fdr
import sys
sys.path.append('/home/hjmoon/PycharmProjects/Stochastic_Process/')
from OU_Process import Ornstein_Uhlenbeck
from Brownian_Motion import Brownian
def hurst_exponent(time_series, max_lag=20):
lags = range(2, max_lag)
time_series = np.log(time_series)
tau = [np.std(np.array(time_series[lag:] - np.array(time_series[:-lag]))) for lag in lags]
reg = np.polyfit(np.log(lags), np.log(tau), 1)
return reg[0]
simulation = pd.DataFrame(columns=['mean_revert', 'gbm', 'trend'])
gbm = Brownian(series=None, process='geometric', period='daily').simulation(mu=0.05, sigma=0.1, n=1000)
mr = Ornstein_Uhlenbeck(series=None, period='daily').simulation(mu=0.1, theta=3, sigma=0.01, n=1000)
trend = Brownian(series=None, process='arithmetic', period='daily').simulation(mu=300, sigma=0.25, n=1000)
simulation['mean_revert'] = mr+100
simulation['gbm'] = gbm
simulation['trend'] = trend
max_lags = [5, 10, 20, 50, 100, 200, 500]
results = pd.DataFrame(index=['mr', 'gbm', 'trend'], columns=max_lags)
for i in max_lags:
results.loc['gbm'][i] = hurst_exponent(simulation['gbm'], max_lag=i)
results.loc['mr'][i] = hurst_exponent(simulation['mean_revert'], max_lag=i)
results.loc['trend'][i] = hurst_exponent(simulation['trend'], max_lag=i)
print(results, '\n')
data = fdr.DataReader('US500', '2010-01-01')['Close']
for i in max_lags:
print('Hurst exponent with lag %d: ' %i, hurst_exponent(data, i))
(1) lag에 따른 각 시계열 자료의 Hurst Exponent

- Trend가 있는 시계열의 경우 lag가 짧을수록 더 큰 값이 나타났고 클 수록 작은 값이 나왔지만 전체적으로 hurst 값이 0.5보다 큰 값을 lag에 관계 없이 일정하게 보였다.
- Geometric brownian motion은 lag와 관계없이 0.5에 가까운 값이 나타났다.
- Mean reverting 시계열의 경우 lag가 짧으면 gbm에 가까운 값(0.5)이 나타났고 lag가 길수록 mean-reversion을 나타내는 0.5보다 월등히 작은 값을 나타냈다.
(2) lag에 따른 S&P500의 Hurst Exponent

- S&P500의 경우 2010년 1월 1일부터 분석했을 때, lag가 짧을수록 gbm에 가깝고 lag가 길수록 mean-reverting series에 가깝게 나타났다.
'Regime' 카테고리의 다른 글
Regime-Specific Investment Strategies (0) | 2022.05.19 |
---|---|
3. Hurst Exponent (3) fractional Brownian Motion (0) | 2022.05.03 |
2. Hurst Exponent (2) R/S (0) | 2022.05.02 |