He ajustado un modelo EGARCH con una distribución NIG a una serie de rendimientos.
Utilizando el siguiente enlace he intentado conseguir cómo debería calcular el CVaR del modelo
http://r.789695.n4.nabble.com/CVaR-with-NIG-GARCH-1-1-td4666903.html
La respuesta fue de la persona que creó el paquete rugarch, lo que me dejó atónito.
De todos modos, he calculado el CVaR en cada paso como explicó y tracé los rendimientos y el vector CVaR juntos el vector CVaR está lleno de valores muy pequeños, mucho más pequeño que los valores de retorno ¿cómo puede ser esto? ¿Qué estoy haciendo mal?
El código que he utilizado es el siguiente:
exon <- as.data.frame(Ad(getSymbols("XOM", src="yahoo", adjust = T, auto.assign = F, to = "2019-04-01"))) %>%
tibble::rownames_to_column() %>%
setNames(c("Date", "EXXON")) %>%
dplyr::arrange(Date)%>%
dplyr::mutate(Date = as.Date(Date))
returns_df <- as.data.frame(diff(log(exon$EXXON)))
n <- round((80 * nrow(returns_df))/100,0)
sarima_train <- returns_df %>% head(n)
egarch_spec <- ugarchspec(mean.model = list(armaOrder = c(2, 3), include.mean = T),
variance.model = list(model = "eGARCH", garchOrder = c(1, 1)),
distribution.model="nig")
egarch_fit <- ugarchfit(spec = egarch_spec, data = sarima_train[,"diff(log(exon$EXXON))"])
res_roll <- ugarchroll(egarch_spec, sarima_train[,"diff(log(exon$EXXON))"],n.start = 750, refit.every = 50, refit.window = "moving",
solver = "hybrid", calculate.VaR = TRUE, VaR.alpha = c(0.01, 0.025, 0.05), keep.coef = T,
solver.control = ctrl, fit.control = list(scale = 1))
gnigdist <- as.data.frame(res_roll, which = 'density')
f <- function(x, mu, sigma, skew, shape){
return(mu + qdist("nig", p=x, mu, sigma, skew=skew, shape=shape)*sigma)
}
es_nig <- function(p = 0.05){
mu <- gnigdist[, 'Mu']
sigma <- gnigdist[, 'Sigma']
shape <- gnigdist[, 'Shape']
skew <- gnigdist[, 'Skew']
lambda <- gnigdist[, 'Shape(GIG)']
ES <- rep(0, length(mu))
for(i in 1:length(mu)) {
ES[i] <- integrate(f, 0, p, mu = mu[i], sigma=sigma[i], shape =
shape[i], skew=skew[i])$value/p
}
return(ES)
}
exxon_es <- es_nig()
plot(tail(sarima_train[,"diff(log(exon$EXXON))"],1420))
lines(exxon_es, col = "red")
Como verás obtendrás la siguiente trama :
Y los valores del CVaR (en rojo) son realmente pequeños en comparación con los rendimientos reales (en negro)
¿Puede alguien iluminarme?