예측 시점에 사용 가능했던 데이터만 사용하기

R에서의 GARCH 모델

Kris Boudt

Professor of finance and econometrics

`ugarchforecast` 객체에 `sigma()` 적용한 변동성 예측

garchspec <- ugarchspec(mean.model = list(armaOrder = c(0,0)),
                        variance.model = list(model = "sGARCH"),
                        distribution.model = "norm")
garchfit <- ugarchfit(data = sp500ret, spec = garchspec)
garchforecast <- ugarchforecast(fitORspec = garchfit, n.ahead = 3)
sigma(garchforecast)

2017-12-29 T+1 0.005034754 T+2 0.005127582 T+3 0.005217770
R에서의 GARCH 모델

`ugarchfit` 객체에 `sigma()` 적용한 변동성 추정 (i)

head(sigma(garchfit), 3)
1989-01-04 0.01099465
1989-01-05 0.01129167
1989-01-06 0.01084294
tail(sigma(garchfit), 3)
2017-12-27 0.005051926
2017-12-28 0.004947569
2017-12-29 0.004862908
R에서의 GARCH 모델

Volatility estimation by applying sigma() to ugarchfit object (ii)

선행정보 사용 편향: 미래 수익률을 사용해 변동성을 추정합니다.

R에서의 GARCH 모델

선행정보 편향 방지: 롤링 추정

  • for 루프 작성: 예측 시점을 따라 반복하며 ugarchfit()으로 모형을 추정하고 ugarchforecast()로 변동성을 예측합니다
  • rugarch 패키지의 내장 함수 ugarchroll()
  • 옵션:
    • 추정 표본 길이
    • 모형 추정 빈도
R에서의 GARCH 모델

확장(익스팬딩) 창 추정

예측 시점에 사용 가능한 모든 수익률을 사용합니다

R에서의 GARCH 모델

이동(롤링) 창 추정

예측 시점에 사용 가능한 최신 수익률 관측치 중 고정 개수만 사용합니다

R에서의 GARCH 모델

롤링 창 추정의 특징

  • 롤링 창은 모형 모수 변화에 적응하도록 합니다
  • ugarchroll()의 계산 비용은 예측 시점 전반에 걸친 루프입니다:
    • 예측 빈도보다 낮은 빈도로 모형을 재추정하여 비용을 줄일 수 있습니다
R에서의 GARCH 모델

롤링과 재추정

모형을 매 K개 관측치마다 추정하여 계산 비용을 줄입니다

R에서의 GARCH 모델

함수 ugarchroll

garchroll <- ugarchroll(tgarchspec, data = EURUSDret, n.start = 2500,
                        refit.window = "moving", refit.every = 500)

지정할 인자:

  1. 사용할 GARCH 사양
  2. data : 사용할 수익률 데이터
  3. n.start: 초기 추정 표본 크기
  4. refit.window: 시간 경과에 따른 표본 변경 방식: "moving" 또는 "expanding"
  5. refit.every: 모형 재추정 주기
R에서의 GARCH 모델

1999년 1월~2018년 12월 EUR/USD 일간 수익률 예시

4961개 관측치의 EUR/USD 일간 수익률(시작일 1999-01-05)에서, 2500개 관측치의 이동 추정 창 사용:

R에서의 GARCH 모델

변하는 모수의 출력

메서드 coef()는 각 추정에 대한 추정 계수 목록을 반환합니다

coef(garchroll)[[1]]
$index
"2008-12-08"

$coef
            Estimate   Std. Error     t value  Pr(>|t|)
mu     -1.480000e-04 1.330915e-04 -1.11201737 0.2661307
ar1    -2.953484e-03 1.985344e-02 -0.14876432 0.8817396
omega   7.498928e-08 5.587618e-06  0.01342062 0.9892922
alpha1  2.805079e-02 6.401139e-02  0.43821564 0.6612300
beta1   9.709400e-01 6.080197e-02 15.96889122 0.0000000
shape   1.098068e+01 2.609293e+01  0.42082981 0.6738794
R에서의 GARCH 모델

추정 창 간 변화

coef(garchroll)[[1]]$coef # 2008-12-08
            Estimate   Std. Error     t value  Pr(>|t|)
