reinforcement learning - ErnestoCobos/MidasV4 GitHub Wiki
Aprendizaje por Refuerzo en MidasScalpingv4
Este documento explica el sistema de aprendizaje por refuerzo implementado en MidasScalpingv4 para mejorar las decisiones de trading y adaptarse dinámicamente a las condiciones cambiantes del mercado.
Introducción al Aprendizaje por Refuerzo para Trading
El aprendizaje por refuerzo (RL) es un paradigma de aprendizaje automático en el que un agente aprende a tomar decisiones óptimas mediante la interacción con un entorno, recibiendo recompensas o penalizaciones por sus acciones. En el contexto del trading, el agente es el algoritmo de trading, el entorno es el mercado, y las recompensas son los beneficios o pérdidas generados.
Ventajas del RL para Trading
- Aprendizaje continuo: El sistema mejora constantemente con nuevos datos de mercado
- Adaptabilidad: Se ajusta a diferentes regímenes de mercado (tendencia, rango, volatilidad)
- Optimización directa: Aprende a maximizar el rendimiento financiero, no métricas indirectas
- Gestión de riesgo integrada: Puede incorporar penalizaciones por drawdown y volatilidad
Arquitectura del Modelo RL
MidasScalpingv4 implementa un modelo de aprendizaje por refuerzo basado en redes Q duales con ramificación de acciones, inspirado en el enfoque DeepScalper presentado en investigaciones académicas.
Componentes Principales
1. RLTradingModel
El núcleo del sistema es la clase RLTradingModel
(en models/deep_scalper.py
), que implementa:
- Red Q dual: Separa la estimación del valor del estado (V) de las ventajas de cada acción (A)
- Ramificación de acciones: Permite descomponer el espacio de acciones en tipos (comprar/vender/mantener) y tamaños de posición
- Memoria de experiencia: Almacena experiencias previas para entrenamiento por lotes
- Actualización suave de la red objetivo: Mejora la estabilidad del aprendizaje
# Arquitectura de alto nivel:
def _build_network(self):
# Red convolucional para patrones a corto plazo
conv_features = Conv1D(...)(input)
# LSTM bidireccional para dependencias temporales
temporal_features = Bidirectional(LSTM(...))(input)
# Red dual (valor + ventaja)
value = Dense(1)(value_stream)
advantages = [Dense(size_dim)(advantage_stream) for action_type]
# Q(s,a) = V(s) + A(s,a) - mean(A(s,a'))
q_values = [value + advantage - mean(advantage) for advantage in advantages]
return Model(inputs=input, outputs=q_values)
2. RLStrategy
La clase RLStrategy
(en strategy/rl_strategy.py
) integra el modelo RL con el sistema de trading:
- Gestiona el estado del mercado como entrada para el modelo
- Mapea las acciones del modelo a señales de trading concretas
- Calcula las recompensas basadas en resultados de trading
- Implementa Experience Replay con bonificación retrospectiva
Representación del Estado
El estado del mercado se representa como una secuencia temporal de vectores de características, incluyendo:
- Indicadores técnicos: RSI, Bollinger Bands, ADX, medias móviles, etc.
- Datos de precios: OHLCV (Open, High, Low, Close, Volume)
- Métricas derivadas: Volatilidad, fuerza de tendencia, volumen relativo
- Características de velas: Tamaño del cuerpo, sombras superior e inferior
- Régimen de mercado: Clasificación del estado actual del mercado
# Ejemplo simplificado de preprocesamiento de estado:
def preprocess_state(self, features):
feature_list = []
# Extraer indicadores técnicos relevantes
for feature in ['rsi', 'bb_upper', 'bb_lower', 'sma_7', 'sma_25', ...]:
feature_list.append(features.get(feature, 0))
# Normalizar características para mejorar el aprendizaje
return np.array(feature_list)
Espacio de Acciones
El espacio de acciones está diseñado con ramificación para permitir decisiones más granulares:
-
Tipo de acción:
- Comprar (BUY)
- Vender (SELL)
- Mantener (HOLD)
-
Tamaño de posición:
- 5 niveles de tamaño (0-4), donde 0 es el más pequeño y 4 el más grande
- El tamaño se ajusta dinámicamente basado en volatilidad y drawdown
Esta estructura permite 15 posibles acciones (3 tipos × 5 tamaños).
Función de Recompensa
La función de recompensa está diseñada para balancear rendimiento y riesgo:
def calculate_reward(pnl, drawdown, volatility, win_streak):
# Recompensa base proporcional al P&L
base_reward = pnl * 10
# Penalización por drawdown
drawdown_penalty = drawdown * 2
# Bonificación por consistencia (rachas ganadoras)
consistency_bonus = min(win_streak * 0.1, 0.5)
# Penalización por volatilidad excesiva
volatility_penalty = max(0, volatility - 0.01) * 5
return base_reward + consistency_bonus - drawdown_penalty - volatility_penalty
Bonificación Retrospectiva
El sistema implementa una técnica de Hindsight Experience Replay (HER) que aprovecha el conocimiento posterior sobre el movimiento real del precio para mejorar el aprendizaje:
def hindsight_experience_replay(self, trajectory):
final_state = trajectory[-1][3]
for state, action, _, next_state, _ in trajectory:
# Calcular recompensa basada en el conocimiento de cómo evolucionó realmente el precio
hindsight_reward = self._calculate_hindsight_reward(state, final_state)
# Guardar experiencia relabelizada
self.memory.append((state, action, hindsight_reward, next_state, False))
Integración con Gestión de Riesgo
Una característica clave del sistema RL es su integración con el módulo de gestión de riesgo:
- Ajuste dinámico del tamaño: Reduce posiciones cuando hay drawdown significativo
- Tarea auxiliar de riesgo: El modelo también aprende a estimar el riesgo de cada operación
- Umbrales adaptativos: Ajusta los criterios de cierre de posiciones según el régimen de mercado
Entrenamiento y Actualización
El modelo se entrena y actualiza de varias formas:
- Entrenamiento inicial offline con datos históricos
- Aprendizaje online durante la operativa, actualizando gradualmente el modelo
- Reentrenamiento periódico programado (por ejemplo, diariamente o semanalmente)
El proceso de entrenamiento utiliza técnicas de estabilización:
- Replay buffer prioritizado: Muestrea experiencias más informativas con mayor frecuencia
- Doble Q-learning: Reduce el sobreoptimismo en la estimación de valores Q
- Actualización suave de la red objetivo: Mezcla lentamente los pesos para evitar inestabilidad
Uso en Producción
Para usar el modelo RL en producción:
- Asegúrate de que los parámetros de configuración
rl_*
estén correctamente establecidos - Inicializa la estrategia:
from strategy.rl_strategy import RLStrategy
# Inicialización
rl_strategy = RLStrategy(config, binance_client=client)
# Generación de señales
signal = await rl_strategy.generate_signal(symbol, features)
# Procesamiento de resultados tras cerrar posición
rl_strategy.process_trade_result(symbol, entry_price, exit_price, side, quantity)
Limitaciones y Consideraciones
- Periodo de calentamiento: El modelo necesita suficientes datos para generar señales confiables
- Exploración vs. explotación: Ajusta
epsilon
según tu tolerancia al riesgo - Requisitos computacionales: El entrenamiento puede requerir recursos significativos (CPU/GPU)
- Sobreajuste: Monitorea el rendimiento fuera de muestra para evitar sobreajustar a datos históricos
Métricas de Rendimiento
Para evaluar el modelo RL, se utilizan las siguientes métricas:
- Rendimiento financiero: Retorno, Sharpe ratio, Sortino ratio, drawdown máximo
- Precisión de decisión: Porcentaje de operaciones rentables, beneficio medio por operación
- Comportamiento adaptativo: Rendimiento en diferentes regímenes de mercado
- Convergencia de aprendizaje: Estabilidad de la función de pérdida durante el entrenamiento
Futuras Mejoras
Áreas de desarrollo futuro para el sistema RL:
- Implementación de Proximal Policy Optimization (PPO) para mayor estabilidad
- Incorporación de datos de order book para visión más profunda del mercado
- Aprendizaje multi-agente para diferentes símbolos/timeframes
- Meta-aprendizaje para adaptación más rápida a nuevos mercados