← Catálogo
· Capítulo 17
T17_mST_CP_Financiero.R
# ══════════════════════════════════════════════════
# T17 · Caso práctico Financiero — IBEX 35 y VIX
# Abre primero mSeriesTemporales.Rproj en RStudio
# ══════════════════════════════════════════════════
library(tidyverse)
library(rugarch)
pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") {
if (interactive()) { cat(msg); invisible(readline()) }
}
# ── 1. VOLATILIDAD DE PARKINSON SOBRE EL IBEX ─────
source("scripts/deskR.R")
ibex <- desk_read("_IBEX") |> rename(high = máximo, low = mínimo)
ibex <- ibex |> mutate(rv_park = (1 / (4 * log(2))) * (log(high / low))^2)
ret_ibex <- desk_returns("_IBEX", type = "log")
vol_park <- sqrt(mean(ibex$rv_park, na.rm = TRUE) * 252) * 100
vol_cc <- sd(ret_ibex$return) * sqrt(252) * 100
cat(sprintf("Volatilidad Parkinson: %.2f%% | Volatilidad cierre-a-cierre: %.2f%%\n", vol_park, vol_cc))
pausa()
# ── 2. MODELO HAR-RV ───────────────────────────────
ibex_har <- ibex |>
arrange(date) |>
mutate(
rv_d = lag(rv_park, 1),
rv_w = zoo::rollapply(lag(rv_park, 1), width = 5, FUN = mean, align = "right", fill = NA),
rv_m = zoo::rollapply(lag(rv_park, 1), width = 22, FUN = mean, align = "right", fill = NA)
) |>
drop_na(rv_park, rv_d, rv_w, rv_m)
m_har <- lm(rv_park ~ rv_d + rv_w + rv_m, data = ibex_har)
print(summary(m_har))
pausa()
# ── 3. VIX FRENTE A VOLATILIDAD GARCH DEL S&P 500 ─
vix <- desk_read("_VIX")
r_sp <- desk_returns("_GSPC", type = "log")
spec_sp <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = TRUE),
distribution.model = "std")
fit_sp <- ugarchfit(spec_sp, r_sp$return, solver = "hybrid")
df_garch_sp <- tibble(fecha = as.Date(r_sp$date), vol_garch = as.numeric(sigma(fit_sp)) * sqrt(252) * 100)
df_vix <- vix |> transmute(fecha = date, vix = close)
m_vix <- inner_join(df_garch_sp, df_vix, by = "fecha")
cat(sprintf("Correlacion GARCH-vol vs VIX: %.3f\n", cor(m_vix$vol_garch, m_vix$vix)))
cat(sprintf("Prima media (VIX - GARCH): %.2f puntos porcentuales\n", mean(m_vix$vix - m_vix$vol_garch)))
cat(sprintf("VIX > GARCH-vol en el %.1f%% de las sesiones\n", mean(m_vix$vix > m_vix$vol_garch) * 100))
# === FIN Caso Práctico Financiero — Tema 17 (IBEX 35 y VIX, volatilidad realizada) ===