2 votos

(Ejemplo reproducible) Rendimientos condicionales en el contexto de GARCH-EVT-Copula (con R)

Estoy estimando una matriz de correlación variable en el tiempo para la cópula normal utilizando el rmgarch de R. He encontrado este código en la carpeta rmgarch.tests. Utilizo la distribución semiparamétrica con distribución de pareto generalizada, que se especifica en cgarchspec y se controla en cgarchfit (con umbrales de 0,05 y 0,95).

#required package   
install.packages("rmgarch")
library(rmgarch)

#load data 
data(dji30retw)
Dat = dji30retw[, 1:3, drop = FALSE]

#specification for univariate ARMA-GARCH, normal copula with SPD and fitting
uspec17 = ugarchspec(mean.model = list(armaOrder = c(2,1)), 
                 variance.model = list(garchOrder = c(1,1), model = "sGARCH", variance.targeting=FALSE), 
                 distribution.model = "norm")
spec17 = cgarchspec(uspec = multispec( replicate(3, uspec17) ), asymmetric = FALSE, 
                 distribution.model = list(copula = "mvnorm", method = "Kendall", 
                                           time.varying = TRUE, transformation = "spd"))
fit17 <- cgarchfit(spec17, Dat, out.sample=100, spd.control=list(upper=0.95, lower=0.05, type="mle", kernel="normal"),
             cluster=NULL, fit.control=list(eval.se=FALSE))
T = dim(Dat)[1]-100
simMu = simS = filtMu = filtS = matrix(NA, ncol = 3, nrow = 100)
simCor = simC = filtC = filtCor = array(NA, dim = c(3,3,100))
colSd = function(x) apply(x, 2, "sd")
specx17 = spec17
for(i in 1:3) specx17@umodel$fixed.pars[[i]] = as.list(fit17@model$mpars[fit17@model$midx[,i]==1,i])
setfixed(specx17)<-as.list(fit17@model$mpars[fit17@model$midx[,4]==1,4])

#simulation 
{for(i in 1:100){
if(i==1){
  presigma = matrix(tail(sigma(fit17), 2), ncol = 3)
  prereturns = matrix(unlist(Dat[(T-1):T, ]), ncol = 3, nrow = 2)
  preresiduals = matrix(tail(residuals(fit17),2), ncol = 3, nrow = 2)
  preR = last(rcor(fit17))[,,1]
  diag(preR) = 1
  preQ = fit17@mfit$Qt[[length(fit17@mfit$Qt)]]
  preZ = tail(fit17@mfit$Z, 1)
  tmp = cgarchfilter(specx17, Dat[1:(T+1), ], filter.control = list(n.old = T), varcoef = fit17@model$varcoef)
  filtMu[i,] = tail(fitted(tmp), 1)
  filtS[i,] = tail(sigma(tmp), 1)
  filtC[,,i] = last(rcov(tmp))[,,1]
  filtCor[,,i] = last(rcor(tmp))[,,1]
} else{
  presigma = matrix(tail(sigma(tmp), 2), ncol = 3)
  prereturns = matrix(unlist(Dat[(T+i-2):(T+i-1), ]), ncol = 3, nrow = 2)
  preresiduals = matrix(tail(residuals(tmp),2), ncol = 3, nrow = 2)
  preR = last(rcor(tmp))[,,1]
  diag(preR) = 1
  preQ = tmp@mfilter$Qt[[length(tmp@mfilter$Qt)]]
  preZ = tail(tmp@mfilter$Z, 1)

  tmp = cgarchfilter(specx17, Dat[1:(T+i), ], filter.control = list(n.old = T), varcoef = fit17@model$varcoef)          
  filtMu[i,] = tail(fitted(tmp), 1)
  filtS[i,] = tail(sigma(tmp), 1)
  filtC[,,i] = last(rcov(tmp))[,,1]
  filtCor[,,i] = last(rcor(tmp))[,,1]
}
sim17 = cgarchsim(fit17, n.sim = 1, m.sim = 2000, startMethod = "sample", preR = preR, preQ = preQ, preZ = preZ,
                 prereturns = prereturns, presigma = presigma, preresiduals = preresiduals, cluster = NULL)
simx = t(sapply(sim17@msim$simX, FUN = function(x) x[1,]))
simMu[i,] = colMeans(simx)
# Note: There is no uncertainty for the 1-ahead simulation of cov adn cor
simC[,,i] = sim17@msim$simH[[1]][,,1]
simCor[,,i] = sim17@msim$simR[[1]][,,1]
simS[i,] = sqrt(diag(simC[,,i]))
}}

Después de ejecutar esto, simx es una matriz que contiene todos los rendimientos condicionales. ¿Saben si tienen en cuenta la cópula y los marginales del DSP, es decir, si este procedimiento sigue los pasos: i) dados los datos en $t$ construir la matriz de correlación $t+1$ ; ii) dada la correlación en $t+1$ ii) generar 2000 realizaciones de cópulas correlacionadas; iii) utilizar la inversa del SPD para obtener los residuos estandarizados; iv) insertarlos de nuevo en la especificación ARMA-GARCH y calcular la rentabilidad. Intuitivamente diría que sí (¿por qué se especifican antes GARCH, spd y cópula normal si no?) pero no he encontrado ninguna confirmación "oficial".

1voto

Para su pregunta, que acaba de quitar todos last() funcione bien, he intentado cambiar los argumentos dentro del ugarchspec y también funciona bien. Usted puede referirse a la mía si es que hay.

También me enfrenté a una cuestión similar cuando cambié a otro conjunto de datos, la segunda fila de simulación, un error if(dim(custom.dist$distfit)[1]!=n) stop("row dimension of custom innovations\n matrix must be equal to n.sim+n.start") . Mi pregunta es rmgarch : Modelo Multivariante Copula-DCC-GARCH (VAR=FALSE) .

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