Skip to content
HM
←Back to Portfolio

Data Science · Sports Modeling

FIFA World Cup 2026Prediction Model

A statistical model that forecast the 2026 World Cup one stage at a time. It is trained on 48,235 international matches; after every stage the real results were fed back in and the whole tournament was re-simulated. Walk through the eight snapshots to see what the model thought, when it thought it, and how it turned out.

Python · pandas · statsmodels · NumPy · Poisson GLM · Elo · Monte Carlo · Next.js

How it ended

Spain
🏆 World champion
Spain
Argentina
Runner-up
Argentina
England
Third
England
France
Fourth
France

Spain 1–0 Argentina (after extra time) in the Final. The model’s last snapshot, taken before the Final, gave Argentina 53% and Spain 47% to lift the trophy.

The story in four numbers

Champion’s odds at kickoff
13.7%

Before a ball was kicked the model ranked the eventual champion #2.

Group results called
43/72 · 60%

Share of matches where the single most likely result happened (random guessing: 33%).

Knockout winners called
25/32 · 78%

Share of ties where the team the model favoured advanced (coin flip: 50%).

Goals per group match
2.56 vs 2.99

Predicted on average vs. actually scored — a check on the goal model.

How the title odds moved

Each line is one team’s probability of winning the trophy, re-estimated at every snapshot from kickoff to the semi-finals. Tap a snapshot to compare the teams.

0%10%20%30%40%50%60%Argentina 53%Spain 47% ★France 0%England 0%Start#1MD 1#2MD 2#3Groups#4R32#5R16#6QF#7SF#8

Tap a column to inspect that snapshot · tap a team to hide or show it · a line falls to 0% when the team is knocked out

#8 · After SF
Argentina53.0%
Spain ★47.0%
France0.0%
England0.0%
★ went on to win

The eight snapshots

As real results came in, a new forecast was published for everything that remained. Eight snapshots, from before kickoff to the Final — open any of them to see its predictions.

Was the model any good?

Every match was scored against the odds the model had when it was still unplayed. Group games are judged on the 90-minute result, knockout ties on who advanced.

StageMatchesCalledAvg. prob. on what happenedLog loss
Matchday 12411/24 (46%)41%
1.07
Matchday 22418/24 (75%)52%
0.76
Matchday 32414/24 (58%)50%
0.79
Round of 321613/16 (81%)64%
0.47
Round of 1686/8 (75%)60%
0.53
Quarter-finals44/4 (100%)63%
0.47
Semi-finals22/2 (100%)57%
0.57
Third place10/1 (0%)49%
0.71
Final10/1 (0%)47%
0.76
Group stage7243/72 (60%)47%
0.87
Knockouts3225/32 (78%)61%
0.51
Lower is better · | = baseline (1.10 / 0.69) · most likely result happened / favoured team advanced

Knockout rows count who advanced. Goal columns use only ties settled in 90 minutes, because extra-time scores are not comparable with a 90-minute forecast; that subset skews towards decisive results, so read it with care.

Reading the scorecard

In the group stage the single most likely result happened 60% of the time, against 33% for random guessing, with a log loss of 0.87 versus 1.10 for a model that always says “one third each”. In the knockouts the favoured team advanced in 25 of 32 ties.

The hardest stage was Matchday 1: a log loss of 1.07 barely improved on the 1.10 baseline. Every later stage with at least 8 matches beat its own baseline by a wider margin.

Each matchday has only 24 matches and the later rounds even fewer, so stage-to-stage differences are mostly noise. Treat the table as an honest audit, not as proof that the model got better or worse as the tournament went on.

Did updating during the tournament help?

From matchday 2 on, the snapshots update every team’s Elo with the real results. Comparing those odds with the frozen pre-tournament odds for the very same matches: Matchday 2: log loss 0.757 updated vs 0.762 frozen (better); Matchday 3: log loss 0.790 updated vs 0.782 frozen (not better).

The evidence is mixed: with 24 matches per matchday the difference is within noise.

The biggest surprises

The results the model thought least likely — measured with its own pre-match odds.

How it works

Two models, one ensemble

A Poisson + Elo regression over the full history is blended (60/40) with a Poisson GLM that learns per-team attack & defense strengths from 2010 onward. Recent matches are weighted more heavily.

Goals → everything

Each match becomes a probability grid over scorelines. From that single grid we derive win/draw/loss, over/under 2.5, both-teams-to-score and the most likely results.

Simulated 20,000 times

The entire tournament — group stage through the final — is Monte-Carlo simulated 20,000 times. Each run resolves the bracket using the official FIFA seeding rules for third-place teams.

Updated by results, never by hindsight

After each stage the real scores are locked in and every team’s Elo is updated with the World Football Elo formula. The two models are not refitted, and a played match always keeps the odds the model had before kickoff.

The 48 nations

Twelve groups of four. Each row shows the team's current Elo rating and its rank among all 48 qualified nations.

Group A

Top seed · Mexico
MexicoMexico1875#18
South KoreaSouth Korea1758#28
South AfricaSouth Africa1517#45
Czech RepublicCzech Republic1740#29

Group B

Top seed · Canada
CanadaCanada1788#23
SwitzerlandSwitzerland1891#17
QatarQatar1421#48
Bosnia and HerzegovinaBosnia and Herzegovina1595#40

Group C

Top seed · Brazil
BrazilBrazil1991#5
MoroccoMorocco1827#22
ScotlandScotland1782#24
HaitiHaiti1548#44

Group D

Top seed · United States
United StatesUnited States1726#31
AustraliaAustralia1777#25
ParaguayParaguay1834#20
TurkeyTurkey1911#13

Group E

Top seed · Germany
GermanyGermany1932#10
EcuadorEcuador1938#9
Ivory CoastIvory Coast1695#35
CuraçaoCuraçao1434#47

Group F

Top seed · Netherlands
NetherlandsNetherlands1948#8
JapanJapan1906#14
TunisiaTunisia1628#38
SwedenSweden1712#33

Group G

Top seed · Belgium
BelgiumBelgium1894#15
IranIran1772#26
EgyptEgypt1696#34
New ZealandNew Zealand1562#43

Group H

Top seed · Spain
SpainSpain2157#1
UruguayUruguay1892#16
Saudi ArabiaSaudi Arabia1576#42
Cape VerdeCape Verde1578#41

Group I

Top seed · France
FranceFrance2063#3
SenegalSenegal1860#19
NorwayNorway1914#11
IraqIraq1607#39

Group J

Top seed · Argentina
ArgentinaArgentina2115#2
AustriaAustria1830#21
AlgeriaAlgeria1772#27
JordanJordan1680#36

Group K

Top seed · Portugal
PortugalPortugal1989#6
ColombiaColombia1982#7
UzbekistanUzbekistan1714#32
DR CongoDR Congo1652#37

Group L

Top seed · England
EnglandEngland2024#4
CroatiaCroatia1912#12
PanamaPanama1730#30
GhanaGhana1510#46

Elo ratings sourced pre-tournament. This is a probabilistic model for analysis and entertainment, not betting advice. Methodology snapshot: trained on data up to 2026-06-11.