← Catálogo · Capítulo 15

T15_mST_Script_GARCH_Multivariante.R

Ver crudo
# ══════════════════════════════════════════════════
# 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 ===