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