AdminLTE Preloader Image
Documentación de modelos

Ficha de modelos predictivos

Qué hace cada modelo, qué datos usa y cómo interpretar sus métricas.

Modelos registrados
9
9 con datos en la tabla
Predicciones evaluables
107.017
115.784 registros historicos · 15.976 partidos base
Mejor acierto
Ensemble selectivo
76,77%
Última predicción
24/08/2026 08:51
Según `porcentajes_victoria.calculado_en`

Tabla general

9 modelos registrados. Pulsa un modelo para abrir su ficha técnica y sus datos actuales.

Ensemble selectivo

07_ensemble_selectivo

Ensemble selectivo
Qué hace

Modelo selectivo: no intenta pronosticar todos los partidos como apuesta fuerte. Parte del 05, añade mercado cuando hay cuotas y aprende un umbral de confianza; si no lo supera escribe 50/50.

Resumen de datos que usa
  • Features completas del 05
  • Cuotas moneyline, spread y total si existen
  • Probabilidad implícita del mercado
  • Diferencia mercado vs Elo
  • Umbral mínimo de confianza
Idea central
  • Nace para mejorar el porcentaje de acierto sin obligarse a apostar todos los partidos.
  • Calcula una probabilidad cruda y mide la confianza del ganador como max(prob_local, prob_visitante).
  • Si la confianza no alcanza el umbral aprendido, reemplaza la predicción por 50/50.
  • Los 50/50 quedan fuera del ranking de acierto evaluable porque no hay favorito claro.
Features heredadas del 05
  • Elo previo local/visitante y diferenciales.
  • Descanso, back-to-back y contexto de calendario.
  • Forma rolling de equipo a 10 partidos.
  • Perfiles rolling de jugadores, top 8 y profundidad.
  • Plantillas actuales y exclusión de lesionados para futuros.
Features de cuotas
  • odds_available: indica si el partido tiene cuota válida.
  • moneyline_local y moneyline_visitante.
  • market_prob_local y market_prob_visitante, normalizadas quitando overround.
  • market_prob_diff, market_favorite_local, market_confidence y market_overround.
  • spread_local, spread_visitante y total_puntos cuando existen.
  • elo_prob_local_proxy, diff_market_elo_prob y abs_diff_market_elo_prob para comparar mercado contra Elo.
Selección de umbral
  • Prueba umbrales de confianza de 0.50 a 0.90.
  • Exige cobertura mínima configurable, actualmente 25%.
  • Optimiza acierto seleccionado con una pequeña prima por cobertura para no quedarse con muy pocos partidos.
  • En producción guarda el umbral dentro del bundle ensemble_selectivo.pkl.
Candidatos entrenados
  • Regresión logística selectiva.
  • HistGradientBoosting selectivo.
  • ExtraTrees selectivo.
  • RandomForest selectivo.
  • Selecciona por rendimiento en calibración de predicciones seleccionadas.
Cómo leer sus números
  • Acierto global al 0.5 mide el modelo crudo en todos los partidos.
  • Acierto seleccionado mide solo los partidos que superan el umbral.
  • Cobertura seleccionada indica qué porcentaje de partidos se atreve a pronosticar.
  • No es justo compararlo con el 05 solo por acierto si no se mira también cobertura.
Riesgos de contaminación
  • Las cuotas históricas solo son válidas si representan una cuota conocida antes del partido.
  • Si se cargan cuotas posteriores o cierre de mercado sin timestamp prepartido, el modelo puede estar viendo información futura.
  • La feature odds_available ayuda a no eliminar partidos sin cuota, pero no arregla una cuota contaminada.
  • El backtest walk-forward reduce contaminación de entrenamiento, pero depende de que los datos fuente estén fechados correctamente.
Validación resumida

Backtest walk-forward: entrena, calibra el umbral y prueba por ventanas temporales.

Salida resumida

Menos predicciones, pero con mayor acierto en las seleccionadas.

Riesgo o lectura resumida

No debe compararse por cobertura con modelos que predicen todo. Las cuotas historicas solo son limpias si proceden de snapshots prepartido.

Tablas implicadas
  • Todas las del 05
  • cuota_partidos
  • porcentajes_victoria
Ficheros y responsabilidad
  • 01_python/03_modelos/07_ensemble_selectivo/modeling.py
    Features de cuotas, candidatos y lógica selectiva.
  • 01_python/03_modelos/07_ensemble_selectivo/01_train.py
    Entrena el 07 y selecciona umbral de confianza.
  • 01_python/03_modelos/07_ensemble_selectivo/03_backtest.py
    Backtest walk-forward OOF y escritura de predicciones 50/50 cuando no selecciona.
  • 01_python/03_modelos/07_ensemble_selectivo/02_apply_future.py
    Aplica el 07 a futuros con cuotas y lesiones.
