--- title: "Análisis de Modelos ML - Vuelta 1" version: "1.1.0" date: "2026-01-06" status: "Completed" author: "ML-Specialist + Orquestador" epic: "OQI-006" tags: ["ml", "analysis", "models", "attention", "factors"] --- # ANÁLISIS DE MODELOS ML - VUELTA 1 ## 1. RESUMEN EJECUTIVO Este documento presenta el análisis detallado de los modelos de Machine Learning existentes en el proyecto trading-platform (Trading Platform), identificando problemas, brechas y proponiendo soluciones para alcanzar el objetivo de **80%+ de acierto** en predicciones de movimientos fuertes con gestión de riesgo **2:1 o 3:1 (TP:SL)**. ### Objetivos del Análisis 1. Redefinir documentación y alcances de cada modelo 2. Implementar sistema de atención con factores dinámicos (ATR-based) 3. Separar modelos por activo y temporalidad (5m, 15m) 4. Diseñar arquitectura de metamodelo 5. Definir APIs y Frontend para visualización --- ## 2. INVENTARIO DE MODELOS EXISTENTES ### 2.1 Modelos de Predicción de Rangos | Modelo | Archivo | Propósito | Estado | |--------|---------|-----------|--------| | `RangePredictor` | `range_predictor.py` | Predice ΔHigh/ΔLow con XGBoost | ✅ Funcional | | `RangePredictorFactor` | `range_predictor_factor.py` | Predice multiplicadores de factor base | ✅ Funcional | | `EnhancedRangePredictor` | `enhanced_range_predictor.py` | Integra weighting + dual horizon | ✅ Funcional | | `MovementMagnitudePredictor` | `movement_magnitude_predictor.py` | Predice movimiento en USD | ✅ Funcional | ### 2.2 Modelos de Atención y Volatilidad | Modelo | Archivo | Propósito | Estado | |--------|---------|-----------|--------| | `VolatilityBiasedSelfAttention` | `volatility_attention.py` | Attention con bias de volatilidad (PyTorch) | ✅ Funcional | | `VolatilityRangePredictor` | `volatility_attention.py` | Transformer con attention de volatilidad | ✅ Funcional | | `DynamicFactorWeighter` | `dynamic_factor_weighting.py` | Weighting dinámico con softplus | ✅ Funcional | ### 2.3 Modelos de Estrategia | Modelo | Archivo | Propósito | Estado | |--------|---------|-----------|--------| | `AMDDetector` | `amd_detector.py` | Detecta fases AMD (reglas) | ✅ Funcional | | `AMDDetectorML` | `amd_detector_ml.py` | Clasificador XGBoost de fases | ✅ Funcional | | `SignalGenerator` | `signal_generator.py` | Genera señales de trading | ✅ Funcional | | `TPSLClassifier` | `tp_sl_classifier.py` | Clasifica TP/SL óptimos | ✅ Funcional | ### 2.4 Ensembles | Modelo | Archivo | Propósito | Estado | |--------|---------|-----------|--------| | `DualHorizonEnsemble` | `dual_horizon_ensemble.py` | Ensemble 5 años + 3 meses | ✅ Funcional | | `StrategyEnsemble` | `strategy_ensemble.py` | Combina múltiples estrategias | ⚠️ Parcial | --- ## 3. PROBLEMAS IDENTIFICADOS ### 3.1 CRÍTICO: Factores Hardcodeados **Ubicación**: `range_predictor_factor.py:598-601` ```python SYMBOLS = { 'XAUUSD': {'base': 2650.0, 'volatility': 0.0012, 'factor': 2.5}, 'EURUSD': {'base': 1.0420, 'volatility': 0.0004, 'factor': 0.0003}, } ``` **Impacto**: - Solo 2 activos soportados - Factores estáticos no se adaptan a cambios de mercado - No escalable a 100+ activos **Solución Propuesta**: - Usar `compute_factor_median_range()` de `volatility_attention.py` - Rolling median con window de 200 y shift(1) para evitar leakage - Factor automático por activo basado en ATR/mediana ### 3.2 ALTO: Sin Separación por Activo/Temporalidad **Estado Actual**: - Modelos mezclan datos de múltiples activos - No hay especialización por timeframe **Impacto**: - Diferentes activos tienen diferentes características - Estrategias no son universales - Ruido en las predicciones **Solución Propuesta**: ``` models/ ├── XAUUSD/ │ ├── 5m/ │ │ ├── range_predictor.joblib │ │ ├── movement_predictor.joblib │ │ └── attention_transformer.pt │ └── 15m/ │ ├── range_predictor.joblib │ └── ... ├── EURUSD/ │ └── ... └── BTCUSDT/ └── ... ``` ### 3.3 ALTO: Sistema de Atención No Integrado **Estado Actual**: - `volatility_attention.py` existe pero NO está integrado con todos los modelos - `DynamicFactorWeighter` existe pero es independiente - XGBoost no usa atención directamente **Impacto**: - Modelos dan igual peso a ruido y señales - No priorizan movimientos significativos **Solución Propuesta**: 1. Usar `weight_smooth()` para sample_weight en XGBoost 2. Integrar `VolatilityRangePredictor` (PyTorch) como modelo alternativo 3. Crear pipeline unificado de atención ### 3.4 MEDIO: No Hay Metamodelo **Estado Actual**: - Cada modelo predice independientemente - No hay síntesis de predicciones **Impacto**: - Decisiones basadas en modelo individual - No aprovecha diversidad de enfoques **Solución Propuesta**: - Metamodelo que combine: - RangePredictor - MovementMagnitudePredictor - AMDDetector - VolatilityAttention - Ponderación dinámica basada en performance reciente ### 3.5 MEDIO: Frontend Incompleto **Estado Actual**: - MLDashboard existe pero muestra solo señales básicas - No hay página de histórico - No hay visualización por modelo **Impacto**: - Difícil evaluar performance de modelos - No hay herramientas de análisis visual **Solución Propuesta**: 1. Página "ML Real-time" - Predicciones en vivo 2. Página "ML Historical" - Análisis de período pasado 3. API por modelo o unificada --- ## 4. ANÁLISIS DE SISTEMA DE ATENCIÓN ### 4.1 Implementación Actual **Archivo**: `volatility_attention.py` ```python # Factor dinámico (rolling median con shift para evitar leakage) f_t = rolling_median(High - Low, window=200).shift(1) # Multiplicador de movimiento m_t = (High_t - Low_t) / f_t # Peso con softplus (suave) w_t = log1p(exp(beta * (m - 1))) / beta # Interpretación: # m < 1 → w ≈ 0 (ruido, ignorar) # m = 1 → w ≈ 0 (movimiento típico) # m = 2 → w ≈ 1 (2x normal, atención) # m = 3 → w ≈ 2 (3x normal, alta atención) ``` ### 4.2 Propuesta de Mejora para Atención **Requisito del Usuario**: > "si la variación es de 10 el peso sería de 2 y si la variación es de 15 el peso sería de 3, pero si la variación es menor a 5 el peso sea casi nulo" **Ejemplo para XAUUSD** (factor base ≈ 5 USD): | Variación | Multiplicador | Peso | Interpretación | |-----------|---------------|------|----------------| | < 5 USD | m < 1 | ~0 | Ruido, ignorar | | 5 USD | m = 1 | ~0 | Normal | | 10 USD | m = 2 | ~1-2 | Buena señal | | 15 USD | m = 3 | ~2-3 | Excelente señal | **Código Actualizado**: ```python def compute_attention_weight(variation_usd: float, factor: float) -> float: """ Calcula peso de atención basado en variación y factor del activo. Args: variation_usd: Variación en USD (ej: 10.5) factor: Factor base del activo (ej: 5.0 para XAUUSD) Returns: Peso de atención (0-3) """ m = variation_usd / factor if m < 1.0: return 0.0 # Ruido # Softplus suave beta = 4.0 w = np.log1p(np.exp(beta * (m - 1))) / beta return min(w, 3.0) # Cap en 3 ``` ### 4.3 Cálculo Dinámico del Factor **En lugar de hardcodear**, usar ATR o mediana rolling: ```python class DynamicFactorCalculator: def __init__(self, window: int = 200): self.window = window self._factors = {} # Cache por símbolo def get_factor(self, df: pd.DataFrame, symbol: str) -> float: """Calcula factor dinámico basado en mediana de rangos""" range_col = df['high'] - df['low'] factor = range_col.rolling(self.window).median().iloc[-1] self._factors[symbol] = factor return factor def update_factor(self, symbol: str, new_range: float): """Actualización incremental del factor""" # Exponential moving average para adaptación alpha = 2 / (self.window + 1) self._factors[symbol] = alpha * new_range + (1 - alpha) * self._factors.get(symbol, new_range) ``` --- ## 5. ARQUITECTURA PROPUESTA ### 5.1 Estructura de Modelos por Activo/Temporalidad ``` ml-engine/ ├── models/ │ ├── base/ # Clases base │ │ ├── range_predictor.py │ │ ├── movement_predictor.py │ │ └── attention_model.py │ ├── trained/ # Modelos entrenados │ │ ├── XAUUSD/ │ │ │ ├── 5m/ │ │ │ │ ├── config.yaml │ │ │ │ ├── range_xgb.joblib │ │ │ │ ├── movement_xgb.joblib │ │ │ │ └── attention_transformer.pt │ │ │ └── 15m/ │ │ │ └── ... │ │ ├── EURUSD/ │ │ │ └── ... │ │ └── BTCUSDT/ │ │ └── ... │ └── metamodel/ # Metamodelo │ ├── ensemble.py │ └── weights.yaml ``` ### 5.2 Arquitectura del Metamodelo ``` ┌─────────────────────────────────────────────────────────────┐ │ METAMODELO │ ├─────────────────────────────────────────────────────────────┤ │ Inputs (por activo/timeframe): │ │ ├── RangePredictor.predict() → (pred_high, pred_low) │ │ ├── MovementPredictor.predict() → (high_usd, low_usd) │ │ ├── AMDDetector.detect() → phase │ │ └── AttentionModel.predict() → (high, low, attention) │ ├─────────────────────────────────────────────────────────────┤ │ Fusion Layer: │ │ ├── Weighted average basado en performance reciente │ │ ├── Confidence aggregation │ │ └── Conflict resolution │ ├─────────────────────────────────────────────────────────────┤ │ Output: │ │ ├── final_direction: LONG | SHORT | NEUTRAL │ │ ├── final_high_pred: float │ │ ├── final_low_pred: float │ │ ├── confidence: float (0-1) │ │ ├── suggested_tp: float │ │ ├── suggested_sl: float │ │ └── rr_ratio: float │ └─────────────────────────────────────────────────────────────┘ ``` ### 5.3 APIs Propuestas **Opción A: API Unificada** (Recomendada) ``` GET /api/ml/predictions/{symbol}?timeframe=15m POST /api/ml/predictions/batch Response: { "symbol": "XAUUSD", "timeframe": "15m", "timestamp": "2026-01-06T10:30:00Z", "models": { "range_predictor": { "pred_high": 2658.5, "pred_low": 2652.0, "confidence": 0.72 }, "movement_predictor": { "high_usd": 8.5, "low_usd": 3.0, "asymmetry": 2.83 }, "amd_detector": { "phase": "ACCUMULATION", "confidence": 0.68 }, "attention_model": { "pred_high": 2659.0, "pred_low": 2651.5, "attention_weight": 2.1 } }, "metamodel": { "direction": "LONG", "pred_high": 2658.7, "pred_low": 2651.8, "confidence": 0.75, "suggested_tp": 2658.7, "suggested_sl": 2651.8, "rr_ratio": 2.83 } } ``` ### 5.4 Frontend: 2 Páginas **Página 1: ML Real-time** (`/ml/realtime`) - Dashboard con cards por activo - Predicciones actualizadas cada 30 segundos - Indicadores visuales de dirección/confianza - Gráfico de velas con overlays de predicciones **Página 2: ML Historical** (`/ml/historical`) - Selector de rango de fechas - Tabla de predicciones pasadas - Métricas de acierto por modelo - Gráfico de equity curve (backtesting visual) - Sin refresh automático --- ## 6. MÉTRICAS OBJETIVO ### 6.1 Métricas de Predicción | Métrica | Objetivo | Actual* | Gap | |---------|----------|---------|-----| | Win Rate (movimientos fuertes) | ≥ 80% | ~55-65% | -15-25% | | R:R Ratio promedio | ≥ 2:1 | ~1.5:1 | -0.5 | | Profit Factor | ≥ 1.5 | ~1.2 | -0.3 | | Sharpe Ratio | ≥ 1.0 | ~0.7 | -0.3 | | Max Drawdown | ≤ 20% | ~25% | +5% | *Estimado basado en backtests previos ### 6.2 Criterios de Señal Válida ```python def is_valid_signal(prediction) -> bool: """ Criterios para considerar una señal válida: 1. Confidence ≥ 0.7 2. R:R ratio ≥ 2.0 3. Attention weight ≥ 1.5 (movimiento significativo) 4. AMD phase no es MANIPULATION """ return ( prediction.confidence >= 0.7 and prediction.rr_ratio >= 2.0 and prediction.attention_weight >= 1.5 and prediction.amd_phase != 'MANIPULATION' ) ``` --- ## 7. PLAN DE IMPLEMENTACIÓN - VUELTA 1 ### Fase 1.1: Refactorización de Factores (Prioridad ALTA) - [ ] Eliminar factores hardcodeados de `range_predictor_factor.py` - [ ] Integrar `DynamicFactorCalculator` en todos los modelos - [ ] Crear `config/symbols.yaml` con metadatos de activos - [ ] Tests de regresión ### Fase 1.2: Separación por Activo/Temporalidad - [ ] Crear estructura de directorios `trained/{symbol}/{timeframe}/` - [ ] Modificar `train()` para guardar modelos separados - [ ] Modificar `predict()` para cargar modelo correcto - [ ] Pipeline de reentrenamiento por activo ### Fase 1.3: Integración de Atención - [ ] Crear `AttentionWeightedModel` wrapper - [ ] Integrar `weight_smooth()` en sample_weight de XGBoost - [ ] Opción para usar `VolatilityRangePredictor` (PyTorch) - [ ] Benchmark comparativo ### Fase 1.4: Diseño de Metamodelo - [ ] Definir interfaz `BasePredictor` - [ ] Implementar `MetamodelEnsemble` - [ ] Sistema de ponderación adaptativa - [ ] Tests de integración ### Fase 1.5: APIs y Frontend - [ ] Endpoint `/api/ml/predictions/{symbol}` - [ ] Endpoint `/api/ml/models` - [ ] Página MLRealtime - [ ] Página MLHistorical --- ## 8. SIGUIENTE VUELTA ### Vuelta 2 - Objetivos: 1. Análisis profundo de hyperparámetros 2. Evaluación de arquitecturas (XGBoost vs GRU vs Transformer) 3. Definición de features óptimos por modelo 4. Backtesting extensivo ### Vuelta 3 - Objetivos: 1. Validación final de soluciones 2. Documentación técnica completa 3. Plan de deployment 4. Métricas de monitoreo --- ## 9. HALLAZGOS DE EXPLORACIÓN COMPLEMENTARIA ### 9.1 Estado del Backtesting **Scripts de Backtesting Identificados:** | Script | Ubicación | Propósito | |--------|-----------|-----------| | `run_range_backtest.py` | ml-engine/scripts/ | Backtesting con RangePredictorV2 | | `run_80wr_backtest.py` | ml-engine/scripts/ | Optimización 80% win rate | | `run_movement_backtest.py` | ml-engine/scripts/ | MovementMagnitudePredictor | | `llm_strategy_backtester.py` | ml-engine/scripts/ | Backtester con filtros direccionales | | `engine.py` | llm-agent/src/backtesting/ | Motor genérico de backtesting | **Resultados Clave:** | Backtest | Período | Retorno | Win Rate | Max DD | Trades | |----------|---------|---------|----------|--------|--------| | LLM Strategy Extended | Ene-Mar 2025 | **+5.85%** | 33.3% | 15.12% | 60 | | Range Backtest Scalping | Ene 2025 | +0.67% | **80%** | 8.61% | 100 | | LLM Strategy Optimizado | Ene 2025 | +1.18% | 44.4% | 10.1% | 19 | **Hallazgo Crítico**: 100% de trades ganadores fueron SHORT en XAUUSD 5m. Los filtros direccionales (RSI > 55, SAR bajista, CMF < 0) son efectivos. ### 9.2 APIs Existentes (Detalle) **Backend Express - `/api/v1/ml`** (14+ endpoints): - `GET /health` - Estado ML Engine - `GET /signals/:symbol` - Señal actual - `POST /signals/batch` - Múltiples símbolos - `GET /predictions/:symbol` - Predicción de precio - `GET /amd/:symbol` - Fase AMD - `POST /backtest` - Ejecutar backtest (requiere auth) - `GET/POST /models/*` - Gestión de modelos - `GET /overlays/:symbol` - Overlay completo para gráficos - `DELETE /overlays/cache/:symbol?` - Limpiar caché **ML Engine FastAPI - Puerto 8001** (15+ endpoints): - `POST /predict/range` - ΔHigh/ΔLow - `POST /predict/tpsl` - Probabilidad TP vs SL - `POST /generate/signal` - Señal completa - `GET /api/signals/active` - Señales activas batch - `POST /api/amd/{symbol}` - Fase AMD - `POST /api/ict/{symbol}` - Análisis ICT/SMC - `POST /api/ensemble/{symbol}` - Señal ensemble - `POST /api/backtest` - Backtest con métricas - `POST /api/train/full` - Entrenamiento - `WS /ws/signals` - WebSocket real-time ### 9.3 Frontend Existente (Detalle) **Páginas Implementadas:** | Página | Ruta | Estado | Descripción | |--------|------|--------|-------------| | MLDashboard | `/ml-dashboard` | ✅ Completo | Dashboard central ML con tabs | | Trading | `/trading` | ✅ Completo | Trading real-time con overlays ML | | BacktestingDashboard | `/backtesting` | ✅ Completo | Validación histórica | | PredictionsPage | `/admin/predictions` | ✅ Completo | Histórico predicciones | | MLModelsPage | `/admin/models` | ✅ Completo | Gestión de modelos | **Componentes ML Clave:** - `PredictionCard.tsx` - Card de señal con niveles TP/SL - `AMDPhaseIndicator.tsx` - Indicador de fase AMD - `ICTAnalysisCard.tsx` - Análisis Smart Money Concepts - `EnsembleSignalCard.tsx` - Señal combinada multi-modelo - `SignalsTimeline.tsx` - Histórico de señales - `CandlestickChartWithML.tsx` - Gráfico con overlays ML - `MLSignalsPanel.tsx` - Panel lateral de señales ### 9.4 Brechas Identificadas vs Requerimientos | Requerimiento | Estado Actual | Brecha | |---------------|---------------|--------| | Factores dinámicos ATR-based | `DynamicFactorWeighter` existe pero NO integrado | **ALTA** | | Separación por activo/timeframe | Modelos mezclan datos | **ALTA** | | Metamodelo | `StrategyEnsemble` parcial (pesos fijos) | **MEDIA** | | 80%+ accuracy | 33-44% win rate actual | **CRÍTICA** | | 2:1 o 3:1 R:R | ~1.2:1 promedio actual | **ALTA** | | 100+ activos | Solo 3-6 soportados | **ALTA** | | Página ML real-time | MLDashboard existe | ✅ OK | | Página ML histórico | BacktestingDashboard existe | ✅ OK | --- ## 10. CONCLUSIONES VUELTA 1 ### 10.1 Fortalezas Encontradas 1. **Infraestructura sólida**: APIs backend y ML Engine bien estructuradas 2. **Frontend completo**: Dashboard, Trading y Backtesting funcionales 3. **Modelos diversos**: 6+ modelos ML operativos 4. **Backtesting maduro**: Sistema completo con métricas detalladas 5. **Atención implementada**: `volatility_attention.py` listo para integrar ### 10.2 Debilidades Críticas 1. **Factores hardcodeados**: Bloquean escalabilidad 2. **Sin separación por activo**: Reduce precisión 3. **Win rate bajo**: 33-44% vs objetivo 80% 4. **R:R insuficiente**: 1.2:1 vs objetivo 2:1+ 5. **Atención no integrada**: Código existe pero no se usa ### 10.3 Recomendaciones para Vuelta 2 1. **Prioridad 1**: Integrar `DynamicFactorWeighter` en todos los modelos 2. **Prioridad 2**: Separar modelos por símbolo y timeframe 3. **Prioridad 3**: Optimizar filtros direccionales (SHORT bias en XAUUSD) 4. **Prioridad 4**: Ajustar umbrales de confianza (0.7+ solo señales válidas) 5. **Prioridad 5**: Implementar metamodelo con pesos adaptativos --- ## 11. ANEXOS ### A. Archivos Clave | Archivo | Ruta | Líneas | Descripción | |---------|------|--------|-------------| | volatility_attention.py | models/ | 722 | Sistema de atención | | range_predictor_factor.py | models/ | 709 | Predictor con factores | | enhanced_range_predictor.py | models/ | 711 | Predictor mejorado | | movement_magnitude_predictor.py | models/ | 966 | Predictor de magnitud | | dynamic_factor_weighting.py | training/ | 425 | Weighting dinámico | ### B. Configuración de Sesiones (Actual) ```python SessionWeightConfig = { 'overlap_weight': 2.0, # London/NY overlap (12-16 UTC) 'london_weight': 1.5, # London (8-16 UTC) 'ny_weight': 1.3, # New York (14-21 UTC) 'tokyo_weight': 0.7, # Tokyo session 'off_hours_weight': 0.3, # Fuera de horario 'use_atr_weighting': True, 'atr_high_weight_boost': 1.5, 'atr_low_weight_penalty': 0.3 } ``` ### C. XGBoost Config Actual ```python xgboost_config = { 'n_estimators': 300, 'max_depth': 6, 'learning_rate': 0.03, 'subsample': 0.8, 'colsample_bytree': 0.8, 'min_child_weight': 3, 'gamma': 0.1, 'reg_alpha': 0.1, 'reg_lambda': 1.0, 'tree_method': 'hist', 'device': 'cuda' # Si disponible } ``` --- *Documento generado: 2026-01-06* *Próxima revisión: Vuelta 2*