← Catálogo · Capítulo 9

T09_mST_CP_Financiero.R

Ver crudo
# ══════════════════════════════════════════════════
# T09 · Caso práctico Financiero — IBEX 35 (Decision Desk)
# Abre primero mSeriesTemporales.Rproj en RStudio
# Datos: data/_IBEX.xlsx, via scripts/deskR.R
# ══════════════════════════════════════════════════

library(tidyverse)
library(rugarch)
source("scripts/deskR.R")

pausa <- function(msg = "\n  [Pulsa ENTER para continuar...]") {
  if (interactive()) { cat(msg); invisible(readline()) }
}

# ── 1. CARGA Y RENDIMIENTOS ───────────────────────
ibex <- desk_read("_IBEX")
ret  <- desk_returns("_IBEX", type = "log")
r    <- ret$return
cat(sprintf("IBEX 35: %d sesiones, %s a %s\n", nrow(ibex),
            format(min(ibex$date), "%Y-%m-%d"), format(max(ibex$date), "%Y-%m-%d")))
pausa()

# ── 2. AGRUPACION DE VOLATILIDAD (visual) ─────────
op <- par(mfrow = c(2, 1))
plot(ibex$date, ibex$close, type = "l", col = "steelblue", main = "IBEX 35 (cierre)", xlab = "", ylab = "Precio")
plot(ret$date, ret$return * 100, type = "l", col = "grey30", main = "Rendimiento diario (%)", xlab = "Año", ylab = "%")
abline(h = 0, lty = 2)
par(op)
pausa()

# ── 3. CONTRASTE LM DEL EFECTO ARCH ───────────────
e <- r - mean(r); e2 <- e^2; m <- 5; 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
cv <- qchisq(0.95, m)
cat(sprintf("Contraste LM (m=%d): R2=%.4f  LM=%.2f  cv=%.2f -> %s\n", m, R2, LM, cv,
            ifelse(LM > cv, "se rechaza H0 (hay efecto ARCH)", "no se rechaza")))
pausa()

# ── 4. GARCH(1,1) SIMETRICO ───────────────────────
spec_garch <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
                          mean.model = list(armaOrder = c(0, 0), include.mean = TRUE))
m_garch <- ugarchfit(spec_garch, r, solver = "hybrid")
print(m_garch@fit$matcoef)
persist <- sum(coef(m_garch)[c("alpha1", "beta1")])
cat(sprintf("Persistencia alpha+beta = %.4f | semivida = %.1f dias\n",
            persist, log(0.5) / log(persist)))
pausa()

# ── 5. EGARCH Y GJR-GARCH (ASIMETRICOS) ───────────
spec_egarch <- ugarchspec(variance.model = list(model = "eGARCH", garchOrder = c(1, 1)),
                           mean.model = list(armaOrder = c(0, 0), include.mean = TRUE))
m_egarch <- ugarchfit(spec_egarch, r, solver = "hybrid")

spec_gjr <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)),
                        mean.model = list(armaOrder = c(0, 0), include.mean = TRUE))
m_gjr <- ugarchfit(spec_gjr, r, solver = "hybrid")

cat("AIC GARCH  :", infocriteria(m_garch)[1], "\n")
cat("AIC EGARCH :", infocriteria(m_egarch)[1], "\n")
cat("AIC GJR    :", infocriteria(m_gjr)[1], "\n")

ni <- newsimpact(m_egarch)
plot(ni$zx, ni$zy, type = "l", col = "steelblue", lwd = 2,
     main = "Curva de impacto de noticias (EGARCH)", xlab = "Choque estandarizado", ylab = "Varianza condicional")
abline(v = 0, lty = 2)
pausa()

# ── 6. VOLATILIDAD CONDICIONAL Y PREDICCION ───────
sigma_hoy <- tail(as.numeric(sigma(m_egarch)), 1)
sigma_media <- mean(as.numeric(sigma(m_egarch)))
cat(sprintf("Volatilidad condicional actual: %.2f%%  (media historica: %.2f%%)\n",
            sigma_hoy * 100, sigma_media * 100))

fc <- ugarchforecast(m_egarch, n.ahead = 10)
plot(1:10, as.numeric(sigma(fc)) * 100, type = "b", col = "steelblue",
     main = "Prediccion de volatilidad a 10 dias (EGARCH)", xlab = "Dias", ylab = "Volatilidad (%)")

# === FIN Caso Práctico Financiero — Tema 09 (IBEX 35, ARCH/GARCH) ===