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