How Exact Predictors works

The model, the data behind it, and what the numbers do and don't mean.

Exact Predictors is a statistical football forecasting site. For each upcoming match we estimate how many goals each side is likely to score, turn that into a probability for every plausible scoreline, and publish the result along with the reasoning behind it. Everything on the site is produced by a model from public match data — there are no tipsters and no editorial picks.

This page explains how that works, because a forecast you can't interrogate isn't worth much.

1. Estimating team strength

Each team gets an attacking and a defensive rating derived from how many goals it scores and concedes relative to the league average. These are kept separate for home and away form, because the gap between the two is large in most leagues and treating a season as one undifferentiated block throws that information away.

Ratings are always relative to the competition. Scoring twice a game in a low-scoring league is a stronger signal than the same rate in a high-scoring one, so every rate is normalised against the league it was produced in before two teams are compared.

2. Expected goals for the specific fixture

Strength ratings are combined into an expected goal count for each side in this particular matchup: the home team's attack against the away team's defence, and vice versa, with a home-advantage term fitted from the competition's own history rather than assumed.

This pair of numbers — shown on every match page as Expected goals — is the input everything else is built from.

3. From expected goals to a scoreline distribution

Goals in football arrive at a roughly constant rate through a match, which makes the Poisson distribution a good fit for turning an expected goal count into the probability of each exact score. Doing this for both teams produces a matrix over every plausible scoreline, and summing the right cells gives the probability of a home win, a draw, an away win, both teams scoring, or any goal total.

Plain Poisson has a known flaw: it assumes each team's goals are independent of the other's. In reality low-scoring results are correlated — tight, cagey matches suppress both sides at once — so independent Poisson under-predicts 0-0 and 1-1 and over-predicts 1-0 and 0-1. We apply the Dixon-Coles correction (Dixon & Coles, 1997), which adjusts exactly those four low-score cells. Its strength is a parameter fitted per competition from that competition's own match history, not a constant.

4. Form and context adjustments

Season-long averages are slow to react, so expected goals are adjusted by a small set of shorter-run signals before the matrix is built:

  • recent scoring and conceding rates compared against the season-long baseline, to catch a team trending away from its own average;
  • active streaks — a long run of conceding is treated as a defensive weakness that raises the opponent's expected goals;
  • squad availability, weighted by how much of the team's goal output the missing players actually account for, so losing a primary scorer moves the forecast and losing a fringe player barely does;
  • competition context, including how much weight early-tournament results deserve when two teams have no shared history.

Every adjustment that fired on a given match is listed on that match's page under Model adjustments, with the multiplier it applied. Nothing is hidden in a black box.

5. Confidence

Each forecast carries a confidence score from 0 to 100. It measures how tightly the model's own probability mass sits around its headline prediction — derived from empirical residual bands built from past model error, not from hand-picked thresholds.

Read it as a spread indicator, not a success probability. Two evenly-matched teams produce a low score because the outcome really is close to a coin flip, and that is useful information in itself.

6. Written match scenarios

Some matches also carry a short written scenario describing how the game might unfold — which phases of the match each side tends to dominate, and what would have to happen for the forecast to be wrong. These are generated by a language model that receives the statistical output described above and is constrained to stay consistent with it. They are commentary on the model, not a second independent opinion.

Where the data comes from

Match results, scoring rates, goal timings, and league tables come from public football statistics sources; squad availability comes from public squad data. We store a snapshot of the inputs behind each forecast, which is what allows the results page to score old predictions honestly instead of re-running today's model on yesterday's fixtures.

What this site does not do

It does not tell you what will happen. A forecast is a probability distribution: a 60% home win means the away side or a draw arrives four times in ten, and those four times are not model failures. We publish our track record precisely so this can be judged over a season rather than a weekend.

Predictions are statistical estimates provided for informational and entertainment purposes and carry no guarantee of accuracy.

Research, evidence, and publisher information

This overview is the short explanation. The underlying method, evaluation rules and automation standards are published separately so each claim can be inspected in the right context.

Frequently asked questions

How accurate are the forecasts?

We publish this rather than claim it. Every forecast is stored before kickoff and scored against the real result, and the results page shows how the model has actually done. Football is a low-scoring, high-variance sport: even a well-calibrated model gets a large share of individual matches wrong, and any source claiming otherwise is overselling. What a good model buys you is being right slightly more often than chance over many matches, not certainty about the next one.

What is xG?

Expected goals (xG) is the number of goals a team would score on average in a given matchup, rather than the number it happened to score. A team that creates chances steadily but finishes badly for a few weeks will have a higher xG than its goal tally suggests — and tends to score more later. We estimate each side's xG for a specific fixture from its scoring and conceding rates, split by home and away, adjusted for the opponent it is facing.

What does the confidence score mean?

It is how much spread the model expects around its own forecast, on a 0–100 scale. It is not the probability that the prediction is correct. A high score means the inputs point consistently in one direction; a low score means the match is genuinely close or the underlying data is thin. A confident-looking scoreline with a low confidence score should be read as “this is the single most likely result, but several others are nearly as likely”.

How often is everything updated?

Team statistics are refreshed as new fixtures are played, and a match's forecast is regenerated when its underlying data changes — so a prediction made a week before kickoff can differ from the one shown on matchday. Squad availability is picked up in the same cycle, which is usually what moves a forecast late.

Why did a prediction change?

Because an input changed: more recent results, a shift in scoring form, or a significant absence in one of the squads. The model has no memory of what it said yesterday — it re-derives each forecast from the current data. Changes are a feature of responding to new information, not a sign the earlier number was arbitrary.

Which competitions are covered?

The major European domestic leagues, the UEFA club competitions, and international tournaments. Coverage depends on having enough played matches to estimate team strength — early in a season, or in a tournament between teams that rarely meet, forecasts lean more on longer-run measures of squad quality and carry lower confidence.