How DeepScore works
Every day at midnight, DeepScore publishes a call for a small set of football matches. This page explains where those numbers come from, what they mean, and — just as importantly — what they cannot tell you.
One run a day, at midnight
DeepScore does not react to your visit. A scheduled job runs once every 24 hours at 00:00 Europe/Warsaw. It selects the day’s fixtures, gathers the data, runs the model, and writes the results. What you see on the site was calculated before the first kick-off and does not change until the next run.
This is a deliberate constraint. A model that recalculates on every page load invites tinkering, and a prediction you can refresh until you like it is not a prediction. The call is fixed, timestamped, and published before a ball is kicked.
The data behind each call
For both teams in a fixture, the model looks at several layers of evidence.
Season-level performance. Expected goals scored and conceded per match, actual goals, shot volume, shots on target, and the share of goals coming from set pieces. Expected goals matter more than actual goals here, because a team that creates good chances and misses them tends to start scoring again, while a team scoring from low-quality chances tends to stop.
Recent form, weighted. The last five and last ten matches, with more recent games carrying more weight. A result from three days ago says more about a team than one from three months ago. This weighting shapes the research and the written reasoning you see under each call; it does not feed the arithmetic directly, which is built from home and away splits rather than from a rolling form window.
Home and away, counted separately. Many teams are close to unrecognisable away from their own ground. A side averaging 2.1 expected goals at home and 1.1 on the road is two different teams, and collapsing that into a single season average throws away the most useful thing you know about them. These venue splits are what the model’s strength figures are actually built from.
Team news. Injuries, suspensions, the absence of a first-choice goalkeeper, and whether the side is missing its leading scorer. A team without the player responsible for a fifth of its expected goals is not the team its season numbers describe.
Match context. Days of rest, fixture congestion, travel distance, and weather at kick-off. These matter less than most people assume, and they are weighted accordingly — they nudge the numbers, they do not drive them.
The model
Attacking and defensive strength are calculated by comparing each team’s output to the average for its league. A side generating 2.0 expected goals per home match in a league averaging 1.6 has an attacking strength above 1; a defence conceding less than the league norm has a defensive strength below 1. These figures are combined with the opponent’s to produce an expected goal total for each side.
From those two numbers, a Poisson distribution gives the probability of every plausible scoreline. Plain Poisson has a known weakness — it underestimates low-scoring draws — so a Dixon-Coles correction is applied to the 0-0, 1-0, 0-1 and 1-1 outcomes. Summing the resulting grid produces the probability of a home win, a draw and an away win.
Context adjustments are applied as multipliers, and the combined effect on either side is capped. No stack of small factors is allowed to swing a match on its own.
Weighing the model against market consensus
The figure published on the site is not the model’s output on its own. It is a weighted blend of the model and the market consensus — the implied probabilities derived from published odds, with the built-in margin stripped out so the three outcomes sum to one hundred.
How much weight each side carries depends on how much usable data the research pass actually found. Where the evidence is rich — full expected-goals coverage, confirmed team news, a decent run of matches — the model carries the majority of the weight. Where it is thin, that flips, and the consensus carries most of it. On the majority of the fixtures DeepScore publishes, the data is thin, so the consensus is the larger contributor.
The honest reason is straightforward: a market consensus aggregates information no automated pipeline has access to — closed-door training reports, local knowledge, money moving on a rumour hours before kick-off. Leaning on the model when it knows less than the consensus does would produce a more confident number and a worse one. Pretending otherwise on this page would be dishonest.
What the percentage means
A call shown at 62% does not mean that team will win. It means that if this exact situation played out a hundred times, that outcome would be expected in roughly sixty-two of them — and some other result in the remaining thirty-eight. Favourites at 62% lose regularly. That is not the model failing; that is what 62% means.
Most calls sit considerably lower than that. A typical day’s strongest outcome lands somewhere close to 47%, which is another way of saying the most likely result is still less likely than not. A call is simply the highest of three numbers that add up to one hundred — it is not a measure of how sure anyone is.
Football is among the lowest-scoring major sports, which makes it among the least predictable. A single deflection decides matches. Anyone offering certainty is selling something.
The limits
Advanced metrics like expected goals are published for a handful of major leagues and are simply unavailable for many competitions DeepScore covers — cup ties, qualifying rounds, second tiers and most football outside the major European leagues. For a substantial share of published fixtures, the gap is wider than expected goals alone: no usable team-level figures are found at all.
When that happens the model does not guess. It starts from the flat league-average baseline with both sides treated as ordinary, and the published number then rests mostly on the market consensus. Those calls are still worth reading — the consensus is a genuine signal — but they carry far less of DeepScore’s own analysis than the ones where the data was there.
Small samples early in a season are unreliable no matter how the numbers are dressed up. And no model has access to what happened in training on Friday.
DeepScore is a forecasting tool, published for interest. It is not betting advice and offers no guarantee of any outcome.