Metodología
Cómo funciona el simulador, sin secretos. Mismo enfoque que el video original (ELO + Poisson + Monte Carlo), implementado desde cero en TypeScript puro.
Ratings ELO
Usamos los ratings de eloratings.net, NO el FIFA ranking. Son dos sistemas distintos: el ELO es un sistema recursivo (igual al de ajedrez) que se actualiza después de cada partido internacional desde 1872, y refleja la forma reciente de forma mucho más fiel. Bélgica fue #1 del FIFA años sin grandes títulos; el ELO nunca la puso ahí.
Probabilidad de victoria (modelo logístico ELO):
We = 1 / (10^(-dr / 400) + 1)
dr = diferencia de ELO + 100 si juega de local (USA, México, Canadá en fase de grupos).
Modelo de goles
Para cada partido, los goles de cada equipo se sortean de una distribución de Poisson independiente. El parámetro λ (esperanza de goles) depende del gap de ELO:
λ_team = clamp(1.30 + 0.18 × (ELO_team − ELO_opp + home_bonus) / 100, 0.15, 6.0) goals ~ Poisson(λ_team)
BASE = 1.30 (goles promedio por equipo en Mundiales recientes). ALPHA = 0.18 (sensibilidad al gap ELO, calibrada contra históricos). Si tu equipo tiene 200 puntos más de ELO que el rival, esperas ~0.36 goles más que él. λ se limita a [0.15, 6.0] para no romper la distribución.
Forma reciente
El ELO base se actualiza lento (K=20). Para captar saltos de nivel del último año (ej: Argentina +107 ELO entre 2021 y 2022 por Copa América + invicto) sumamos un ajuste extra proporcional al delta de 12 meses, limitado a ±150. Calibramos α y la ventana con un sweep sobre los Mundiales 2014/18/22 (n=192 partidos): el óptimo fue α=0.20 con lookback de 1 año (+1.6pp accuracy, Brier sin cambio).
ELO_efectivo = ELO + clamp(0.20 × (ELO − ELO_de_hace_1_año), ±150)
Bono local
USA, México y Canadá juegan en casa durante la fase de grupos. Les sumamos +100 ELO en esos partidos (orden de magnitud documentado en la literatura). Probamos un sweep sobre 28 partidos de host en los Mundiales 2014/18/22 - no encontramos evidencia clara de que +100 mejore o empeore las predicciones (Qatar y Rusia fueron hosts débiles; sus resultados sub-performaron lo que la ventaja de local predeciría). Lo mantenemos por respeto a la literatura hasta tener más datos.
Ausencias (lesiones / suspensiones)
Cada jugador ausente penaliza el ELO efectivo del equipo, en proporción a su 'criticidad'. La fórmula combina valor de mercado (transfermarkt) y un multiplicador posicional. La calibración sobre Mundiales 2014/18/22 mostró que los minutos en clasificatorias NO aportan señal limpia (FRA 2022 llegó a la final sin Benzema/Pogba/Kanté), así que su peso es 0.
criticidad = 0.8 × (valor_M€ / 150) + 0.2 × (mult_posición − 1) / 0.5 penalty_jugador = −5 − 75 × criticidad penalty_equipo = Σ jugadores ausentes, tope −150 ELO
Multiplicadores posicionales: arquero 1.5, central 1.3, lateral/mediocampo defensivo/mediocampo 1.1, ofensivos 1.0. Los datos se actualizan desde transfermarkt (flag de lesión). Pre-mundial 2026: 39/48 selecciones afectadas. Top hits: Uruguay −103 ELO, España −90, Ecuador −81 (Pacho fuera), Argentina −75 (Romero + Nico Paz).
Fatiga post-prórroga
En eliminatoria, un equipo que gana en tiempo extra o por penales juega ~30 min más que el rival que descansó. Aplicamos una penalización pequeña al λ del equipo fatigado en su siguiente partido - efecto medible sobre todo entre cuartos y semis cuando los plazos son cortos.
Fase de grupos
12 grupos × 6 partidos × 4 equipos = 72 partidos. Puntos: 3/1/0. Desempates en este orden: puntos → diferencia de gol → goles a favor → desempate aleatorio. Avanzan los 2 primeros + los 8 mejores 3ros (ordenados por los mismos criterios entre grupos).
Eliminatoria
R32 → R16 → QF → SF → 3er lugar + Final. Si terminan 90' empatados se decide por penales: en lugar de un coin-flip usamos un modelo Bayesiano con shrinkage sobre 103 shoot-outs históricos (Mundiales, Eurocopa, Copa América, Asian Cup, AFCON desde 1972). Los goles de los penales no suman a las estadísticas.
rate(team) = (victorias_PK + 10 × 0.5) / (n_PK + 10) P(A gana PK) = rate(A) / (rate(A) + rate(B))
El prior es 50% (k=10), gana fuerza con cada shoot-out registrado. Tasas actuales: Argentina 59%, Alemania 65%, Brasil 52%, Países Bajos 39%, Inglaterra 40%. Validado en 13 shoot-outs de los Mundiales 2014/18/22 (53.8% accuracy vs 50% baseline - no significativo a n=13 pero sin regresión).
Asignación de 3ros: las 495 combinaciones del Anexo C de FIFA están aproximadas - ordenamos los 12 terceros, tomamos los 8 mejores, y los asignamos a las 8 ranuras del bracket respetando las restricciones de grupo definidas por FIFA.
Monte Carlo
Corremos N torneos completos (1k / 10k / 50k / 100k a elección). Cada torneo es independiente. Las estadísticas finales son frecuencias relativas: 'Argentina ganó 14.900 de 100.000 torneos → 14.90% de probabilidad'.
Intervalos de confianza
Cada probabilidad es un estimador de una variable Bernoulli sobre N trials. El intervalo 95% se calcula con el score de Wilson (preferido sobre Wald porque no colapsa en p=0 ni p=1). Con 100k simulaciones, una proba del 15% tiene IC 95% de ±0.22pp; con 10k sims es ±0.70pp. Si dos equipos están dentro del IC del otro, la diferencia no es estadísticamente distinguible - corre más simulaciones o acepta el empate.
center = (p + z²/2N) / (1 + z²/N) half = z · √( p(1-p)/N + z²/4N² ) / (1 + z²/N) lo, hi = center ∓ half z = 1.96 para 95%
Performance
Motor en TypeScript puro con PRNG xoshiro128** (más rápido y mejor distribuido que Math.random) y sampler Poisson de Knuth. 100k simulaciones tardan ~3 segundos en Node y ~5-8 segundos en navegador vía Web Worker.
Sanity checks
- Suma de probabilidades de campeón = 100.000% (exacto)
- Promedio de goles por partido = 2.6 (consistente con históricos de Mundial: 2.5-2.7)
- Top-5 candidatos coinciden con consensus de bookmakers (España, Argentina, Francia, Brasil, Portugal)
Lo que NO modela
Cambios de DT. Forma del día. Tarjetas amarillas/rojas dentro del torneo (las acumulamos en una rama de Monte Carlo pero no las simulamos aún - Tier 1 #4b). Sorteo aleatorio (lo tomamos como dado). Y, deliberadamente: NO ajustamos el modelo para 'arreglar' resultados raros - si el modelo dice algo absurdo es información, no un bug.
Fuentes
Código
Todo el código del simulador es open-source.
kmanus88/worldcup2026