How this works
Nothing here is proprietary. The model is a few dozen numbers and they are all published on this site.
The model
Each side’s scoring rate is built from who is playing:
Those rates become a distribution over total goals, which is where every over/under number on this site comes from. The distribution is deliberately narrower than a textbook Poisson: goals here are less erratic than the standard assumption, so the shape is compressed by a fitted factor, currently 1.118.
Three things that surprised us
- Home advantage is almost nothing. The fitted home term is +0.0201 on the log scale, worth +0.061 goals. “Home” is only a stream slot, and a football model would hand it several times too much.
- Players warm up, they do not tire. More matches into a session means more goals — +0.35 on the match total across a long day. Every operator has their own curve, and a minority decline.
- The scoring level drifts on its own. It swung 0.85 goals across the year with nothing in the fixture list to show it, which is why the model re-fits nightly.
Is it any good?
Judge it on calibration, not on how often it picks a winner. This is every prediction on 15,486 matches the model never saw during development, grouped by how confident it was. If the two columns match, a stated probability means what it says.
The dashed line is perfect. Points sitting on it mean a stated probability is worth exactly what it says. Dot size is how many matches fell in that bucket.
| We said | It happened | Matches |
|---|---|---|
| 27% | 28% | 216 |
| 36% | 33% | 668 |
| 46% | 43% | 2,227 |
| 55% | 55% | 4,004 |
| 64% | 63% | 4,503 |
| 75% | 74% | 3,025 |
| 83% | 80% | 811 |
Better than just guessing the average?
A model is only worth anything if it beats the obvious alternatives, so it was made to race three of them over the same 15,486 unseen matches. Deviance is the scoring rule; lower is better.
| Approach | Deviance | Error | Brier |
|---|---|---|---|
| Always the league average | 0.9633 | 2.0029 | 0.24242 |
| Average for the competition | 0.9609 | 1.9966 | 0.24188 |
| Average for these two operators | 0.8892 | 1.8783 | 0.22579 |
| This model | 0.8825 | 1.8659 | 0.22473 |
The third row is the one that matters. Simply looking up what these two operators average together is a strong baseline and it beat every version of this model for weeks. The margin over it is 0.00678 of deviance, and repeating the whole comparison on resampled rounds puts that gap between 0.00298 and 0.01052 — never zero, so the win is real but small.
Each line, on unseen matches
The reliability plot above is the 5.5 line. Here are all four.
What it cannot do
- It is already at its limit. Average error is 1.854 goals against a floor of 1.860. The model is as accurate as its own uncertainty allows; the rest is what a 15-minute match does on its own.
- High-scoring calls run hot. When it says a match is very likely to go high, it is a little over-confident. Trust the middle of the range more than the top.
- It knows nothing about prices. No odds are used anywhere. A well-calibrated probability still loses money against a bookmaker’s margin, so nothing here says whether a price is worth taking.
Who makes this
Built and maintained by Charles Muchiri. The model, its evaluation and every negative result are published here rather than summarised — the working is the product.
Common questions
How accurate is this model?
On 15,486 matches it had never seen, its average error was 1.854 goals against a floor of 1.860. That means it is already as accurate as its own uncertainty allows; the rest is what a short match does on its own.
Is this betting advice?
No. It is a statistics project. No odds are used anywhere in the model, and a well-calibrated probability still loses money against a bookmaker's margin.
What model is it?
A Poisson regression on operator attack and defence with exponential recency weighting, refit every 24 hours, with the goal total reshaped by a Conway-Maxwell-Poisson correction and per-operator warm-up slopes.
Why measure calibration instead of accuracy?
Because the output is a probability, not a pick. A model that says 60% should be right about 60% of the time. Being right far more often would mean it was understating its own confidence, which is its own kind of error.
How often is it updated?
Every night. The model refits on every match played up to that point, and each prediction is written before kickoff and never edited afterwards.