← Catálogo · Capítulo 9

T09_mST_Script_ARCH_GARCH.R

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