# ══════════════════════════════════════════════════ # T09 · Series Temporales — Modelos ARCH, GARCH y extensiones asimétricas # Abre primero mSeriesTemporales.Rproj en RStudio # ══════════════════════════════════════════════════ library(tidyverse) library(rugarch) pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") { if (interactive()) { cat(msg); invisible(readline()) } } set.seed(2026) # ── 1. SIMULAR UN PROCESO ARCH(1) ───────────────── # sigma2_t = omega + alpha*eps_{t-1}^2 ; omega=0.1, alpha=0.7 n <- 1000; omega <- 0.1; alpha <- 0.7 eps <- numeric(n); sigma2 <- numeric(n); sigma2[1] <- omega / (1 - alpha) for (t in 2:n) { sigma2[t] <- omega + alpha * eps[t - 1]^2 eps[t] <- rnorm(1) * sqrt(sigma2[t]) } op <- par(mfrow = c(2, 1)) plot(eps, type = "l", col = "grey30", main = "Proceso ARCH(1) simulado", ylab = "eps") plot(sigma2, type = "l", col = "grey30", main = "Varianza condicional simulada", ylab = "sigma2") par(op) cat(sprintf("Varianza marginal teorica = omega/(1-alpha) = %.3f\n", omega / (1 - alpha))) cat(sprintf("Varianza marginal muestral de eps = %.3f\n", var(eps))) pausa() # ── 2. FAC DE eps Y DE eps^2 ─────────────────────── op <- par(mfrow = c(1, 2)) acf(eps, lag.max = 20, main = "FAC de eps (ruido blanco)") acf(eps^2, lag.max = 20, main = "FAC de eps^2 (dependencia ARCH)") par(op) cat("eps no muestra autocorrelacion; eps^2 si, aunque eps sea ruido blanco.\n") pausa() # ── 3. CONTRASTE LM DEL EFECTO ARCH (funcion propia) ─ arch_lm_test <- function(x, m = 5) { e2 <- (x - mean(x))^2 n <- length(e2) df <- data.frame(y = e2[(m + 1):n]) for (i in 1:m) df[[paste0("l", i)]] <- e2[(m + 1 - i):(n - i)] reg <- lm(y ~ ., data = df) R2 <- summary(reg)$r.squared LM <- (n - m) * R2 list(R2 = R2, LM = LM, cv = qchisq(0.95, m), p = 1 - pchisq(LM, m)) } res_arch <- arch_lm_test(eps, m = 5) cat(sprintf("Serie ARCH simulada -> LM=%.2f (cv=%.2f) -> %s\n", res_arch$LM, res_arch$cv, ifelse(res_arch$LM > res_arch$cv, "se rechaza H0 (hay ARCH)", "no se rechaza"))) res_wn <- arch_lm_test(rnorm(n), m = 5) cat(sprintf("Ruido blanco puro -> LM=%.2f (cv=%.2f) -> %s\n", res_wn$LM, res_wn$cv, ifelse(res_wn$LM > res_wn$cv, "se rechaza H0", "no se rechaza (correcto)"))) pausa() # ── 4. ESTIMAR GARCH(1,1) SOBRE LA SIMULACION ───── spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(0, 0), include.mean = FALSE)) m_arch_as_garch <- ugarchfit(spec, eps, solver = "hybrid") print(coef(m_arch_as_garch)) cat("Nota: al estimar un GARCH(1,1) sobre datos ARCH(1), beta1 deberia ser proximo a 0.\n") # === FIN Script T09 — Modelos ARCH, GARCH y extensiones asimétricas ===