← Catálogo · Capítulo 16

T16_mST_Script_MemoriaLarga.R

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