Proyecto de Machine Learning aplicado a mercados . Muestra un pipeline completo para: (1) estimar probabilidades de que el take‑profit se alcance antes que el stop‑loss en un horizonte de 3 velas, (2) calibrar esas probabilidades para que reflejen frecuencia observada y (3) decidir con un umbral basado en valor esperado (EV), ilustrando su comportamiento mediante Walk‑Forward Analysis (WFA).
Uso principal: demostración educativa y de portafolio sobre buenas prácticas de ML en finanzas. No es asesoría financiera.
- Tarea: clasificación binaria «TP antes que SL» en 3 velas (BTC/USDT, 15m).
- Modelo:
XGBoostClassifiercon tuning (Optuna). La métrica objetivo de búsqueda es PR‑AUC, adecuada para clases desbalanceadas. - Calibración: Isotonic Regression en hold‑out para que
p̂sea interpretable (probabilidades confiables). - Decisión: se escanean umbrales y se elige aquel cuyo EV neto de costos es positivo bajo una frecuencia mínima razonable.
- Evaluación temporal: WFA por ventanas deslizantes para observar estabilidad del criterio de decisión a lo largo del tiempo.
Razonamiento del diseño:
- PR‑AUC prioriza aciertos en la fracción minoritaria de eventos útiles para operar.
- La calibración hace que probabilidades y frecuencias observadas coincidan, requisito para convertir
p̂en tamaños/umbrales. - El EV integra comisiones, spread y slippage, alineando la decisión con el costo real de transacción.
- WFA evita conclusiones a partir de un único split y muestra sensibilidad de reglas a cambios de régimen.
-
Procesamiento & feature engineering (
ML/data_processing.py)- Qué: OHLCV de BTC/USDT (15m) + indicadores técnicos (SMA/EMA, RSI, MACD, ATR, Bandas de Bollinger, ADX, OBV, etc.).
- Por qué: mejorar señal‑ruido y capturar tendencia, momentum y volatilidad; el modelo aprende patrones que por sí solos no están en el precio bruto.
- Etiquetado dinámico (ATR, 3 velas): TP/SL se escalan con volatilidad. Por qué: evita metas fijas desalineadas con el régimen de mercado.
-
Entrenamiento & tuning (
ML/model_training.py)- Qué: búsqueda con Optuna + validación temporal con purge/embargo.
- Por qué: evitar leakage por dependencia temporal y converger hacia hiperparámetros estables que maximizan PR‑AUC.
-
Calibración (isotónica, hold‑out)
- Qué: ajustar scores a probabilidades fieles.
- Por qué: si la probabilidad “70%” no corresponde a 70% observado, el control de riesgo y el EV se distorsionan.
-
Selección de umbral por EV
- Qué: elegir
thrque maximiza valor esperado bajo costos y R:R. - Por qué: pasar de clasificación a decisión económica; umbrales con alta precision pero cobertura nula no sirven para operar.
- Qué: elegir
-
Walk‑Forward Backtest (
ML/backtest_improved.py)- Qué: ventanas train→test deslizantes con comisiones, slippage, límite de operaciones y stop global.
- Por qué: realismo y robustez; medir desempeño fuera de muestra y bajo fricción.
Tuning (Optuna)
- Mejor PR‑AUC:
0.6445. - Hiperparámetros destacados (ejemplo):
max_depth=5, learning_rate≈0.0056, n_estimators≈418, subsample≈0.747, colsample_bytree≈0.900, regularizaciones ymin_child_weight=6. (Ver artefactos enML/results/.)
Evaluación en test con probabilidades calibradas
- AUC:
0.6349 - PR‑AUC:
0.6070 - Brier score:
0.2369
Interpretación: el modelo aprende patrones útiles (por encima del azar) y sus probabilidades están bien alineadas con la frecuencia observada. En los deciles superiores de p̂ aumentan tanto la tasa de aciertos como un proxy de EV, lo que respalda su uso para priorizar contextos con mejor expectativa.
Regla de decisión ilustrativa
- Umbral empleado a modo de ejemplo:
thr = 0.780. - Efecto: reduce la cobertura (menos señales) y conserva alta precisión en los casos que sí selecciona. Esto se utiliza para mostrar cómo cambia el equilibrio cobertura/precisión cuando el criterio exige mayor evidencia.
Las figuras y animaciones provienen de la ejecución del proyecto y están en ML/assets/ (sin LFS):
-
Curva de equity (WFA) →
ML/assets/equity_curve.pngMuestra la evolución del capital por ventanas. En el periodo ilustrado, la curva es sensible a costos y al pacing (frecuencia efectiva de operaciones), con drawdowns cercanos a 50%. -
Curva ROC (test) →
ML/assets/roc_curve_binary_test.pngIndica la capacidad discriminativa global del clasificador; complementa PR‑AUC cuando las clases están desbalanceadas. -
Precisión/Recall vs Umbral (test) →
ML/assets/threshold_precision_recall_test.pngVisualiza el intercambio cobertura/precisión al mover el umbral. Explica por qué umbrales altos concentran operaciones en contextos con mayor probabilidad estimada. -
Demos en GIF/MP4
-
Entrenamiento *
-
Backtestign*
-
El backtest se usa como instrumento de inspección: permite ver cómo la regla se comporta bajo distintas ventanas, costos y densidad de señales. En la muestra mostrada, la combinación de umbral exigente, filtros y costos reduce la frecuencia y hace exigente sostener el rendimiento agregado.
Aun con esa cautela, el aprendizaje central es sólido: el modelo clasifica por encima del azar, sus probabilidades están calibradas, y los gráficos por bandas de p̂ muestran una relación coherente entre probabilidad y aciertos. Este es el tipo de evidencia que sí traslada valor a una estrategia operativa una vez que se fijan costos, risk‑reward y ritmo de operación con parámetros consistentes.
La pregunta a la decisión operable
La meta inicial fue sencilla: convertir probabilidades en decisiones que valgan la pena en el marco de 15m. Tras construir features y fijar PR‑AUC como métrica, ejecuté Optuna. La búsqueda no fue lineal: trials 40–41 se movieron en 0.642–0.644, el 42 fue pruned y el trial 12 fijó el tope con 0.64437. Esa región de hiperparámetros (profundidad 6, min_child_weight≈10, colsample_bytree≈0.94, gamma≈1.7) mostró estabilidad.
# Entorno (Python 3.10+)
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Variables (costos, ritmo objetivo, etc.)
cp .env.example .env
# Entrenar + calibrar + exportar artefactos
python ML/model_training.py
# Simulación WFA (ilustrativa)
python ML/backtest_improved.py --out results_wfaArtefactos principales en ML/results/:
btc15m_xgb_calibrated_trained_pipeline.joblib(pipeline)iso_cal.joblib(calibrador)metrics_test.json,training_report.md, CSVs de fiabilidad/umbral- Figuras en
ML/assets/y resultados por ventanas enresults_wfa/.
/ModelMLTrading
├── ML/
│ ├── data/
│ ├── logs/
│ ├── results/ # artefactos: *.joblib, métricas, CSV
│ ├── assets/ # GIFs y figuras del README (sin LFS)
│ ├── data_processing.py
│ ├── model_training.py
│ └── backtest_improved.py
├── results_wfa/
├── scripts/
│ └── run_pipeline.sh
├── requirements.txt
└── README.md
Proyecto educativo y de portafolio. No constituye asesoramiento financiero ni recomendación de inversión. Las simulaciones son ilustrativas y están sujetas a supuestos de datos, costos y ejecución.

