The model shows its work.

dc-v1 — time-decayed Dixon-Coles on xG-adjusted goals (decay ξ=1.375, blend 0.85), tuned by 2-D hyperparameter search on 2016–20 and evaluated untouched on 2021–25. The model does not know lineups or injuries.

Held-out performance (1,900 matches, walk-forward)

MetricModelHome-rates baselineUniformClosing market
RPS (lower = better)0.19870.23200.23800.1949
1X2 accuracy54.2%33.3%

We finish 0.0038 RPS behind the closing market — the honest price of a fully odds-free model. Published academic ML models sit at ~0.205; the market at ~0.195. We publish this number; they don’t.

Calibration

0%0%25%25%50%50%75%75%100%100%Predicted home-win probability → observed frequency (bubble = sample size)
Perfect calibration sits on the dashed diagonal: when we say 60%, it should happen 60% of the time.

What we tested and didn’t ship

Every candidate adjustment runs the same held-out walk-forward. It ships only if it improves RPS by a real margin. So far: none have. We publish the failures too.

CandidateΔRPSnShipped
rest days+0.000241900
congestion+0.000101900
bounce back+0.000081900
momentum+0.000001900
deep history 2000+0.000021900
shot profile pb+0.00013380

shot profile pb: one shot-data season so far — re-evaluated as the archive grows.

Live track record

This season’s predictions are on the record — grading begins at full time of the first fixture. Nothing is ever edited or deleted.

Method

Team model: time-decayed Dixon-Coles on xG-adjusted goals, weekly refit, scipy MLE with analytic gradients. Match probabilities come from a Poisson scoreline grid with the Dixon-Coles low-score correction: λ_home = exp(c + atk_h − def_a + γ).
Player projections: lambda = team_lambda x share_of_xG(window) x availability; P = 1 - exp(-lambda) — attacking share and expected minutes from each player’s recent match rosters.
xG Index: teams — z-scaled Dixon-Coles ratings (50 = league average); players — position-relative percentile blend of npxG/90 (35%), xA/90 (25%), involvement/90 (20%), xG chain/90 (20%), minimum 450 minutes.
Data: shot-level xG from understat.com (2014→), fixtures and standings from football-data.org, historical closing odds (benchmark only, never displayed) from football-data.co.uk.

The archive rule: every prediction is written before kickoff and never edited or deleted. When we’re wrong, this page says so.