Forum Sign in Register

Trading Cuantitativo en R: Backtesting de Estrategias con quantmod, TTR y PerformanceAnalytics

Started by Support 5 days ago · 0 replies RSS

Trading Cuantitativo en R: Backtesting de Estrategias con quantmod, TTR y PerformanceAnalytics

R y RStudio forman un ciclo de prototipado de ideas de trading inusualmente rápido: descargas datos, calculas indicadores, construyes una señal y ves una curva de capital en unas pocas líneas. El problema es que esa misma brevedad hace fácil engañarte a ti mismo con el sesgo de anticipación y con ejecuciones sin fricción. Esta guía recorre el stack cuantitativo canónico de R —quantmod para datos y gráficos, TTR para indicadores y PerformanceAnalytics para estadísticas honestas de rendimiento y riesgo— y señala dónde están los bordes afilados.

El stack

  • quantmod — descarga datos de precios y ofrece gráficos y accesos cómodos como Cl() y Op().
  • TTR — los indicadores: SMA, EMA, RSI, MACD, BBands, ATR y muchos más.
  • PerformanceAnalytics — convierte una serie de rendimientos en Sharpe, drawdown y un gráfico resumen de rendimiento.
  • xts/zoo — los objetos de series temporales sobre los que se construye todo lo anterior.


Obtener los datos

getSymbols trae un objeto xts directamente a tu entorno:


library(quantmod)
getSymbols("AAPL", src = "yahoo", from = "2015-01-01")
prices <- Cl(AAPL) # la serie de cierres


Una nota de honestidad: las fuentes de datos gratuitas cambian y se rompen. Yahoo funciona casi siempre, pero no es un contrato; si falla, cambia src a un proveedor con clave como Tiingo o Alpha Vantage, o lee tu propio CSV con read.zoo. Diseña tu investigación para que una fuente inestable sea un cambio de una línea, no una reescritura.

Indicadores con TTR


library(TTR)
sma50 <- SMA(prices, n = 50)
rsi14 <- RSI(prices, n = 14)
macd <- MACD(prices) # devuelve las columnas macd y signal
bands <- BBands(prices) # dn, mavg, up, pctB


Un backtest sencillo y honesto

Aquí tienes un cruce de medias móviles mínimo. La línea que más importa es el lag: desplaza la señal un día hacia delante para que la posición se tome en la barra siguiente a la aparición de la señal, no en el mismo cierre que la produjo. Si lo omites, tu backtest opera con información que aún no tenía:


library(PerformanceAnalytics)

signal <- ifelse(SMA(prices, 20) > SMA(prices, 50), 1, 0)
signal <- lag(signal) # actúa en la barra siguiente — sin anticipación
returns <- ROC(prices, type = "discrete") # rendimientos diarios
strat <- signal * returns # flujo de rendimientos de la estrategia
strat[is.na(strat)] <- 0


Evaluarlo

Aquí es donde PerformanceAnalytics se gana su sitio: un gráfico y un par de números te dicen casi todo lo que necesitas:


charts.PerformanceSummary(strat) # curva de capital + drawdown
SharpeRatio.annualized(strat)
maxDrawdown(strat)
table.AnnualizedReturns(strat)


Compara el flujo de la estrategia con comprar y mantener (returns) en el mismo gráfico. Una estrategia que rinde menos que simplemente mantener el activo, una vez añadidos los costes, no es una estrategia.

Las advertencias que no puedes ignorar

  • Este modelo no tiene costes. El backtest vectorizado de arriba ignora comisiones, el spread entre oferta y demanda y el slippage. Esas fricciones convierten con frecuencia a un ganador sobre el papel en un perdedor real, así que toma estos resultados solo como un filtro de ideas.
  • Sesgo de anticipación. El único lag() hace el trabajo de verdad. Quítalo y tus números parecerán brillantes y no valdrán nada.
  • Sesgo de supervivencia. Hacer backtest solo con valores que aún existen hoy adula todos los resultados. Las acciones que dejaron de cotizar son justo las que una estrategia real habría estado manteniendo.
  • Vectorizado frente a basado en eventos. Para el dimensionamiento de posiciones, las ejecuciones parciales y una contabilidad realista acabarás superando este estilo; los paquetes más pesados quantstrat y blotter existen para backtests basados en eventos cuando una idea merece ese esfuerzo.


En resumen

El stack quantmod + TTR + PerformanceAnalytics te lleva de una hipótesis a una curva de capital más rápido que casi cualquier otra cosa, lo que hace de R un entorno excelente de investigación y filtrado. Respeta el lag, sé honesto sobre los costes y la supervivencia, y usa este ciclo para descartar malas ideas a bajo coste. Cuando una idea sobreviva a ese escrutinio sobre datos fuera de muestra, llévala a un test basado en eventos y consciente de los costes antes de arriesgar un solo céntimo en real.
clean by ai-agent

Sign in to reply.