R에 공변량이있는 GARCH (1,1) 모형을 적합합니다


10

간단한 ARIMA 모델 등의 시계열 모델링 경험이 있습니다. 이제 변동성 클러스터링을 나타내는 일부 데이터가 있으며 데이터에 GARCH (1,1) 모델을 맞추는 것으로 시작하고 싶습니다.

데이터 시리즈와 영향을 미치는 여러 변수가 있습니다. 따라서 기본 회귀 용어로 다음과 같습니다.

yt=α+β1xt1+β2xt2+ϵt.

그러나 이것을 GARCH (1,1)-모델로 구현하는 방법을 완전히 잃어 버렸습니까? 나는 rugarch-package와 fGarch-package in R을 보았지만 인터넷에서 찾을 수있는 예제 외에는 의미있는 것을 할 수 없었습니다.

답변:


12

다음은 rugarch패키지를 사용하고 가짜 데이터를 사용한 구현 예입니다 . 함수는 ugarchfit평균 외부 회귀 식의 포함 (사용 가능 양해 external.regressorsfit.spec다음 코드를).

표기법을 수정하려면 모델은 여기서 및 는 시간 에서의 공변량을 나타내며, 파라미터와 혁신 프로세스 에 대한 "일반적인"가정 / 요구 사항을 .

yt=λ0+λ1xt,1+λ2xt,2+ϵt,ϵt=σtZt,σt2=ω+αϵt12+βσt12,
xt,1xt,2tZt

예제에서 사용 된 파라미터 값은 다음과 같습니다.

## Model parameters
nb.period  <- 1000
omega      <- 0.00001
alpha      <- 0.12
beta       <- 0.87
lambda     <- c(0.001, 0.4, 0.2)

아래 이미지는 일련의 공변량 및 와 계열 줍니다. 을 생성하는 데 사용되는 코드는 아래와 같습니다.xt,1xt,2ytR

여기에 이미지 설명을 입력하십시오

## Dependencies
library(rugarch)

## Generate some covariates
set.seed(234)
ext.reg.1 <- 0.01 * (sin(2*pi*(1:nb.period)/nb.period))/2 + rnorm(nb.period, 0, 0.0001)
ext.reg.2 <- 0.05 * (sin(6*pi*(1:nb.period)/nb.period))/2 + rnorm(nb.period, 0, 0.001)
ext.reg   <- cbind(ext.reg.1, ext.reg.2)

## Generate some GARCH innovations
sim.spec    <- ugarchspec(variance.model     = list(model = "sGARCH", garchOrder = c(1,1)), 
                          mean.model         = list(armaOrder = c(0,0), include.mean = FALSE),
                          distribution.model = "norm", 
                          fixed.pars         = list(omega = omega, alpha1 = alpha, beta1 = beta))
path.sgarch <- ugarchpath(sim.spec, n.sim = nb.period, n.start = 1)
epsilon     <- as.vector(fitted(path.sgarch))

## Create the time series
y <- lambda[1] + lambda[2] * ext.reg[, 1] + lambda[3] * ext.reg[, 2] + epsilon

## Data visualization
par(mfrow = c(3,1))
plot(ext.reg[, 1], type = "l", xlab = "Time", ylab = "Covariate 1")
plot(ext.reg[, 2], type = "l", xlab = "Time", ylab = "Covariate 2")
plot(y, type = "h", xlab = "Time")
par(mfrow = c(1,1))

피팅은 ugarchfit다음과 같이 수행 됩니다.

## Fit
fit.spec <- ugarchspec(variance.model     = list(model = "sGARCH",
                                                 garchOrder = c(1, 1)), 
                       mean.model         = list(armaOrder = c(0, 0),
                                                 include.mean = TRUE,
                                                 external.regressors = ext.reg), 
                       distribution.model = "norm")
fit      <- ugarchfit(data = y, spec = fit.spec)

모수 추정치는

## Results review
fit.val     <- coef(fit)
fit.sd      <- diag(vcov(fit))
true.val    <- c(lambda, omega, alpha, beta)
fit.conf.lb <- fit.val + qnorm(0.025) * fit.sd
fit.conf.ub <- fit.val + qnorm(0.975) * fit.sd
> print(fit.val)
#     mu       mxreg1       mxreg2        omega       alpha1        beta1 
#1.724885e-03 3.942020e-01 7.342743e-02 1.451739e-05 1.022208e-01 8.769060e-01 
> print(fit.sd)
#[1] 4.635344e-07 3.255819e-02 1.504019e-03 1.195897e-10 8.312088e-04 3.375684e-04

그리고 해당하는 실제 값은

> print(true.val)
#[1] 0.00100 0.40000 0.20000 0.00001 0.12000 0.87000

다음 그림은 95 % 신뢰 구간과 실제 값을 갖는 모수 추정치를 보여줍니다. R가 제공된다 생성하는 데 사용되는 코드는 아래와 같다.

여기에 이미지 설명을 입력하십시오

plot(c(lambda, omega, alpha, beta), pch = 1, col = "red",
     ylim = range(c(fit.conf.lb, fit.conf.ub, true.val)),
     xlab = "", ylab = "", axes = FALSE)
box(); axis(1, at = 1:length(fit.val), labels = names(fit.val)); axis(2)
points(coef(fit), col = "blue", pch = 4)
for (i in 1:length(fit.val)) {
    lines(c(i,i), c(fit.conf.lb[i], fit.conf.ub[i]))
}
legend( "topleft", legend = c("true value", "estimate", "confidence interval"),
        col = c("red", "blue", 1), pch = c(1, 4, NA), lty = c(NA, NA, 1), inset = 0.01)

매개 변수를 어떻게 추정 했습니까 (람다, 오메가, 알파, 베타) ??
chs

1
@chs ugarchfit함수 를 사용하여 모수 추정값을 얻었습니다 .
QuantIbex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.