← Catálogo · Capítulo 17

T17_mST_CP_Financiero.R

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