3 min read

Cómo construí un modelo para predecir la Liga MX (y qué tan bien lo hace)

Hay una pregunta que aparece en cada fin de semana futbolero: ¿ambos equipos anotan? Parece simple, pero detrás de un "sí" hay variables escondidas — el cansancio de la tercera jornada en una semana, el historial de goles en casa, la diferencia de nivel entre equipos. Construí un modelo para responderla con números, no con corazonadas.

Este post es la carta de presentación del proyecto: qué hace, con qué datos, y — lo más importante — qué tan bien lo hace, medido con la misma vara con la que se mide cualquier modelo serio: fuera de muestra, sobre partidos que nunca vio.

Los datos: 14 años de Liga MX

La base son 4,669 partidos de Liga MX entre enero de 2012 y mayo de 2026. Cada partido trae su marcador final y las cuotas de cierre del mercado de apuestas — el registro más honesto de la información pública disponible antes del silbatazo: resumen todo lo que el mercado sabía.

De ahí se derivan las variables que alimentan al modelo:

  • Rating Elo por equipo, actualizado partido a partido
  • Goles a favor y en contra (últimas 10 jornadas), separando localía
  • Puntos por partido en los últimos 10 encuentros
  • Días de descanso de cada equipo y congestión de calendario (partidos en 14 días)
  • Forma de anotar/encajar goles específica por localía
  • Posición y puntos por partido en la tabla del torneo en curso
  • Historial head-to-head entre los dos equipos (últimos 6 cruces)
  • Fuerza del calendario reciente (nivel promedio de los rivales enfrentados)
  • Probabilidades implícitas de las cuotas 1X2 de cierre — con cobertura del 100% de los partidos desde 2012

El modelo: XGBoost + Poisson, lo mejor de dos mundos

No me conformé con un solo enfoque. Comparé tres candidatos con validación walk-forward (el modelo solo ve el pasado, nunca el futuro): una línea base de frecuencia global, una regresión logística y XGBoost con las variables derivadas. XGBoost ganó en las tres métricas estándar de clasificación probabilística.

En paralelo, un modelo Poisson clásico estima los goles esperados (λ) de cada equipo y de ahí la probabilidad de BTTS. La combinación de ambos — un modelo de árboles entrenado sobre señales históricas y un modelo estadístico puro — es la que da la probabilidad final.

Resultados: los números, sin maquillaje

Sobre 676 partidos de prueba (julio 2024 a mayo 2026, que el modelo nunca vio durante el entrenamiento):

  • Brier score: 0.2431 (vs. 0.2458 de la línea base — el modelo supera al "adivinar la tendencia general")
  • AUC: 0.5672 — señal real por encima del azar (0.50), modesta pero honesta
  • La tasa base de BTTS en la muestra es 56.7%, muy estable a lo largo de los años

¿Es una señal débil? Sí, y lo digo sin rodeos. En mercados deportivos nadie tiene AUCs de 0.8; eso sería una señal de que algo está mal (o de que estás mirando el pasado con información del futuro). Una ventaja sostenida y fuera de muestra es exactamente lo que se ve en la literatura de pronóstico deportivo.

Calibración: cuando dice 60%, pasa ~60% de las veces

Aquí está la parte que más me enorgullece del trabajo. Un modelo bien calibrado es el único tipo de modelo en el que puedes confiar cuando te da una probabilidad. En bandas de probabilidad predicha, el modelo dice y la realidad contesta:

  • Predijo 46% de BTTS → ocurrió 50% de las veces
  • Predijo 56% (la banda donde viven la mayoría de los partidos) → ocurrió 57%
  • Predijo 64% → ocurrió 63%
  • Predijo 74% → ocurrió 67%

La dirección es correcta en todos los rangos y el error es de pocos puntos, con las bandas bien pobladas (148, 268 y 201 partidos en las centrales). Para decisiones de valor esperado — apostar solo cuando la probabilidad del modelo supera a la que implícitamente cobran las casas — la calibración vale más que la AUC.

Cómo se usa: buscar valor, no adivinar

El pipeline semanal publica las predicciones de cada jornada y las compara contra las cuotas reales del mercado. Si mi probabilidad implica una cuota justa de 1.80 y la casa paga 1.83, ahí hay valor: la apuesta se dimensiona con Kelly fraccional al 25% y tope del 5% del bankroll. Cada jornada el sistema publica qué partidos pasan el filtro de valor y cuáles no, con el registro completo abierto.

Un experimento, no una fuente de ingresos

No vendo picks, no hay picks "seguros" y este proyecto no es una máquina de dinero. Es un experimento transparente de modelado probabilístico sobre datos abiertos de Liga MX. Las herramientas están en un repositorio, los datos son de fuentes públicas, y el registro completo de las predicciones — aciertos y errores — se publica tal cual en el sitio de transparencia del proyecto.

El objetivo de esta serie es compartir el método: cómo se construye una señal estadística en un mercado eficiente, cómo se valida honestamente (walk-forward, fuera de muestra, con calibración), y qué tan lejos puede llegar. Los números de este post son los reales del modelo, sin redondeos favorables.


Las predicciones de la próxima jornada y el registro histórico completo están disponibles en el sitio de transparencia del proyecto. Los siguientes posts de la serie cubrirán la construcción del dataset, la selección de variables y el sistema de paper trading con el que se mide todo.

¿Primera vez con palabras como BTTS, cuotas o walk-forward? Preparé un diccionario de apuestas y datos con todo el vocabulario de esta serie, explicado en lenguaje normal.