Stream Rundown

Goal distributions for the eAdriatic League. Every match is a distribution, not a scoreline — so the whole shape is published.

MODEL LIVE
100,135 matches trained
data to 2026-08-27 16:20 UTC

How this works

Nothing here is proprietary. The model is a few dozen numbers and they are all published on this site.

Matches trained
100,135
rolling, refreshed nightly
Operators
48
active enough to rate
Error per match
1.854
goals, on unseen data
Noise floor
1.860
best achievable, same data

The model

Each side’s scoring rate is built from who is playing:

rate(home) = base + attack(home) + defence(away) + home term + warm-up(home) rate(away) = base + attack(away) + defence(home) + warm-up(away)

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

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.

0%0%25%25%50%50%75%75%100%100% said 27%, happened 28% (216 matches)said 36%, happened 33% (668 matches)said 46%, happened 43% (2,227 matches)said 55%, happened 55% (4,004 matches)said 64%, happened 63% (4,503 matches)said 75%, happened 74% (3,025 matches)said 83%, happened 80% (811 matches) What we said What happened

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 saidIt happenedMatches
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.

ApproachDevianceErrorBrier
Always the league average0.96332.00290.24242
Average for the competition0.96091.99660.24188
Average for these two operators0.88921.87830.22579
This model0.88251.86590.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.

OVER 3.5
4 goals or more
We said87.8%
Happened87.6%
OVER 4.5
5 goals or more
We said75.8%
Happened74.4%
OVER 5.5
6 goals or more
We said60.7%
Happened59.3%
OVER 6.5
7 goals or more
We said44.7%
Happened42.4%

What it cannot do

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.