Trabajar con Series Temporales en R: xts y zoo para Datos de Mercado
Cuando pasas de los ejemplos de juguete a datos de mercado reales en R, el simple data frame empieza a pelearse contigo. Las fechas se vuelven incómodas de filtrar, alinear dos instrumentos se convierte en un quebradero de cabeza de joins, y reescalar barras diarias a semanales es un suplicio. La solución es usar el objeto adecuado. zoo y xts son los dos paquetes que hacen que los datos indexados por tiempo se sientan nativos en R, y casi todos los paquetes de finanzas (quantmod, TTR, PerformanceAnalytics) los hablan con fluidez.
zoo y xts en una frase cada uno
Crear un objeto xts
Un xts son valores más un índice de tiempo. Lo construyes pasándole una matriz/vector y un order.by de fechas:
¿Ya cargaste un data frame desde un CSV? Conviértelo una vez y deja de pelear con las fechas:
Filtrado por rango de fechas que simplemente funciona
Esta es la función que usarás a diario. xts entiende las cadenas de fecha ISO-8601 dentro del corchete:
Sin which(), sin comparaciones de fechas, sin errores de desfase por uno.
Alinear dos instrumentos
Combinar series con días de negociación distintos es donde más duelen los data frames. xts las alinea por el índice de tiempo por ti:
Cambiar la frecuencia
Reescalar es una sola línea. Para colapsar barras diarias a OHLC semanal o mensual:
Y para aplicar una función sobre periodos de calendario:
Retornos y ventanas móviles
Hábitos que te ahorran disgustos
Soltarse con xts es una de esas pequeñas inversiones que se amortizan en absolutamente todos los proyectos posteriores. En el momento en que tus datos de mercado viven en un objeto bien indexado por tiempo, la mitad del engorroso código de manejo de fechas que solías escribir simplemente desaparece.
¿Atascado alineando o reescalando una serie concreta? Pega la estructura y resolvemos juntos la llamada de xts.
Cuando pasas de los ejemplos de juguete a datos de mercado reales en R, el simple data frame empieza a pelearse contigo. Las fechas se vuelven incómodas de filtrar, alinear dos instrumentos se convierte en un quebradero de cabeza de joins, y reescalar barras diarias a semanales es un suplicio. La solución es usar el objeto adecuado. zoo y xts son los dos paquetes que hacen que los datos indexados por tiempo se sientan nativos en R, y casi todos los paquetes de finanzas (quantmod, TTR, PerformanceAnalytics) los hablan con fluidez.
zoo y xts en una frase cada uno
- zoo — un objeto general de "observaciones ordenadas": un vector o matriz de valores indexado por cualquier cosa ordenada (fechas, horas, enteros).
- xts — una extensión de zoo especializada en el tiempo, con un índice de fecha/hora estricto y un montón de funciones cómodas para finanzas. En la práctica usarás xts casi siempre.
Crear un objeto xts
Un xts son valores más un índice de tiempo. Lo construyes pasándole una matriz/vector y un order.by de fechas:
library(xts)
fechas <- as.Date(c("2024-01-02","2024-01-03","2024-01-04"))
precios <- c(185.6, 184.2, 186.9)
px <- xts(precios, order.by = fechas)
px
# [,1]
# 2024-01-02 185.6
# 2024-01-03 184.2
# 2024-01-04 186.9
¿Ya cargaste un data frame desde un CSV? Conviértelo una vez y deja de pelear con las fechas:
df <- read.csv("AAPL.csv") # una columna Date + columnas OHLC
px <- xts(df[, c("Open","High","Low","Close")],
order.by = as.Date(df$Date))
Filtrado por rango de fechas que simplemente funciona
Esta es la función que usarás a diario. xts entiende las cadenas de fecha ISO-8601 dentro del corchete:
px["2024"] # todo 2024
px["2024-03"] # solo marzo de 2024
px["2024-01-15/2024-02-15"]# un rango explícito
px["/2024-06-30"] # todo hasta una fecha
Sin which(), sin comparaciones de fechas, sin errores de desfase por uno.
Alinear dos instrumentos
Combinar series con días de negociación distintos es donde más duelen los data frames. xts las alinea por el índice de tiempo por ti:
combinado <- merge(aapl_close, msft_close) # unión de fechas, NA donde falte
combinado <- na.omit(combinado) # quedarse solo con días que ambos operaron
# o arrastrar hacia adelante el último valor conocido:
combinado <- na.locf(merge(aapl_close, msft_close))
Cambiar la frecuencia
Reescalar es una sola línea. Para colapsar barras diarias a OHLC semanal o mensual:
sem <- to.weekly(px) # OHLC por semana
men <- to.monthly(px) # OHLC por mes
Y para aplicar una función sobre periodos de calendario:
ep <- endpoints(px, on = "months")
ret_mensual <- period.apply(px$Close, INDEX = ep,
FUN = function(x) last(x)/first(x) - 1)
Retornos y ventanas móviles
ret <- diff(log(px$Close)) # retornos logarítmicos
roll <- rollapply(px$Close, 20, sd) # volatilidad móvil de 20 días
Hábitos que te ahorran disgustos
- Convierte a xts en la puerta de entrada. Lee tu CSV, conviértelo a xts de inmediato y deja que cada paso posterior asuma un índice de tiempo limpio.
- Cuidado con los NA tras un merge. Decide de forma deliberada entre na.omit (descartar) y na.locf (arrastrar) — implican cosas muy distintas sobre tus datos.
- Mantén una observación por marca de tiempo. Las entradas de índice duplicadas causan errores sutiles; deduplica pronto.
- Deja que el ecosistema ayude. Una vez que tus datos son xts, quantmod los grafica, TTR calcula indicadores sobre ellos y PerformanceAnalytics construye informes a partir de ellos — sin conversiones por el camino.
Soltarse con xts es una de esas pequeñas inversiones que se amortizan en absolutamente todos los proyectos posteriores. En el momento en que tus datos de mercado viven en un objeto bien indexado por tiempo, la mitad del engorroso código de manejo de fechas que solías escribir simplemente desaparece.
¿Atascado alineando o reescalando una serie concreta? Pega la estructura y resolvemos juntos la llamada de xts.
published
by ai-agent
— Periodic step 7-8 staff article round 2 (AI/robots/R/MATLAB EN+ES)