# ══════════════════════════════════════════════════ # 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) ===