Trading Algorítmico en Python: Análisis Cuantitativo de Acciones con Pandas
Respuesta rápida
El trading algorítmico en Python consiste en usar datos históricos y reglas programadas para analizar acciones y probar estrategias antes de operar. El paso clave es el backtesting: simular la estrategia con datos del pasado para ver cómo se habría comportado, sabiendo que un buen resultado histórico no garantiza resultados futuros. Antes de usar dinero real, el paso prudente es el paper trading, con precios en vivo pero sin capital real.
Lo Que Dominarás en Este Tutorial
- Obtener datos históricos limpios de acciones y ETFs mediante APIs modernas de Python
- Calcular indicadores técnicos vectorizados: Medias Móviles Exponenciales (EMA), MACD y RSI
- Generar señales sistemáticas de compra y venta sin sesgo de anticipación (lookahead bias)
- Calcular métricas cuantitativas clave: Máximo Drawdown, Ratio de Sharpe y CAGR
import pandas as pd
import numpy as np
def calculate_momentum_strategy(df: pd.DataFrame, fast: int = 20, slow: int = 50) -> pd.DataFrame:
"""
Calcula cruces de EMA y evalúa la curva de capital de la estrategia.
"""
df = df.copy()
df['EMA_Fast'] = df['Close'].ewm(span=fast, adjust=False).mean()
df['EMA_Slow'] = df['Close'].ewm(span=slow, adjust=False).mean()
# Señal de posición (1 para Comprado, 0 para Liquidez)
df['Signal'] = np.where(df['EMA_Fast'] > df['EMA_Slow'], 1, 0)
df['Position'] = df['Signal'].shift(1) # Desplazar para evitar anticipación
# Retornos logarítmicos diarios
df['Market_Return'] = np.log(df['Close'] / df['Close'].shift(1))
df['Strategy_Return'] = df['Position'] * df['Market_Return']
df['Cumulative_Market'] = df['Market_Return'].cumsum().apply(np.exp)
df['Cumulative_Strategy'] = df['Strategy_Return'].cumsum().apply(np.exp)
return df
Preguntas Frecuentes
Profundizando: el backtesting de momentum en la práctica
La estrategia de este tutorial —un cruce de medias EMA 20/50 con las posiciones desplazadas una vela— es deliberadamente sencilla, y ahí está su valor: aísla la mecánica que importa en cualquier backtest. En la práctica, ese mismo flujo se extiende a limpiar y alinear los datos históricos antes de calcular una sola señal, a validar los parámetros en periodos sobre los que la estrategia no fue ajustada y a modelar las fricciones que el código omite, como comisiones, diferenciales y deslizamiento. Las métricas de riesgo presentadas aquí —drawdown máximo, ratio de Sharpe y CAGR— son el criterio para juzgar si una curva es robusta o solo tuvo suerte. Recuerda que cada cifra que produce un backtest es rendimiento histórico simulado: describe lo que habría ocurrido en el pasado, no lo que pasará en vivo, y nunca garantiza resultados futuros.
Errores comunes
- Sesgo de anticipación. Calcular una señal con el cierre de la misma vela y operar sobre ella en esa misma vela filtra información del futuro; el desplazamiento de una vela del tutorial existe precisamente para evitarlo.
- Ignorar los costos de transacción. Un sistema de cruces opera con frecuencia, y las comisiones más el deslizamiento pueden convertir en silencio una curva de capital aparentemente rentable en una perdedora.
- Sobreajustar los parámetros. Ajustar los periodos de las EMA hasta que un periodo histórico se ve perfecto suele fracasar con datos nuevos; prueba la estrategia en periodos que no usaste para optimizar.
- Sesgo de supervivencia y de datos. Hacer backtesting solo con acciones que existen hoy, o con precios sin ajustar, infla los resultados porque los fracasos retirados del mercado y los splits se tratan mal.
Preguntas frecuentes
¿Por qué el código desplaza la señal una vela?
Para que la posición de cada día se decida solo con datos que ya se conocían por completo el día anterior. Sin ese desplazamiento, el backtest estaría operando con información del futuro.
Si un backtest se ve rentable, ¿la estrategia ganará dinero en vivo?
No necesariamente. Los backtests son rendimiento histórico simulado, sin costos reales de ejecución, sin deslizamiento y sin cambios de régimen de mercado, y nunca garantizan resultados futuros.
¿Qué métrica de riesgo debería mirar primero?
El drawdown máximo. El ratio de Sharpe y el CAGR describen la calidad del rendimiento, pero el drawdown te dice la peor caída de pico a valle que habrías tenido que soportar para obtenerlos.
Del backtest al paper trading: el paso que más guías omiten
Un backtest muestra cómo se habría comportado una estrategia con datos históricos. Es una simulación, no una garantía, y puede verse mejor que la realidad si la estrategia se ajustó para encajar en esos mismos datos. Antes de arriesgar dinero real, ejecuta la misma lógica en paper trading, con precios en vivo pero sin capital real, y compara ambos resultados. Si los resultados en papel divergen mucho del backtest, la estrategia, los datos o los costos aún no se entienden lo suficiente.
Lista práctica: usa solo datos que habrían estado disponibles en cada momento de decisión, incluye costos y deslizamiento en la simulación y guarda un registro de cada operación del sistema en papel. Solo después de un periodo en papel que puedas explicar tendría sentido hablar de capital real, y aun así el rendimiento pasado nunca garantiza resultados futuros.
Para construir el bot, revisa cómo construir bots de trading con Python y la guía de Python para principiantes.