How a probability gets made
Four steps, in order. Nothing between them is set by hand for a particular fixture — there is no place in the pipeline where a person types a number over the model’s.
-
The form window
For each club we take its last 15 completed matches, newest first, and weight them so each step back counts about a tenth less than the one before it. Where at least 60% of that weight is covered by expected-goals records, the window is built from expected goals; where it is not, it falls back to goals actually scored and conceded. Both figures are then pulled part of the way toward the competition’s own scoring average, so a club with a short record gets a rating closer to average — a short record is weak evidence, and the model is made to say so.
-
The scoreline grid
Those attack and defence figures become one expected-goal rate per side, and the pair goes into a Dixon-Coles adjusted Poisson model — Poisson for the goal counts, with a correction on the four low-scoring cells (0-0, 1-0, 0-1, 1-1), where real football and plain Poisson visibly disagree. The output is not a pick. It is a probability for every scoreline from 0-0 to 10-10: 121 cells that add up to one.
-
Markets read off the grid
1X2 is the sum of the cells where the home side leads, where the away side leads, and where the two are level. Over/under 2.5 is the sum of the cells with three goals or more. Both teams to score is the sum of the cells where neither number is zero. A correct score is a single cell. Everything else the site publishes — double chance, draw, handicap, the goals ladder — is arithmetic on those same 121 cells, which is the reason our markets cannot contradict one another.
-
The market gets a vote — on 1X2, and nowhere else
Where we have recorded bookmaker prices for a fixture, we take the median price on each of the three selections across every book quoting the full market — so the market side is the market, not one book’s opinion of it — strip the margin out of that (invert each price, then rescale the three so they sum to one) and mix the result with ours: 25% our model, 75% the market. The weighting is deliberate and it is not flattering to us — a liquid market has money and information behind it, and our model is best used as a corrective lens on that price rather than a replacement for it. The blend applies to 1X2 and to nothing else: over/under, both teams to score and correct score are published exactly as the model produced them, with no market number mixed in.
What the A, B and C grades mean
Every prediction carries a letter. It rates the evidence, not the outcome.
Grade A
Both clubs’ form windows are backed by expected-goals records. This is the strongest input the model gets.
Grade B
One club has an expected-goals record behind its rating and the other is rated on goals alone.
Grade C
Neither club has one. The probability is still computed and still published — it is simply a weaker claim, and we would rather print the letter than hide it.
A grade C fixture is not a fixture we expect to get wrong. It is a fixture where the number rests on goals rather than on the chances that produced them, and where a surprise should surprise you less. Where the site ranks fixtures against each other — on value bets — A and B rank above C for exactly that reason.
What this pipeline cannot do
The honest list. Anything below is missing on purpose, not pending.
- It does not read team news. Ratings are built from results, expected goals and prices. Where the data feed gives us a confirmed line-up or an absence, the match page shows it — but it does not move a single probability on that page.
- It does not follow a match in play. Every number is a pre-match number, computed on the last run before kick-off.
- It does not simulate a season. There are no title odds, promotion odds or relegation odds here, because we do not run the simulation that would produce them.
- It is weakest on clubs with a short record — a promoted side early in a season, or a squad rebuilt in one window. The form window has to fill before the rating means much, and the grade tells you when it has not.
- It is not a tip. A probability of 62% is a statement that this happens roughly six times in ten, which includes the four times it does not.
When it runs, and how long a page lives
The pipeline runs twice a day. Fixtures, results and price snapshots come in, ratings are rebuilt, and any page whose numbers changed is written again — the timestamp in the footer of every page is the moment that page was last built.
A fixture gets its own page no more than 7 days before kick-off, and keeps it for 365 days after the final whistle before it drops out of the site. That is why a link to an old match can stop resolving, and why the list of live pages on our index changes from run to run.
What we cover
All 5 of them, in full. There is no long tail here and no competition on this site that the model does not price.
Depth over breadth is a deliberate trade. The model needs a couple of seasons of the same teams playing each other before its ratings mean anything, and every competition we add is a competition whose calibration we would then have to publish. These 5 are what we are willing to stand behind.
Read this next
Our accuracy page puts numbers on all of the above: how the model did across five leagues and three seasons, where it failed, and why nobody who tells you they are 99% accurate is telling you the truth. The full equations are on the mathematics page.