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