2 votos

Backtesting EGARCH-NIG CVaR en R

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 :

enter image description here

Y los valores del CVaR (en rojo) son realmente pequeños en comparación con los rendimientos reales (en negro)

¿Puede alguien iluminarme?

0voto

ep4169 Puntos 1233

La función qdist resultó ser estandarizada y así lo es la función VaR:

f <- function(x, mu, sigma, skew, shape){
  return(qdist("nig", p=x, mu =mu , sigma = sigma, skew=skew, shape=shape))
}

Realizando este ajuste en la función f y procediendo de la misma manera se obtendrá una buena gráfica para el CVaR

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

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X