WC2026
Price football matches, then check the model against the market.
Football
Machine learning
Role
Research, modeling, product, build
Timeline
Research build
team
Independent build
platform
Python and web

The Real Problem
Football predictions are easy to publish and hard to evaluate. A correct winner can still come from a poorly priced model, while a plausible probability can hide weak assumptions about teams, tournaments, and low-scoring matches.
I wanted a system that could price outcomes, survive historical testing, and make its disagreement with a market visible enough to inspect.
The question is not just who wins. It is whether the model's probability is better calibrated than the price.

Finding the Fix
The predictor combines a Dixon-Coles bivariate Poisson model with XGBoost. The statistical model handles football's score structure, while the machine-learning layer captures nonlinear relationships in team and match features.
The output becomes fair-value probabilities. Before comparing them with Kalshi, the tool also derives a no-vig market anchor.
Assemble reproducible match and team data from public sources.
Backtest on past World Cups instead of memorable games.
Compare calibrated probabilities, not only winner accuracy.
Size simulated positions with a conservative Kelly framework.

What Actually Happened
The first model looked impressive on ordinary train-test splits and became less convincing when the split respected time. Tournament football changes, national teams have sparse schedules, and a feature can quietly leak future information.
Rebuilding the evaluation around historical cutoffs made the model more honest. Backtests on the 2018 and 2022 tournaments became the central reference.

What Changed
The product stopped presenting one confident prediction and began showing a range of evidence. Users can see the fair price, the market anchor, the model edge, and the simulated position size as separate ideas.
A $1,000 paper account makes decisions concrete without confusing an experiment for financial advice or a proven live strategy.

What I Had to Work With
The entire system uses free public data, so coverage, naming, and update cadence are imperfect. International football adds infrequent matches, changing squads, and neutral venues.
Those limits favor simple, inspectable features and careful backtests over a huge model that cannot explain why it moved.

What I'd Do Differently
I would build the data contracts before experimenting with model combinations. Too much early work went into reconciling team names and repairing historical rows after modeling had already begun.
I would also track calibration and closing-price movement from the first simulated trade.
What I Learned
A backtest is a product feature. It needs understandable assumptions, reproducible inputs, and a display that makes failure visible.
I also learned that market comparison improves the interface. It forces every model number to have a reference point.