Implementación de redes neuronales LSTM para predicción de series temporales
Resultados, optimización de hiperparámetros y lecciones aprendidas
La aplicación de machine learning en trading cuantitativo ha evoluc ionado dramáticamente en los últimos años. Las redes neuronales LSTM (Long Short-Term Memory), diseñadas específicamente para series temporales, han demostrado capacidad para capturar patrones complejos que modelos tradicionales no pueden detectar.
Este artículo documenta mi experiencia construyendo un sistema LSTM para predecir movimientos de precio en criptomonedas, incluyendo arquitectura, resultados reales, y errores costosos que cometí (para que tú no los repitas).
Los precios financieros son notoriamente difíciles de predecir por varias razones:
A pesar de estos desafíos, ML puede añadir edge si se implementa correctamente. La clave está en no intentar "predecir el futuro" sino en identificar probabilidades sesgadas a nuestro favor.
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dropout, Dense, Bidirectional
def build_lstm_model(input_shape, output_classes):
model = Sequential([
# Primera capa LSTM bidireccional
Bidirectional(LSTM(128, return_sequences=True),
input_shape=input_shape),
Dropout(0.3),
# Segunda capa LSTM
Bidirectional(LSTM(64, return_sequences=True)),
Dropout(0.3),
# Tercera capa LSTM
LSTM(32),
Dropout(0.2),
# Capas densas
Dense(64, activation='relu'),
Dropout(0.2),
Dense(32, activation='relu'),
# Capa de salida (clasificación: Up/Down/Neutral)
Dense(output_classes, activation='softmax')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss='categorical_crossentropy',
metrics=['accuracy', 'AUC']
)
return model
El éxito del modelo depende críticamente de las features. Estas son las que mejor funcionaron:
CRÍTICO: No uses k-fold cross-validation con series temporales. Esto causa data leakage. Usa walk-forward splits:
Usé Optuna para optimización bayesiana. Después de 200+ trials:
Optimal Hyperparameters:
- Sequence length: 48 hours
- Batch size: 256
- LSTM units: [128, 64, 32]
- Dropout: [0.3, 0.3, 0.2]
- Learning rate: 0.001 → 0.0001 (decay)
- Early stopping patience: 15 epochs
- Label: 4-hour forward return classification
Implementando una estrategia simple: buy cuando el modelo predice "Up" con >70% confidence:
Inicialmente usé cierre diario para features. Problema: el close del día no está disponible hasta que el día termina. Solución: usar solo datos hasta timestamp T-1 para predecir T.
Iteré hiperparámetros mirando performance en validation set. Esto es indirecto overfitting. Solución: usar validation solo para early stopping, test set para evaluación real.
Backtest inicial no incluía slippage y fees. En realidad, costs de ~0.2% por trade matan estrategias de alta frecuencia. Solución: siempre incluir 0.1-0.3% cost por trade en backtests.
Combinar LSTM con XGBoost (árbol de decisiones) mejoró accuracy en 4%. Cada modelo captura diferentes patrones. Promedio ponderado: 60% LSTM + 40% XGBoost.
Entrenar modelos separados para bull/bear/sideways markets mejoró Sharpe de 2.1 a 2.7. Usar HMM (Hidden Markov Model) para detectar régimen actual antes de aplicar modelo apropiado.
Machine learning en trading NO es una bala mágica. Después de un año de desarrollo y múltiples iteraciones:
El modelo actual genera aproximadamente 8-12 señales por semana con 67% win rate y risk/reward de 1:1.8. No es perfecto, pero combado con risk management sólido, ha demostrado ser rentable en live trading por 6+ meses.