PREMIER LEAGUE FORECASTING SYSTEM

A forecaster built to reject its own ideas.

A Dixon-Coles match model and season simulator inside a walk-forward acceptance harness whose job is to say no. Of 14 saved arm runs, one passed all four gates.

SAVED RESULTS Every figure is from the repo's saved outputs and CLOSED-LINES.md. Nothing runs in your browser and no bets are suggested. How this page was built

2025-26, projected in August

50,000 simulated seasons

Full table

Table projections against what happened

Each projection is 50,000 simulated seasons that sample strength uncertainty and play out every remaining fixture. Choose a case, sort, search a team, and reveal the real table.

Case
Sort by

How have these season probabilities scored historically?

The repo scores its title, top-four and relegation probabilities against ten completed seasons (2016-17 to 2025-26), at four points in each season. Lower Brier score is better. The "drift" variant is the uncertainty treatment used in the projections above.

The market benchmark

Match forecasts are scored with the ranked probability score (RPS, lower is better) over a rolling-origin walk-forward test on the last ten seasons, 2016-17 to 2025-26. The benchmark is the bookmakers' average closing line with the margin removed (Shin method), available for 2,660 of the 3,800 matches. The README's stated goal is parity with that line, not beating it.

Every arm's gap to the market

RPS minus the market's, on the 2,660 covered matches, with 95% intervals. Zero would be parity; every arm is on the wrong side of it.

Select a row for detail.

RPS by season

Plain Dixon-Coles against the production model with the shots-on-target form term, all 3,800 matches.

Dixon-ColesWith shots-on-target form (production)

The arms, with the acceptance rule applied

Every candidate is a change to the baseline, judged on a paired-bootstrap RPS difference, the market gap, a multiple-testing correction and a second, older decade. Older runs used a two-gate rule, and are marked; one earlier run passed that older two-gate rule and was never wired. Filter to see how few survive.

Delta vs baseline: negative is better than plain Dixon-Coles. "Older decade P(better)" is the paired probability the arm beat the baseline on 2006-07 to 2015-16, where it was run.

Closed lines

Ideas the harness tested and closed, condensed from the repo's CLOSED-LINES.md, which exists so the same ideas are not re-derived. Filter by area or search. The number is the one that closed each line.

Area

The resolution floor

The smallest improvement the gate machinery can detect, measured by injecting a synthetic improvement with a real arm's per-match variance (SD 0.01757).

Gate configurationMinimum detectable effect (RPS)
Bootstrap gate alone0.00055
All four gates, family of 10.0004
All four gates, family of 30.0008
All four gates, family of 50.0010

Two arms died at this floor with real but tiny effects of -0.00059 and -0.00030 RPS, per the ledger.

What one forecast looks like

One saved output of the pl predict command for a typed fixture, as of the data date shown. Every market is read off a single full-time scoreline distribution.

How it works, and what to be careful with

acceptance rule (from config.yaml) Accept a change iff ALL FOUR: 1 paired-bootstrap RPS delta vs baseline favourable 2 delta vs the de-vigged market does not degrade 3 survives Benjamini-Hochberg across its family 4 the older decade does not contradict it

Leak-freedom is structural: a split raises an error whenever any training date is not strictly before every test date, and there is no k-fold anywhere. Every tunable lives in the config with a justification, and an arm only counts if the harness can show it does something.

How this page was built. Every figure comes from the repo's saved output files and CLOSED-LINES.md. The "actual" tables are computed from the cached football-data.co.uk results. Nothing is run in your browser, and no bets are suggested.

Read this before quoting the numbers
  • One season, one projection. The 2025-26 comparison is a single case. A 49% title chance for the eventual runner-up is not an error by itself; see the historical scores above for the aggregate picture.
  • The 2025-26 projection is retrospective. It uses only data before 15 August 2025, but the file was produced afterwards.
  • The 2026-27 view covers five matchweeks only. The saved projection simulated the 50 fixtures known at the time, so it gives expected points to date, not a season forecast. Title and relegation columns are hidden for that reason.
  • Still behind the market. The production model is 0.0050 RPS behind the closing line (interval 0.0028 to 0.0071). The README says as much: parity is the goal, and apparent betting edges should be treated as bugs. This is not betting advice.
  • Left out: the 6,700-line decision ledger (NOTES.md), the raw match data, and any live fixtures feed.