# ══════════════════════════════════════════════════ # T16 · Series Temporales — Memoria Larga: ARFIMA y FIGARCH # Abre primero mSeriesTemporales.Rproj en RStudio # ══════════════════════════════════════════════════ library(tidyverse) library(fracdiff) library(pracma) library(rugarch) pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") { if (interactive()) { cat(msg); invisible(readline()) } } set.seed(2026) # ── 1. SIMULAR UN PROCESO ARFIMA(0,d,0) ─────────── d_sim <- 0.35 y <- fracdiff.sim(n = 3000, d = d_sim)$series cat(sprintf("Serie ARFIMA(0,d,0) simulada con d=%.2f\n", d_sim)) op <- par(mfrow = c(1, 2)) plot(y, type = "l", main = "Serie simulada", col = "grey30") acf(y, lag.max = 200, main = "FAC (decaimiento hiperbolico)") par(op) pausa() # ── 2. RECUPERAR d CON TRES METODOS ─────────────── hurst_sim <- hurstexp(y, display = FALSE) gph_sim <- fdGPH(y) fit_arfima_sim <- fracdiff(y, nar = 0, nma = 0) cat(sprintf("d verdadero = %.2f\n", d_sim)) cat(sprintf("Hurst R/S (d = H-0.5): %.4f\n", hurst_sim$Hs - 0.5)) cat(sprintf("GPH: %.4f (se=%.4f)\n", gph_sim$d, gph_sim$sd.reg)) cat(sprintf("ARFIMA (max.verosim.): %.4f\n", fit_arfima_sim$d)) pausa() # ── 3. ESTIMADOR LOCAL DE WHITTLE (IMPLEMENTACION PROPIA) ─ local_whittle <- function(x, m) { n <- length(x) x <- x - mean(x) per <- (Mod(fft(x))^2) / (2 * pi * n) lambda <- 2 * pi * (1:m) / n Ilam <- per[2:(m + 1)] objetivo <- function(d) { Gd <- mean(lambda^(2 * d) * Ilam) log(Gd) - 2 * d * mean(log(lambda)) } opt <- optimize(objetivo, interval = c(-0.5, 1.5)) list(d = opt$minimum, m = m) } m_bw <- floor(length(y)^0.65) lw_sim <- local_whittle(y, m_bw) cat(sprintf("Whittle local: %.4f (m=%d)\n", lw_sim$d, m_bw)) pausa() # ── 4. AJUSTE DE UN FIGARCH(1,1): SINTAXIS EN rugarch ─ # La estimacion de d en modelos FIGARCH es, en la practica, numericamente # delicada (superficie de verosimilitud plana cerca de la frontera d=1): # conviene contrastar siempre el resultado, como se hace en el caso practico, # con estimadores semiparametricos independientes (GPH, Whittle) antes de # confiar en el d de un unico ajuste FIGARCH. spec_fi <- ugarchspec(variance.model = list(model = "fiGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(0, 0))) r_sim_vol <- as.numeric(fracdiff.sim(n = 3000, d = 0.35)$series) * 0.01 fit_fi <- ugarchfit(spec_fi, r_sim_vol, solver = "hybrid") cat(sprintf("d estimado por el FIGARCH: %.4f\n", coef(fit_fi)["delta"])) # === FIN Script T16 — Memoria Larga: ARFIMA y FIGARCH ===