← Catálogo · Capítulo 17

T17_mST_Script_VolatilidadRealizada.R

Ver crudo
# ══════════════════════════════════════════════════
# T17 · Series Temporales — Volatilidad Realizada y Datos de Alta Frecuencia
# Abre primero mSeriesTemporales.Rproj en RStudio
# ══════════════════════════════════════════════════

library(tidyverse)
library(highfrequency)
library(data.table)

pausa <- function(msg = "\n  [Pulsa ENTER para continuar...]") {
  if (interactive()) { cat(msg); invisible(readline()) }
}

set.seed(2026)

# ── 1. DATOS DE DEMOSTRACION: sampleTData (highfrequency) ─
data(sampleTData)
dt <- as.data.table(sampleTData)
cat(sprintf("sampleTData: %d ticks, %d sesiones (%s a %s)\n",
            nrow(dt), length(unique(as.Date(dt$DT))), min(dt$DT), max(dt$DT)))
pausa()

# ── 2. VOLATILIDAD REALIZADA A 5 MINUTOS ──────────
rv_5min <- rRVar(dt[, list(DT, PRICE)], alignBy = "minutes", alignPeriod = 5, makeReturns = TRUE)
print(rv_5min)
cat(sprintf("Volatilidad anualizada media (5 min): %.2f%%\n", sqrt(mean(rv_5min$RVar) * 252) * 100))
pausa()

# ── 3. GRAFICO DE FIRMA DE VOLATILIDAD ────────────
especificaciones <- list(c("seconds", 1), c("seconds", 5), c("seconds", 30),
                          c("minutes", 1), c("minutes", 5), c("minutes", 15), c("minutes", 30))
rv_frecuencias <- sapply(especificaciones, function(s) {
  rv <- rRVar(dt[, list(DT, PRICE)], alignBy = s[1], alignPeriod = as.numeric(s[2]), makeReturns = TRUE)
  mean(rv$RVar)
})
etiquetas <- c("1s", "5s", "30s", "1min", "5min", "15min", "30min")
plot(sqrt(rv_frecuencias * 252) * 100, type = "b", xaxt = "n",
     xlab = "Frecuencia de muestreo", ylab = "Volatilidad anualizada (%)",
     main = "Grafico de firma de volatilidad")
axis(1, at = 1:length(etiquetas), labels = etiquetas)
cat("El aumento a alta frecuencia es la firma del ruido de microestructura.\n")
pausa()

# ── 4. MODELO HAR-RV SOBRE UNA SERIE SIMULADA CON MEMORIA LARGA ─
n <- 1000
rv_sim <- numeric(n)
rv_sim[1:22] <- abs(rnorm(22, mean = 0.0001, sd = 0.00003))
for (t in 23:n) {
  rv_d <- rv_sim[t - 1]
  rv_w <- mean(rv_sim[(t - 5):(t - 1)])
  rv_m <- mean(rv_sim[(t - 22):(t - 1)])
  rv_sim[t] <- max(0.00001, 0.3 * rv_d + 0.3 * rv_w + 0.3 * rv_m + rnorm(1, sd = 0.00002))
}
df_sim <- tibble(t = 1:n, rv = rv_sim) |>
  mutate(rv_d = lag(rv, 1),
         rv_w = zoo::rollapply(lag(rv, 1), width = 5, FUN = mean, align = "right", fill = NA),
         rv_m = zoo::rollapply(lag(rv, 1), width = 22, FUN = mean, align = "right", fill = NA)) |>
  drop_na()
m_har_sim <- lm(rv ~ rv_d + rv_w + rv_m, data = df_sim)
cat("HAR-RV sobre serie simulada (coeficientes deberian acercarse a 0.3, 0.3, 0.3):\n")
print(round(coef(m_har_sim), 3))

# === FIN Script T17 — Volatilidad Realizada y Datos de Alta Frecuencia ===