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