Tournament outlook
/ 100,000 simulationsTitle probabilities from simulating the whole tournament 100,000 times, each run perturbed by a random per-team form shock so a single model never hardens tiny edges into false certainty.
The race for the trophy
Projected final: 🇪🇸 Spain vs 🇦🇷 Argentina.
How far each side runs
| Team | Grp | R32 | QF | SF | Fin | Win |
|---|---|---|---|---|---|---|
| 🇦🇷 Argentina | 74% | 98% | 52% | 36% | 24% | 15.1% |
| 🇪🇸 Spain | 68% | 98% | 46% | 32% | 21% | 12.4% |
| 🏴 England | 63% | 97% | 46% | 28% | 16% | 8.9% |
| 🇧🇷 Brazil | 61% | 97% | 47% | 29% | 16% | 8.8% |
| 🇫🇷 France | 62% | 95% | 46% | 30% | 16% | 8.8% |
| 🇵🇹 Portugal | 50% | 94% | 43% | 24% | 14% | 7.4% |
| 🇨🇴 Colombia | 42% | 92% | 37% | 20% | 11% | 5.6% |
| 🇧🇪 Belgium | 63% | 95% | 42% | 20% | 11% | 5.2% |
| 🇩🇪 Germany | 71% | 100% | 33% | 19% | 9% | 3.8% |
| 🇺🇾 Uruguay | 28% | 91% | 25% | 13% | 7% | 3.0% |
| 🇳🇱 Netherlands | 37% | 87% | 27% | 14% | 6% | 2.9% |
| 🇲🇦 Morocco | 23% | 91% | 28% | 13% | 6% | 2.3% |
| 🇭🇷 Croatia | 31% | 90% | 24% | 12% | 5% | 2.2% |
| 🇨🇭 Switzerland | 47% | 85% | 23% | 9% | 4% | 1.6% |
| 🇪🇨 Ecuador | 4% | 81% | 20% | 9% | 4% | 1.5% |
| 🇳🇴 Norway | 21% | 76% | 18% | 8% | 3% | 1.2% |
Group stage
/ 12 groupsProjected final tables (expected points and goal difference, with real points where matches have already been played) and the predicted result of every fixture. The coloured bar marks the two automatic qualifiers and the third-place line that chases one of the eight best-third spots.
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇲🇽 Mexico | 6.4 | +2.9 | 98% |
| 2 | 🇰🇷 South Korea | 5.8 | +1.1 | 93% |
| 3 | 🇨🇿 Czech Republic | 3.0 | -0.6 | 60% |
| 4 | 🇿🇦 South Africa | 1.6 | -3.4 | 23% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇨🇭 Switzerland | 4.9 | +1.7 | 85% |
| 2 | 🇨🇦 Canada | 4.2 | +0.8 | 78% |
| 3 | 🇧🇦 Bosnia and Herzegovina | 3.2 | -0.8 | 58% |
| 4 | 🇶🇦 Qatar | 2.7 | -1.7 | 44% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇧🇷 Brazil | 6.0 | +4.3 | 97% |
| 2 | 🇲🇦 Morocco | 5.2 | +2.1 | 91% |
| 3 | 🏴 Scotland | 4.5 | -0.8 | 83% |
| 4 | 🇭🇹 Haiti | 0.5 | -5.6 | 6% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇺🇸 United States | 5.7 | +3.0 | 96% |
| 2 | 🇦🇺 Australia | 5.7 | +2.0 | 95% |
| 3 | 🇹🇷 Turkey | 2.9 | -1.8 | 49% |
| 4 | 🇵🇾 Paraguay | 2.5 | -3.3 | 37% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇩🇪 Germany | 6.7 | +7.4 | 100% |
| 2 | 🇨🇮 Ivory Coast | 5.9 | +1.2 | 96% |
| 3 | 🇪🇨 Ecuador | 3.8 | +0.8 | 81% |
| 4 | 🇨🇼 Curaçao | 0.7 | -9.4 | 5% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇸🇪 Sweden | 5.1 | +3.1 | 95% |
| 2 | 🇳🇱 Netherlands | 5.0 | +1.9 | 87% |
| 3 | 🇯🇵 Japan | 4.5 | +1.0 | 80% |
| 4 | 🇹🇳 Tunisia | 1.3 | -6.0 | 15% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇧🇪 Belgium | 6.6 | +3.8 | 95% |
| 2 | 🇮🇷 Iran | 4.4 | +0.4 | 76% |
| 3 | 🇪🇬 Egypt | 3.4 | -1.0 | 60% |
| 4 | 🇳🇿 New Zealand | 2.0 | -3.3 | 31% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇪🇸 Spain | 7.2 | +5.6 | 98% |
| 2 | 🇺🇾 Uruguay | 5.6 | +2.2 | 91% |
| 3 | 🇸🇦 Saudi Arabia | 2.3 | -3.2 | 37% |
| 4 | 🇨🇻 Cape Verde | 1.6 | -4.6 | 23% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇫🇷 France | 6.6 | +3.8 | 95% |
| 2 | 🇳🇴 Norway | 4.4 | +0.4 | 76% |
| 3 | 🇸🇳 Senegal | 3.8 | -0.4 | 67% |
| 4 | 🇮🇶 Iraq | 1.7 | -3.8 | 26% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇦🇷 Argentina | 7.4 | +5.2 | 98% |
| 2 | 🇦🇹 Austria | 4.3 | +0.4 | 76% |
| 3 | 🇩🇿 Algeria | 3.3 | -1.3 | 60% |
| 4 | 🇯🇴 Jordan | 1.7 | -4.3 | 27% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🇵🇹 Portugal | 6.3 | +3.3 | 94% |
| 2 | 🇨🇴 Colombia | 5.9 | +2.6 | 92% |
| 3 | 🇺🇿 Uzbekistan | 2.4 | -2.5 | 41% |
| 4 | 🇨🇩 DR Congo | 1.9 | -3.4 | 30% |
| Team | Pts* | GD* | R32 | |
|---|---|---|---|---|
| 1 | 🏴 England | 7.0 | +4.5 | 97% |
| 2 | 🇭🇷 Croatia | 5.5 | +2.3 | 90% |
| 3 | 🇵🇦 Panama | 2.2 | -3.3 | 37% |
| 4 | 🇬🇭 Ghana | 2.0 | -3.5 | 33% |
Every match, called
/ 72 fixturesThe single most likely scoreline, the win / draw / loss split (the coloured bar) and the model's expected goals for all 72 group-stage games. Search a team, filter by group, or show only played or upcoming fixtures.
The predicted bracket
/ modal pathThe single most likely knockout bracket: projected group finishers seeded into the official FIFA Round-of-32 structure, each tie called for the side the model makes more likely to advance (its confidence shown beside the pick). Scroll sideways to follow the run to the final.
Round of 32
Round of 16
Quarter-finals
Semi-finals
Final
Champion
Graded against reality
/ 12 playedA true holdout: for this table the ratings were re-fit with every 2026 World Cup game removed, so the model had never seen these results when it called them. (The live forecast does learn from them.) The headline number is the out-of-sample log-loss of 0.846 across 4,481 historical matches in rolling cross-validation — a uniform 33/33/33 guess scores 1.099.
| Match | Actual | Predicted | Call | Hit |
|---|---|---|---|---|
| 🇲🇽 Mexico v South Africa 🇿🇦 | 2–0 | 2-0 | Mexico | ✓ |
| 🇰🇷 South Korea v Czech Republic 🇨🇿 | 2–1 | 1-1 | Czech Republic | ✗ |
| 🇨🇦 Canada v Bosnia and Herzegovina 🇧🇦 | 1–1 | 1-0 | Canada | ✗ |
| 🇺🇸 United States v Paraguay 🇵🇾 | 4–1 | 1-1 | United States | ✓ |
| 🇶🇦 Qatar v Switzerland 🇨🇭 | 1–1 | 0-2 | Switzerland | ✗ |
| 🇧🇷 Brazil v Morocco 🇲🇦 | 1–1 | 0-0 | Brazil | ✗ |
| 🇭🇹 Haiti v Scotland 🏴 | 0–1 | 0-2 | Scotland | ✓ |
| 🇦🇺 Australia v Turkey 🇹🇷 | 2–0 | 1-1 | Australia | ✓ |
| 🇩🇪 Germany v Curaçao 🇨🇼 | 7–1 | 4-0 | Germany | ✓ |
| 🇳🇱 Netherlands v Japan 🇯🇵 | 2–2 | 1-1 | Netherlands | ✗ |
| 🇨🇮 Ivory Coast v Ecuador 🇪🇨 | 1–0 | 0-1 | Ecuador | ✗ |
| 🇸🇪 Sweden v Tunisia 🇹🇳 | 5–1 | 1-1 | Sweden | ✓ |
How the book is written
/ method11,978 internationals
Every full international between FIFA-ranked nations from 2013 to 2026 (210 teams), with venue, neutrality and competition — World Cup games already played included.
Recency & importance
Each match is weighted by a 4.1-year half-life and by competition — a World Cup tie counts more than twice a friendly, where teams rotate and experiment.
Opponent-adjusted MLE
An attack and defence rating per team plus a home-field term are fit by penalised maximum likelihood (L-BFGS), shrunk toward a FIFA-rank prior so beating minnows counts for less.
Cross-validation
Half-life, shrinkage, prior strength and the Dixon-Coles ρ are chosen by rolling-origin cross-validation on historical results — never by copying a betting market.
100,000 simulations
Groups (hosts at home), the official R32 bracket with the eight best thirds, and knockouts decided over 90′, extra time and penalties — all run 100k times with per-tournament form shocks.
The match model
For a fixture between teams i and j, expected goals are
λᵢ = exp(μ + attᵢ − defⱼ + γ·host), where γ applies only to a host nation
(USA, Mexico, Canada) at home — every other World Cup game is neutral. Those expected goals feed a
Dixon-Coles bivariate Poisson with a low-score correction ρ; the win/draw/loss split,
over/under, both-teams-to-score and the modal scoreline all come from that single matrix.
Fully independent
Nothing here is calibrated to a betting market. The ratings come only from match results, with the FIFA ranking as a weak prior. In rolling cross-validation the model scores a log-loss of 0.846 over 4,481 out-of-sample matches (a uniform guess scores 1.099). On a true holdout — the ratings re-fit with every 2026 game removed — it called 42% of the played matches and posted a Brier of 0.618. Even so it lands within 6.9 points, on average, of a public market model it never saw: independent in construction, sane in result.
Team news (availability layer)
A team-strength model is blind to who is actually fit. On top of the ratings, confirmed significant absences carry a small, conservative attack/defence adjustment — the one place real-time information enters. Current adjustments (as of 2026-06-15):
| Team | Net | Confirmed absence(s) |
|---|---|---|
| 🇧🇷 Brazil | -0.14 | Rodrygo, Militao, Estevao out; Neymar a doubt |
| 🇩🇪 Germany | -0.13 | No.1 GK ter Stegen (hamstring) and Gnabry (adductor) ruled out |
| 🇳🇱 Netherlands | -0.13 | Xavi Simons (ACL) and Timber (groin) ruled out |
| 🇺🇸 United States | -0.06 | Carter-Vickers (Achilles) ruled out |
| 🇪🇸 Spain | -0.03 | Fermin Lopez and Samu Omorodion out (squad depth) |
| 🏴 England | -0.02 | Grealish (foot) out (rotation) |
| 🇦🇷 Argentina | -0.02 | Foyth (Achilles) out (squad depth) |
This is why the model rates Brazil, Germany and the Netherlands below their raw strength — each has lost multiple starters. Full-strength sides (France, Portugal, Belgium) are unadjusted.
What was tried and dropped
Honest negative results, each measured on the same cross-validation: an Elo stack (worse log-loss, 0.855 vs 0.846), a rest-days / fatigue feature (no signal — corr ≈ −0.01), and shorter-memory ratings (CV preferred a four-year half-life). The draw probabilities are already near-perfectly calibrated, so the model picks few draws on purpose. Conclusion: the team-rating model is at its accuracy ceiling for goals-and-ranking data; only new information (team news, player-level data, shot-based xG) moves it further.
Honesty about the limits
Data sources & credit
Fixtures and venues from the open WC26 Form Book; historical results from the martj42 international-results dataset; FIFA world ranking as a strength prior. Built as an independent modelling exercise.