Passen Sie ein GARCH (1,1) - Modell mit Kovariaten in R an

10

Ich habe einige Erfahrungen mit der Modellierung von Zeitreihen in Form einfacher ARIMA-Modelle und so weiter. Jetzt habe ich einige Daten, die Volatilitätscluster aufweisen, und ich möchte versuchen, zunächst ein GARCH (1,1) -Modell an die Daten anzupassen.

Ich habe eine Datenreihe und eine Reihe von Variablen, von denen ich denke, dass sie sie beeinflussen. In grundlegenden Regressionsbegriffen sieht es also so aus:

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

Aber ich weiß nicht, wie ich das in ein GARCH (1,1) -Modell umsetzen soll. Ich habe mir das rugarchPaket und das fGarchPaket in angesehen R, aber ich konnte nichts Sinnvolles tun als die Beispiele, die man im Internet finden kann.

Thorst
quelle

Antworten:

12

Hier ist ein Beispiel für die Implementierung mit dem rugarchPaket und mit einigen gefälschten Daten. Die Funktion ugarchfitermöglicht die Einbeziehung externer Regressoren in die Mittelwertgleichung (beachten Sie die Verwendung von external.regressorsin fit.specim folgenden Code).

Um , lautet das Modell wobei und bezeichnen die Kovariate zum Zeitpunkt und mit den "üblichen" Annahmen / Anforderungen an Parameter und den Innovationsprozess .

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

Die im Beispiel verwendeten Parameterwerte sind wie folgt.

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

Das Bild unten zeigt die Reihe der Kovariaten und sowie die Reihe . Der Code, mit dem sie generiert wurden, ist unten angegeben. x t , 2 y txt,1xt,2ytR

Geben Sie hier die Bildbeschreibung ein

## 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))

Eine Anpassung erfolgt ugarchfitwie folgt.

## 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)

Parameterschätzungen sind

## 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

Und entsprechende wahre Werte sind

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

Die folgende Abbildung zeigt eine Parameterschätzung mit 95% -Konfidenzintervallen und die wahren Werte. Der RCode, der zum Generieren verwendet wird, ist unten angegeben.

Geben Sie hier die Bildbeschreibung ein

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)
QuantIbex
quelle
Wie haben Sie die Parameter (Lambda, Omega, Alpha, Beta) geschätzt?
chs
1
@chs Die Parameterschätzungen wurden mit der ugarchfitFunktion erhalten.
QuantIbex