ML Engine Updates: - Updated BTCUSD with Polygon API data (2024-2025): 215,699 new records - Re-trained all ML models: Attention (R²: 0.223), Base, Metamodel (87.3% confidence) - Backtest results: +176.71R profit with aggressive_filter strategy Documentation Consolidation: - Created docs/99-analisis/_MAP.md index with 13 new analysis documents - Consolidated inventories: removed duplicates from orchestration/inventarios/ - Updated ML_INVENTORY.yml with BTCUSD metrics and training results - Added execution reports: FASE11-BTCUSD, correction issues, alignment validation Architecture & Integration: - Updated all module documentation with NEXUS v3.4 frontmatter - Fixed _MAP.md indexes across all folders - Updated orchestration plans and traces Files: 229 changed, 5064 insertions(+), 1872 deletions(-) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
21 KiB
| title | version | date | status | author | epic | tags | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Análisis de Modelos ML - Vuelta 1 | 1.1.0 | 2026-01-06 | Completed | ML-Specialist + Orquestador | OQI-006 |
|
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
- Redefinir documentación y alcances de cada modelo
- Implementar sistema de atención con factores dinámicos (ATR-based)
- Separar modelos por activo y temporalidad (5m, 15m)
- Diseñar arquitectura de metamodelo
- 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
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()devolatility_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.pyexiste pero NO está integrado con todos los modelosDynamicFactorWeighterexiste 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:
- Usar
weight_smooth()para sample_weight en XGBoost - Integrar
VolatilityRangePredictor(PyTorch) como modelo alternativo - 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:
- Página "ML Real-time" - Predicciones en vivo
- Página "ML Historical" - Análisis de período pasado
- API por modelo o unificada
4. ANÁLISIS DE SISTEMA DE ATENCIÓN
4.1 Implementación Actual
Archivo: volatility_attention.py
# 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:
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:
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
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
DynamicFactorCalculatoren todos los modelos - Crear
config/symbols.yamlcon 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
AttentionWeightedModelwrapper - 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:
- Análisis profundo de hyperparámetros
- Evaluación de arquitecturas (XGBoost vs GRU vs Transformer)
- Definición de features óptimos por modelo
- Backtesting extensivo
Vuelta 3 - Objetivos:
- Validación final de soluciones
- Documentación técnica completa
- Plan de deployment
- 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 EngineGET /signals/:symbol- Señal actualPOST /signals/batch- Múltiples símbolosGET /predictions/:symbol- Predicción de precioGET /amd/:symbol- Fase AMDPOST /backtest- Ejecutar backtest (requiere auth)GET/POST /models/*- Gestión de modelosGET /overlays/:symbol- Overlay completo para gráficosDELETE /overlays/cache/:symbol?- Limpiar caché
ML Engine FastAPI - Puerto 8001 (15+ endpoints):
POST /predict/range- ΔHigh/ΔLowPOST /predict/tpsl- Probabilidad TP vs SLPOST /generate/signal- Señal completaGET /api/signals/active- Señales activas batchPOST /api/amd/{symbol}- Fase AMDPOST /api/ict/{symbol}- Análisis ICT/SMCPOST /api/ensemble/{symbol}- Señal ensemblePOST /api/backtest- Backtest con métricasPOST /api/train/full- EntrenamientoWS /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/SLAMDPhaseIndicator.tsx- Indicador de fase AMDICTAnalysisCard.tsx- Análisis Smart Money ConceptsEnsembleSignalCard.tsx- Señal combinada multi-modeloSignalsTimeline.tsx- Histórico de señalesCandlestickChartWithML.tsx- Gráfico con overlays MLMLSignalsPanel.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
- Infraestructura sólida: APIs backend y ML Engine bien estructuradas
- Frontend completo: Dashboard, Trading y Backtesting funcionales
- Modelos diversos: 6+ modelos ML operativos
- Backtesting maduro: Sistema completo con métricas detalladas
- Atención implementada:
volatility_attention.pylisto para integrar
10.2 Debilidades Críticas
- Factores hardcodeados: Bloquean escalabilidad
- Sin separación por activo: Reduce precisión
- Win rate bajo: 33-44% vs objetivo 80%
- R:R insuficiente: 1.2:1 vs objetivo 2:1+
- Atención no integrada: Código existe pero no se usa
10.3 Recomendaciones para Vuelta 2
- Prioridad 1: Integrar
DynamicFactorWeighteren todos los modelos - Prioridad 2: Separar modelos por símbolo y timeframe
- Prioridad 3: Optimizar filtros direccionales (SHORT bias en XAUUSD)
- Prioridad 4: Ajustar umbrales de confianza (0.7+ solo señales válidas)
- 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)
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
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