Every number on CompactStats is a calibrated probability: when we say 60%, we mean it should land about 60% of the time — and we test that claim on tens of thousands of past matches before anything ships. This page explains the machinery, and just as importantly, the situations where we refuse to make a pick.
Results, fixtures, half-time scores, odds and (where available) expected-goals data for 150+ leagues and cups across five seasons, refreshed several times a day. Ratings use finished league matches only; cup games appear in team histories but never contaminate league rates.
Each team contributes a season rate — venue and overall evidence pooled, then shrunk toward the league average with the weight of ~32 games, so tiny samples cannot scream certainty. For a team's first 14 games, last season's rate blends in and fades out. The match estimate is 40% home rate + 40% away rate + 20% league rate; recent head-to-head meetings nudge it up to 10% toward their pattern; and 30% of a Poisson goal-expectation model is folded in (expected goals for each side from attack against defence, using real xG where the league has reliable coverage — it strips finishing luck). Season openers are docked 2.5 points — measured on 2,727 of them, first games run cagey. BTTS is additionally squeezed toward the league mean; it is genuinely the hardest market to predict and pretending otherwise miscalibrates it.
Pure Poisson: each side's expected goals generate a full score-probability grid, which sums to home/draw/away probabilities. The pick is whichever outcome is most likely, and the edge column compares our probability with the bookmaker's after stripping their margin. Why you will almost never see a draw pick — and why that is correct — is a study of its own.
Honesty means knowing when the model has nothing to say. We make no pick on: European qualifier rounds (graded a coin flip across 1,150 historical games — the audit); cup ties where either side has fewer than 3 league games this season; games where our own outlier boards contradict the call; and over 3.5 leans between 28% and 45%, where a binary call is noise. The percentage stays on show for information — we just do not put our name to a pick.
Finished games are graded against official results. Live-captured finals grade provisionally after 25 stable minutes and are locked in by the official sync. The daily and weekly combination selections are frozen into a git-committed ledger each morning before play — the record cannot be quietly rewritten.
The model reads goals, not team news: it knows nothing about injuries, rotation, motivation or weather. Probabilities are long-run frequencies, not promises about single games — a 70% call failing three times in a row is consistent with 70%. Odds shown are a snapshot and move. This is a research tool, not betting advice.