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