How this works
Two halves: the model that prices fixtures, and the event layer underneath it. Both are built and published. Only the first is allowed to move a prediction, and the difference is marked throughout — a model that blurs the two is selling something.
From shots to a published call
Read the shots, not the scores
Turn shots into team strength
Map where a team lives on the pitch
Price the fixture
Commit it before kickoff
Replay the season ten thousand times
How anything gets in
Nothing ships because it sounds clever. An idea is fitted on one season, frozen, and judged on a season it has never seen — and only ships if it beats what is already there. Most ideas fail, and the failures stay on the record.
Squashing all nine zone matchups into one number made them redundant with the strength ratings. Kept apart as four channels, they beat it on an unseen season by roughly four times the old edge.
Tracking which key players were missing improved the model on one season. Across two, the coefficients flipped sign. A real effect does not reverse direction, so it was thrown away.
What it does not do
- Never reads bookmakers' odds. It states what an outcome is worth and stops. Comparing that with a price is the reader's job; telling anyone what to bet is nobody's.
- Does not know tonight's line-up. No team-news or injury feed, so a late absence is invisible to it.
- Does not model managers, cups or transfers. A new manager reaches today's ratings only through results, slowly — the managerial layer below is being built, not running.
- Player ratings do not feed predictions. They are a separate, unvalidated experiment — see Mental.
Zones as the unit
Everything above runs on 25 shots a match — about 1.8% of what happens. This layer runs on every event, roughly 1,431 per match, each with the player, the position, the outcome and the minute. It is built and published: the shot and pass maps, the zone heat, the capability profiles and the manager spells all read it.
What it has not done is earn a place in the predictor. Zones built from player events were measured against the shipping model and did not beat it, so they do not move a single published probability. That is the gate working, not the layer failing — the measurement is on the record. The organising idea it is being built toward: a team is as strong as the way it occupies space, and a zone cannot be rated without the players who occupy it — so the zone rating and the player rating become one measurement read at two levels.
Controlled, not touched
A touch counts deflections, blocks and miscontrols, which say nothing about where a player operates. What matters is where he had the ball and did something deliberate with it.
State includes the man count
A red card changes a match more than most goals do. Every event carries the scoreline and the man count at that minute, so how a side plays with ten becomes measurable.
Intent, reported honestly
How often a player tried is the mental signal — but attempts alone would crown the wasteful, so attempt rate and success rate are published as two numbers, never blended into one that hides which half is doing the work.
Game state, without the trap
Weak teams are behind constantly, so raw “performance while losing” rewards being bad. Everything is measured per minute spent in that state and against the player's own baseline: never who was losing, but who changed when it got hard.
Zone contributions are fitted, not assumed
Today's zone importance weights were a workaround for not knowing which player an action belonged to. With names on every event that crutch goes — but a flat sum would be just as much a guess, since the fitted channels already came out wildly unequal. The contributions get measured.
Fitted on the residual, so nothing is redundant
Zones and chance quality are computed from the same matches, so they overlap by nature. Zones and player ratings are therefore fitted against what the chance-quality baseline gets wrong — they can only earn weight for information it does not already contain. Redundancy is excluded by arithmetic, not by hope.
The manager is ranked, not inferred
He gets his own record the way a player does, from his history rather than this squad's zones: what his teams do level, behind and a man down, whether leads are held or retrieved, discipline, results against chances created — across every club he has managed, which is what separates the manager from the squad he inherited. Every match records who was in charge, so his spells are derived rather than collected: first match to last, club by club.
Opponent-adjusted, with minimum samples
A winger who spent a season against the league's worst full-backs would read as elite without correcting for who he faced. And splitting by zone, state and game phase fragments the data fast, so every cell carries a minimum sample before it is shown.
None of it moves a prediction until it passes the same gate as everything else, and the baseline stays deliberately blind to all of it — a metric cannot be validated against a model that already contains it. Published as analysis, withheld from the forecast: those are two different standards of proof, and conflating them is how a dashboard starts calling itself a model.