← Catálogo
· Capítulo 9
T09_mST_Script_ARCH_GARCH.R
# ══════════════════════════════════════════════════
# 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 ===