Features técnicas del JSON de entrenamiento
Numéricas (121)
  • diff_elo
  • abs_diff_elo
  • rest_local
  • rest_visitante
  • diff_rest
  • b2b_local
  • b2b_visitante
  • players_player_known_count_local
  • players_player_known_count_visitante
  • diff_players_player_known_count
  • players_player_roster_count_local
  • players_player_roster_count_visitante
  • diff_players_player_roster_count
  • players_player_top8_minutes_local
  • players_player_top8_minutes_visitante
  • diff_players_player_top8_minutes
  • players_player_top8_value_local
  • players_player_top8_value_visitante
  • diff_players_player_top8_value
  • players_player_top8_points_local
  • players_player_top8_points_visitante
  • diff_players_player_top8_points
  • players_player_top8_reb_local
  • players_player_top8_reb_visitante
  • diff_players_player_top8_reb
  • players_player_top8_ast_local
  • players_player_top8_ast_visitante
  • diff_players_player_top8_ast
  • players_player_top8_stocks_local
  • players_player_top8_stocks_visitante
  • diff_players_player_top8_stocks
  • players_player_top8_tov_local
  • players_player_top8_tov_visitante
  • diff_players_player_top8_tov
  • players_player_top8_ts_local
  • players_player_top8_ts_visitante
  • diff_players_player_top8_ts
  • players_player_top8_efg_local
  • players_player_top8_efg_visitante
  • diff_players_player_top8_efg
  • players_player_top8_usage_local
  • players_player_top8_usage_visitante
  • diff_players_player_top8_usage
  • players_player_top8_net_local
  • players_player_top8_net_visitante
  • diff_players_player_top8_net
  • players_player_top8_pm_local
  • players_player_top8_pm_visitante
  • diff_players_player_top8_pm
  • players_player_top8_pie_local
  • players_player_top8_pie_visitante
  • diff_players_player_top8_pie
  • players_player_depth_value_local
  • players_player_depth_value_visitante
  • diff_players_player_depth_value
  • players_player_depth_minutes_local
  • players_player_depth_minutes_visitante
  • diff_players_player_depth_minutes
  • team_win_rate_10_local
  • team_win_rate_10_visitante
  • diff_team_win_rate_10
  • team_margin_10_local
  • team_margin_10_visitante
  • diff_team_margin_10
  • team_points_for_10_local
  • team_points_for_10_visitante
  • diff_team_points_for_10
  • team_points_against_10_local
  • team_points_against_10_visitante
  • diff_team_points_against_10
  • team_team_fg_pct_10_local
  • team_team_fg_pct_10_visitante
  • diff_team_team_fg_pct_10
  • team_team_tp_pct_10_local
  • team_team_tp_pct_10_visitante
  • diff_team_team_tp_pct_10
  • team_team_ft_pct_10_local
  • team_team_ft_pct_10_visitante
  • diff_team_team_ft_pct_10
  • team_team_reb_10_local
  • team_team_reb_10_visitante
  • diff_team_team_reb_10
  • team_team_ast_10_local
  • team_team_ast_10_visitante
  • diff_team_team_ast_10
  • team_team_tov_10_local
  • team_team_tov_10_visitante
  • diff_team_team_tov_10
  • team_team_net_rating_10_local
  • team_team_net_rating_10_visitante
  • diff_team_team_net_rating_10
  • team_team_efg_10_local
  • team_team_efg_10_visitante
  • diff_team_team_efg_10
  • team_team_ts_10_local
  • team_team_ts_10_visitante
  • diff_team_team_ts_10
  • team_team_pace_10_local
  • team_team_pace_10_visitante
  • diff_team_team_pace_10
  • team_team_possessions_10_local
  • team_team_possessions_10_visitante
  • diff_team_team_possessions_10
  • team_team_pie_10_local
  • team_team_pie_10_visitante
  • diff_team_team_pie_10
  • odds_available
  • moneyline_local
  • moneyline_visitante
  • market_prob_local
  • market_prob_visitante
  • market_prob_diff
  • market_favorite_local
  • market_confidence
  • market_overround
  • spread_local
  • spread_visitante
  • total_puntos
  • elo_prob_local_proxy
  • diff_market_elo_prob
  • abs_diff_market_elo_prob
Categóricas (4)
  • tipo_partido
  • liga_id
  • equipo_local_id
  • equipo_visitante_id
Acierto
76,77%
Evaluables
3.259
Aciertos
2.502
Fallos
757
Cobertura histórica
74,96%
Cobertura útil
27,21%
Neutras 50/50
8.717
Sin pred. histórica
4.000
Omitidos OOF
4.000
Temporadas
21
Ligas
3
Periodo
03/12/2019 01:00
22/05/2026 15:00
Última predicción
24/08/2026 08:39
Métricas de entrenamiento
Modelo JSON
07_ensemble_selectivo
Candidato seleccionado
logistic_selectiva
Total dataset
15.976
Train
10.864
Calibración
1.917
Test
3.195
Nombre candidato
logistic_selectiva
Accuracy calibración @0.5
66,04%
Umbral confianza calibración
0.76
Seleccionadas calibración
499
Cobertura calibración
26,03%
Acierto seleccionado calibración
82,77%
Accuracy test global @0.5
66,79%
Umbral confianza test
0.76
Seleccionadas test
846
Cobertura test
26,48%
Acierto seleccionado test
81,21%
Brier test
0,2112
LogLoss test
0,6098
ROC AUC test
0,7125
Train producción
14.059
Calibración producción
1.917
Umbral producción
0.76
Calibración desde
2025-06-11 04:00:00
Calibración hasta
2026-06-14 00:30:00
Partidos con cuotas
5.500
Cobertura cuotas
34,43%
Cuotas en test
2.278
01_python/03_modelos/07_ensemble_selectivo/metrics/ensemble_selectivo_metrics.json
Walk-forward / OOF
Modelo OOF
07_ensemble_selectivo
Candidato OOF
logistic_selectiva
Dataset total
15.976
Partidos backtest
11.976
Sin predicción OOF
4.000
Folds
10
Min train
3.000
Tamaño calibración
1.000
Tamaño fold
1.200
OOF accuracy global @0.5
63,66%
OOF Brier global
0,2230
OOF LogLoss global
0,6369
OOF ROC AUC global
0,6770
OOF seleccionadas
3.259
OOF cobertura seleccionada
27,21%
OOF acierto seleccionado
76,77%
OOF Brier seleccionadas
0,1775
01_python/03_modelos/07_ensemble_selectivo/metrics/ensemble_selectivo_oof_metrics.json