World Cup 2026 Prediction Engine
An end-to-end analytics pipeline — Python ETL → Supabase → Next.js — that published Dixon–Coles model probabilities alongside live market odds for all 104 matches of the tournament. Now preserved as a project archive.
How the model did
72 group-stage matches, scored with the frozen pre-tournament model (dc-v1.1) against Pinnacle de-vig. Pick accuracy = how often each side's most-likely 1X2 outcome matched the result; Brier = mean squared error of the full probabilities (lower is better).
See the full match-by-match track record →How it's built
Python ETL
Fail-loud ingestion + modelling jobs. Idempotent upserts, provenance on every row, raises rather than silently approximating.
Supabase (Postgres)
The single source of truth. The service key stays server-side only; the frontend is strictly read-only.
Next.js + Tailwind
App Router, bilingual with next-intl (zh-TW / en). Data flows through a server-side API with graceful empty states.
- World Football Elo ratings feed a fitted Dixon–Coles Poisson model for 1X2, over/under and both-teams-to-score.
- Monte Carlo simulations drive group advancement odds and, via FIFA's Annex C mapping, full-bracket knockout and champion odds.
- Pinnacle odds are de-vigged into a fair-probability benchmark, powering a model-free EV / quarter-Kelly calculator.
Explore the site
Match Predictions
Model 1X2, over/under and upset risk shown next to de-vigged market odds.
Track Record
How the frozen pre-match model actually held up against results and the market.
Advancement Odds
Monte Carlo simulation of the group stage — each team's qualification chances.
Knockout Bracket
The real bracket filled from results, with champion and per-round odds.
EV Calculator
Enter your odds, compare to the fair market price, get EV and a ¼ Kelly stake.
Methodology
The full data-to-probabilities pipeline, step by step.
Engineering highlights
- Fail-loud ETL: mismatched team names, missing fields or count mismatches raise instead of silently approximating, and every job is an idempotent upsert with provenance.
- Ran live through all 104 matches, with a scheduled recompute every 2 hours auto-ingesting results and re-predicting the next round.
- Mid-tournament model refit (dc-v1.2) behind an anti-leakage validation gate — in-play Elo snapshots only, no look-ahead.
- Bilingual UI with message-key parity enforced by tests, so the two locales can never drift out of sync.
- Credentials stay server-side: the service key never reaches the browser, which only ever reads through a server API.
Data provenance
Odds and simulations are frozen at the final (19 Jul 2026); the site is preserved as an archive.
- Elo as of
- May 26, 2026
- Final odds snapshot
- Jul 19, 2026
- Last simulation run
- Jul 19, 2026