← Catálogo
· Capítulo 15
T15_mST_Script_GARCH_Multivariante.R
# ══════════════════════════════════════════════════
# T15 · Series Temporales — GARCH Multivariante: BEKK y DCC
# Abre primero mSeriesTemporales.Rproj en RStudio
# ══════════════════════════════════════════════════
library(tidyverse)
library(rmgarch)
library(rugarch)
pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") {
if (interactive()) { cat(msg); invisible(readline()) }
}
# El solver numerico del DCC falla, ocasionalmente, a converger a un ajuste
# valido; se reintenta unas pocas veces antes de dar el ajuste por bueno.
dcc_fit_robusto <- function(spec, data, intentos = 5) {
for (i in 1:intentos) {
fit <- tryCatch(dccfit(spec, data = data, solver = "nlminb"), error = function(e) NULL)
if (!is.null(fit) && isTRUE(tryCatch({ rcor(fit); TRUE }, error = function(e) FALSE))) return(fit)
}
stop("No se pudo ajustar el modelo DCC tras varios intentos.")
}
set.seed(2026)
# ── 1. SIMULAR DOS SERIES CON CORRELACION CAMBIANTE ─
n <- 1500
rho <- c(rep(0.2, n / 2), rep(0.8, n / 2)) # correlacion sube a mitad de muestra
z1 <- rnorm(n); z0 <- rnorm(n)
r1 <- z1
r2 <- rho * z1 + sqrt(1 - rho^2) * z0
R <- cbind(r1, r2) * 0.01
cat(sprintf("Correlacion muestral 1a mitad: %.3f | 2a mitad: %.3f\n",
cor(R[1:(n/2), 1], R[1:(n/2), 2]), cor(R[(n/2+1):n, 1], R[(n/2+1):n, 2])))
pausa()
# ── 2. AJUSTE DCC(1,1) ─────────────────────────────
uspec <- multispec(replicate(2, ugarchspec(
variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0))
)))
dcc_spec <- dccspec(uspec, dccOrder = c(1, 1), distribution = "mvnorm")
dcc_fit <- dcc_fit_robusto(dcc_spec, R)
cat("Parametros DCC estimados:\n")
print(coef(dcc_fit)[c("[Joint]dcca1", "[Joint]dccb1")])
pausa()
# ── 3. RECUPERAR LA CORRELACION DINAMICA ESTIMADA ─
Rt <- rcor(dcc_fit)
cor_din <- Rt[1, 2, ]
plot(cor_din, type = "l", main = "Correlacion condicional dinamica (DCC)",
xlab = "t", ylab = "Correlacion", col = "grey20")
abline(v = n / 2, lty = 2, col = "grey50")
cat(sprintf("Correlacion DCC media 1a mitad: %.3f | 2a mitad: %.3f\n",
mean(cor_din[1:(n/2)]), mean(cor_din[(n/2+1):n])))
cat("El DCC deberia detectar el salto de correlacion simulado a mitad de muestra.\n")
pausa()
# ── 4. RATIO DE COBERTURA MINIMA VARIANZA ─────────
Ht <- rcov(dcc_fit)
h_dinamico <- Ht[1, 2, ] / Ht[2, 2, ]
h_estatico <- cov(R[, 1], R[, 2]) / var(R[, 2])
cat(sprintf("Ratio de cobertura: estatico=%.3f | dinamico medio=%.3f (rango %.3f-%.3f)\n",
h_estatico, mean(h_dinamico), min(h_dinamico), max(h_dinamico)))
# === FIN Script T15 — GARCH Multivariante: BEKK y DCC ===