A calibrated probability model for the 2026 FIFA World Cup: 48 teams, full official bracket, June to July 2026. It predicts each team's odds of reaching every stage, the final, and the title.
The model is built so that judgment and numbers never mix.
- A statistical core (bivariate Poisson with Dixon-Coles correction) learns expected goals per team from historical match results.
- An LLM adjustment layer reads news, injury reports, and lineups, then emits only typed categorical signals (for example: player available or not, lineup confirmed or not). It never produces a number. Those signals nudge the model's inputs at prediction time, never during training.
- A Monte Carlo simulator runs 50,000 full tournaments over the official 48-team bracket to produce stage-by-stage odds.
The market is used only to grade the model, never to train it. A calibration step removes the bookmaker margin from closing odds and scores whether the model beats, matches, or loses to the market.
- The LLM never outputs a number.
- Betting odds never enter the model as a feature. A dedicated test enforces this.
- Market data is a validator, never a training target.
- Adjustments happen at inference time, not during training.
- Every prediction is reproducible from data plus config.
git clone https://github.com/Revanth9727/fifa_pred.git
cd fifa_pred
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
cp env.example .env # then add your own API keys
wcpredict build-data # ingest and join source data
wcpredict fit # train the match model
wcpredict simulate # 50,000 tournament runs
wcpredict evaluate # score calibration against the market
wcpredict update --results <match-day> # enter real results, re-simulate the rest
wcpredict-ui # launch the bracket web view
pytest
The suite includes a leakage test that asserts betting odds never reach the model.
Built ahead of the 2026 tournament. Model, simulator, calibration, and web view are implemented and tested.