omega   7.498928e-08 5.587618e-06  0.01342062 0.9892922
alpha1  2.805079e-02 6.401139e-02  0.43821564 0.6612300
beta1   9.709400e-01 6.080197e-02 15.96889122 0.0000000
coef(garchroll)[[5]]$coef # 2016-11-28
            Estimate   Std. Error      t value     Pr(>|t|)
omega   8.982527e-08 2.639680e-05  0.003402885 9.972849e-01
alpha1  4.149787e-02 2.550381e-01  0.162712424 8.707449e-01
beta1   9.573885e-01 2.195782e-01  4.360125676 1.299878e-05
R에서의 GARCH 모델

롤링 예측 평균과 변동성은?

EUR/USD에서 n.start = 2500이면, 첫 예측은 관측치 2501(2008-12-09)입니다:

R에서의 GARCH 모델

메서드 as.data.frame()

preds <- as.data.frame(garchroll)
head(preds, 3)
                      Mu      Sigma Skew    Shape Shape(GIG)      Realized
2008-12-09 -8.271288e-05 0.01196917    0 10.98068          0  0.0003864884
2008-12-10 -1.495786e-04 0.01179742    0 10.98068          0 -0.0066799754
2008-12-11 -1.287079e-04 0.01167929    0 10.98068          0 -0.0203099142

참고:

  • preds$Mu: 예측 평균 시계열
  • preds$Sigma: 예측 변동성 시계열
R에서의 GARCH 모델

예측 변동성

garchvol <- xts(preds$Sigma, order.by = as.Date(rownames(preds)))
plot(garchvol)

R에서의 GARCH 모델

롤링 예측의 정확도

preds <- as.data.frame(garchroll)
head(preds)
                      Mu      Sigma Skew    Shape Shape(GIG)      Realized
2008-12-09 -8.271288e-05 0.01196917    0 10.98068          0  0.0003864884
2008-12-10 -1.495786e-04 0.01179742    0 10.98068          0 -0.0066799754
2008-12-11 -1.287079e-04 0.01167929    0 10.98068          0 -0.0203099142
2008-12-12 -8.845214e-05 0.01199756    0 10.98068          0 -0.0041201588
2008-12-15 -1.362683e-04 0.01184438    0 10.98068          0 -0.0230532787
2008-12-16 -8.034966e-05 0.01228900    0 10.98068          0 -0.0105720492

preds$Mupreds$Sigma의 정확도는 preds$Realized와 비교하여 평가합니다

R에서의 GARCH 모델

평균에 대한 평균제곱예측오차

# 평균의 예측 오차
e  <- preds$Realized - preds$Mu  
mean(e ^ 2)
3.867998e-05
R에서의 GARCH 모델

분산에 대한 평균제곱예측오차

# 평균의 예측 오차
e  <- preds$Realized - preds$Mu  

# 분산의 예측 오차
d  <- e ^ 2 - preds$Sigma ^ 2 
mean(d ^ 2)
6.974161e-09
R에서의 GARCH 모델

두 모형 비교

스튜던트 t 분포의 표준 GARCH

tgarchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
     variance.model = list(model = "sGARCH"), distribution.model = "std")
garchroll <- ugarchroll(tgarchspec, data = EURUSDret, n.start = 2500,
                        refit.window = "moving", refit.every = 500)

왜도 t 분포의 GJR GARCH

gjrgarchspec <- ugarchspec(mean.model = list(armaOrder = c(1, 0)),
   variance.model = list(model = "gjrGARCH"), distribution.model = "sstd")
gjrgarchroll <- ugarchroll(gjrgarchspec, data = EURUSDret, n.start = 2500,
            refit.window = "moving", refit.every = 500)
R에서의 GARCH 모델

예측 정확도 비교

스튜던트 t 분포의 표준 GARCH

preds <- as.data.frame(garchroll)
e  <- preds$Realized - preds$Mu  
d  <- e ^ 2 - preds$Sigma ^ 2 
mean(d ^ 2) # yields 6.974161e-09

왜도 t 분포의 GJR GARCH

gjrpreds <- as.data.frame(gjrgarchroll)
e  <- gjrpreds$Realized - gjrpreds$Mu  
d  <- e ^ 2 - gjrpreds$Sigma ^ 2 
mean(d ^ 2) # yields 6.965095e-09
R에서의 GARCH 모델

증명이란 실행에서 확인된다

R에서의 GARCH 모델

Preparing Video For Download...