GARCH-Modelle in R
Kris Boudt
Professor of finance and econometrics
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
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
Look-ahead-Bias: Zukünftige Renditen werden zur Schätzung der Volatilität genutzt.

for-Schleife: Iteriere über die Vorhersagezeitpunkte und nutze ugarchfit() zur Parameterschätzung und ugarchforecast() für die Volatilitätsprognose ugarchroll() im Paket rugarchNutze alle zum Vorhersagezeitpunkt verfügbaren Renditen

Nutze nur eine feste Anzahl der bis zum Vorhersagezeitpunkt verfügbaren Renditebeobachtungen

ugarchroll() entsteht durch die Schleife über Vorhersagezeiten:Reduziere den Rechenaufwand, indem du das Modell nur alle $K$ Beobachtungen neu schätzt

garchroll <- ugarchroll(tgarchspec, data = EURUSDret, n.start = 2500,
refit.window = "moving", refit.every = 500)
Zu spezifizierende Argumente:
data : zu nutzende Renditedatenn.start: Größe des initialen Schätzfenstersrefit.window: Veränderung des Fensters über die Zeit: "moving" oder "expandingrefit.every: wie oft das Modell neu geschätzt wirdFür die 4.961 EUR/USD-Renditen mit 4.961 Beobachtungen, beginnend am 1999-01-05, und einem Moving-Schätzfenster von 2.500 Beobachtungen:

Die Methode coef() liefert eine Liste mit den geschätzten Koeffizienten je Schätzung
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
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
Für die EUR/USD-Renditen mit n.start = 2500 ist die erste Vorhersage für Beobachtung 2501, also 2008-12-09:

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
Hinweis:
preds$Mu: Serie der prognostizierten Mittelwertepreds$Sigma: Serie der prognostizierten Volatilitätengarchvol <- xts(preds$Sigma, order.by = as.Date(rownames(preds)))
plot(garchvol)

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
Bewerte die Genauigkeit von preds$Mu und preds$Sigma im Vergleich zu preds$Realized
# Vorhersagefehler für den Mittelwert
e <- preds$Realized - preds$Mu
mean(e ^ 2)
3.867998e-05
# Vorhersagefehler für den Mittelwert
e <- preds$Realized - preds$Mu
# Vorhersagefehler für die Varianz
d <- e ^ 2 - preds$Sigma ^ 2
mean(d ^ 2)
6.974161e-09
Standard-GARCH mit Student-t-Verteilung
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)
GJR-GARCH mit schiefer Student-t-Verteilung
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)
Standard-GARCH mit Student-t-Verteilung
preds <- as.data.frame(garchroll)
e <- preds$Realized - preds$Mu
d <- e ^ 2 - preds$Sigma ^ 2
mean(d ^ 2) # ergibt 6.974161e-09
GJR-GARCH mit schiefer Student-t-Verteilung
gjrpreds <- as.data.frame(gjrgarchroll)
e <- gjrpreds$Realized - gjrpreds$Mu
d <- e ^ 2 - gjrpreds$Sigma ^ 2
mean(d ^ 2) # ergibt 6.965095e-09
GARCH-Modelle in R