← Catálogo · Capítulo 16

T16_mST_CP_Financiero.R

Ver crudo
# ══════════════════════════════════════════════════
# T16 · Caso práctico Financiero — IBEX 35 (Decision Desk)
# 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()) }
}

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)
}

# ── 1. CARGA Y VALOR ABSOLUTO DEL RENDIMIENTO ─────
source("scripts/deskR.R")
ret_ibex <- desk_returns("_IBEX", type = "log")
r <- ret_ibex$return
absr <- abs(r)
pausa("\n  [Datos cargados. Pulsa ENTER...]")

# ── 2. EXPONENTE DE HURST ─────────────────────────
hurst_res <- hurstexp(absr, display = FALSE)
cat(sprintf("Hurst R/S simple: %.3f | corregido: %.3f\n", hurst_res$Hs, hurst_res$Hal))
pausa()

# ── 3. GPH, WHITTLE Y ARFIMA ───────────────────────
gph_res <- fdGPH(absr)
m_bw <- floor(length(absr)^0.65)
lw_res <- local_whittle(absr, m_bw)
fit_arfima <- fracdiff(absr, nar = 1, nma = 1)
cat(sprintf("GPH:     d=%.4f (se=%.4f)\n", gph_res$d, gph_res$sd.reg))
cat(sprintf("Whittle: d=%.4f\n", lw_res$d))
cat(sprintf("ARFIMA:  d=%.4f (ar=%.4f ma=%.4f)\n", fit_arfima$d, fit_arfima$ar, fit_arfima$ma))
pausa()

# ── 4. FIGARCH VS. GARCH(1,1) ─────────────────────
spec_fi <- ugarchspec(variance.model = list(model = "fiGARCH", garchOrder = c(1, 1)),
                       mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
                       distribution.model = "std")
fit_fi <- ugarchfit(spec_fi, r, solver = "hybrid")
d_figarch <- coef(fit_fi)["delta"]

spec_g <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
                      mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
                      distribution.model = "std")
fit_g <- ugarchfit(spec_g, r, solver = "hybrid")

cat(sprintf("FIGARCH: d=%.4f | AIC=%.4f\n", d_figarch, infocriteria(fit_fi)[1]))
cat(sprintf("GARCH(1,1): alpha+beta=%.4f | AIC=%.4f\n",
            sum(coef(fit_g)[c("alpha1", "beta1")]), infocriteria(fit_g)[1]))
cat("\nCinco metodos independientes (Hurst, GPH, Whittle, ARFIMA, FIGARCH) coinciden en d~0.44:\n")
cat("evidencia solida de memoria larga genuina en la volatilidad del IBEX 35.\n")

# === FIN Caso Práctico Financiero — Tema 16 (IBEX 35, memoria larga) ===