← Catálogo
· Capítulo 13
T13_mST_CP_Financiero.R
# ══════════════════════════════════════════════════
# T13 · Caso práctico Financiero — IBEX 35 (Decision Desk)
# Abre primero mSeriesTemporales.Rproj en RStudio
# ══════════════════════════════════════════════════
library(tidyverse)
library(moments)
library(tseries)
library(rugarch)
pausa <- function(msg = "\n [Pulsa ENTER para continuar...]") {
if (interactive()) { cat(msg); invisible(readline()) }
}
# ── 1. CARGA Y MOMENTOS MUESTRALES ────────────────
source("scripts/deskR.R")
ret_ibex <- desk_returns("_IBEX", type = "log")
ret_ibex$fecha <- as.Date(ret_ibex$date)
r <- ret_ibex$return
cat(sprintf("n = %d | asimetria = %.3f | curtosis = %.2f (exceso = %.2f)\n",
length(r), skewness(r), kurtosis(r), kurtosis(r) - 3))
jb <- jarque.bera.test(r)
cat(sprintf("Jarque-Bera: stat=%.1f p=%.4g -> se rechaza normalidad\n", jb$statistic, jb$p.value))
pausa()
# ── 2. AJUSTE DE DISTRIBUCIONES DE COLAS GRUESAS ──
fit_t <- MASS::fitdistr(r, "t", start = list(m = mean(r), s = sd(r), df = 5))
cat(sprintf("t de Student: nu estimado = %.2f\n", fit_t$estimate["df"]))
ged_fit <- fitdist(distribution = "ged", x = (r - mean(r)) / sd(r))
cat(sprintf("GED: forma estimada = %.3f (2 = normal)\n", ged_fit$pars["shape"]))
pausa()
# ── 3. GAUSSIANIDAD AGREGADA ───────────────────────
ret_sem <- ret_ibex |> mutate(p = format(fecha, "%Y-%U")) |> group_by(p) |> summarise(r = sum(return))
ret_mes <- ret_ibex |> mutate(p = format(fecha, "%Y-%m")) |> group_by(p) |> summarise(r = sum(return))
cat(sprintf("Curtosis: diaria=%.2f semanal=%.2f mensual=%.2f\n",
kurtosis(r), kurtosis(ret_sem$r), kurtosis(ret_mes$r)))
pausa()
# ── 4. EFECTOS DE CALENDARIO ──────────────────────
ret_ibex$dow <- weekdays(ret_ibex$fecha)
dias <- c("lunes", "martes", "miércoles", "jueves", "viernes")
tab_dow <- ret_ibex |> filter(dow %in% dias) |> group_by(dow) |> summarise(media = mean(return) * 100, n = n())
print(tab_dow)
aov_dow <- aov(return ~ dow, data = ret_ibex |> filter(dow %in% dias))
cat("ANOVA efecto dia de la semana:\n"); print(summary(aov_dow))
ret_ibex$mes <- lubridate::month(ret_ibex$fecha)
t_ene <- t.test(return ~ (mes == 1), data = ret_ibex)
cat(sprintf("\nEfecto enero: media enero=%.4f%% media resto=%.4f%% p-valor=%.3f\n",
mean(ret_ibex$return[ret_ibex$mes == 1]) * 100,
mean(ret_ibex$return[ret_ibex$mes != 1]) * 100, t_ene$p.value))
cat("Ninguno de los dos efectos de calendario resulta significativo en la muestra completa.\n")
# === FIN Caso Práctico Financiero — Tema 13 (IBEX 35, hechos estilizados) ===