How our football predictions work

Statistical probabilities, AI-written analysis checked by an editor, and every forecast locked and graded in public.

Every probability on Touchline Atlas comes from a statistical model: Elo ratings and a Dixon-Coles goals model, fitted only on results available before the forecast is locked. Two AI analysts, Claude and Codex, read sourced team news and explain the numbers. We grade their own forecasts separately, but in version 1 they do not change the published probability. Each forecast is locked before kickoff (normally 24 hours before), hashed into a public ledger and graded on the 90-minute result.

See today's predictions View the track record
1

Collect verified dataFixtures, results and team news from permitted sources. A result counts only when two sources agree.

2

Calculate probabilitiesElo and Dixon-Coles turn past results into a full score grid for the 90 minutes.

3

AI analysts explainClaude and Codex write the analysis and give their own view, graded in shadow.

4

Lock and gradeLocked before kickoff (normally 24 hours before), hashed in a public ledger, graded after full time.

1. Data: where the numbers come from

  • Historical results come from openly licensed data (public domain), at least four seasons per league.
  • Fixtures and kickoff times come from official league and club sites, checked against a second major source.
  • Results need the same 90-minute score on the official site and one major outlet. If they disagree, the match is flagged and not graded until it is resolved.
  • Team news comes from club statements, press conferences and reputable outlets. We keep the fact and the link, never copied text.
  • Point in time: when we fit the model for a match, we only use results that were in our system before the data cutoff, so a forecast never sees the future.
  • No betting odds in version 1. Free odds feeds do not allow public or commercial use.

Every source and its licence

2. The statistical model: Elo and Dixon-Coles

Two well-tested models each give a probability for home win, draw and away win. We blend them and calibrate the result, so that our 60% picks win about 60% of the time.

Dixon-Coles goals model

log λH = b + h + attH − defA
log λA = b + attA − defH
P(x, y) = τ(x, y) · Pois(x; λH) · Pois(y; λA)

λ is each team’s expected goals: league base rate b, home advantage h, attack and defence strength. τ corrects the four low scores (0-0, 1-0, 0-1, 1-1), where plain Poisson is off.

  • Recency: older matches count less (a half-life of about a year in our backtests), and small samples are pulled towards the league average. Promoted teams start from a league prior and carry a “small sample” label. Clubs moving between the Premier League and the Championship keep their rating instead, adjusted for the gap between the two leagues.
  • Elo updates both ratings after every match, with a goal-difference factor, and converts the rating gap into home, draw and away probabilities with a draw parameter.
  • Blending: pstat ∝ (pDCw · pElo1−w)1/T. The weight w is chosen on validation seasons. The temperature T is set for each league on that league’s own validation seasons and pulled towards a shared value when the league has little history. The current values belong to the model version listed below.
  • One grid for every market: the score grid gives the most likely scores, Over/Under 2.5 and both teams to score, so they always agree with the result probabilities.
Illustration: score probabilities for a 48% / 27% / 25% matchRows: home goals. Columns: away goals. Home win, draw and away win are the sums below, on and above the diagonal.
Home goals by away goals01234
08%7%4%1%<1%
111%13%6%2%1%
29%9%5%2%<1%
35%5%2%1%<1%
42%2%1%<1%<1%

3. What the AI analysts do

Claude and Codex read the same file for every match: sourced team news, the model’s expected goals and its probabilities. Then they:

  • write the analysis on the match page, where every claim needs a source, and an editor checks it before it is published;
  • give their own home, draw and away probabilities;
  • may propose an adjustment of up to ±15% to a team’s expected goals, only for sourced news the model cannot see: a missing key player, rotation before a cup game, a team with nothing left to play for.

In version 1 all of this runs in shadow: the AI view is locked and graded like everything else, but it does not change the published probability. AI never edits a locked forecast.

4. When the AI layer can count

Today the published probability is the statistical model alone. The AI layer gets a weight (at most 0.5) only after at least 300 graded matches and 6–8 weeks of live running, and only if all of these hold on the same matches:

  • better log loss and better RPS than the statistical model;
  • the 95% interval of the difference, bootstrapped by round, excludes zero;
  • the improvement holds in at least two thirds of the leagues.

If it passes, the model version goes up and the change is listed below. If not, it stays in shadow.

Current status
Weight of the AI layer
0.0 (shadow: graded, not used)
Graded matches with the AI layer
11 of the 300 needed
Live running time
0.1 weeks of the 6–8 needed
RPS so far
On the same 11 matches: AI layer 0.1919 · statistical 0.1916
Full comparison and checks

5. How we choose a model

  • Time order only: fit on earlier seasons, choose settings on the next one, and report on a final test set that was never used for choices.
  • Benchmarks: league base rate, always the home team, independent Poisson and Elo on its own. A candidate that cannot beat them is not used.
  • Scores: log loss and RPS out of sample come first; Brier score and calibration are checks.
  • Fair comparison: same matches, same cutoff, same 90-minute target, with uncertainty from a bootstrap by round.
  • Simple wins ties: if an improvement is not stable, we keep the simpler model.

Backtest results

6. Locking

  • Every forecast locks 24 hours before kickoff, or straight away if the match enters our tracking later than that; the match page shows the actual lock time, and every forecast locked before kickoff is graded. The file gets a SHA-256 hash and is committed to our public ledger straight away; the hash and time appear on the match page.
  • A locked forecast is never edited. Mistakes are fixed with a correction record, listed below.
  • If a match is moved, the old forecast is voided but kept, and a new revision is locked before the new kickoff.
  • A forecast made after kickoff is labelled late and not graded.

How to verify a forecast

7. Grading

  • We grade the 90-minute score, stoppage time included. Extra time and penalties are recorded separately.
  • Postponed, abandoned, cancelled and awarded matches are not graded, and neither are late forecasts.
  • If a source corrects a result, we grade again under a new revision with the reason, source and time, and keep the old record.

The numbers on our track record

RPS      = ½ · Σk=1..2 (Σj≤k pj − Σj≤k oj)²     order: home, draw, away
Log loss = −(1/N) · Σ ln p(actual result)
Brier    = (1/N) · Σi Σk (pik − oik)²
Coverage = published eligible forecasts / eligible fixtures

Lower is better for RPS, log loss and Brier. o is 1 for the result that happened and 0 otherwise.

Track record

8. What we don’t claim

  • This is not betting advice. We make no profit claims and link to no bookmaker. 18+.
  • Probabilities are not certainties: a 70% pick still loses about 3 times in 10.
  • We make no accuracy claims until we have 6–8 weeks of live results; until then numbers are marked as an early sample.
  • Models miss things: news after the lock, weather, motivation, a red card in the 5th minute.

Model version history

VersionIn usePublished probabilityAI weightNotes
v1.3-2026-11 Current – nowStatistical model: Elo + Dixon-Coles, log-pooled and calibrated per league; European club competitions rated across leagues0.0Adds the Champions League, Europa League and Conference League. A club's European rating starts from its domestic rating and adds a league-strength offset and a club offset, both learned from European results since 2016/17, qualifying rounds included. Clubs whose domestic league is not in our data are rated from European matches only. Goals use the club's domestic attack and defence plus league and club offsets fitted on European matches. Settings were chosen on 2019/20 and 2021/22 (matches played without fans left out) and tested on 2022/23 to 2025/26: Champions League RPS 0.191 over 628 matches, Europa League 0.198 over 660, Conference League 0.208 over 588. In the Champions League test the model was too cautious about favourites. Domestic league forecasts are unchanged from v1.2-2026-11.
v1.2-2026-11 – Statistical model: Elo + Dixon-Coles, log-pooled and calibrated per league0.0Calibration per league: each league gets its own temperature, chosen on its validation seasons (2020/21–2021/22; Scotland 2020/21; Saudi Pro League 2023/24) and pulled towards the shared value when the league has little history. Serie A keeps the shared value because its own failed our calibration check. Clubs moving between the Premier League and the Championship now keep their rating across the two leagues (Elo gap 400 points, Dixon-Coles gap 0.1) instead of starting as newly promoted sides. One erroneous result removed from the Saudi history. Other settings unchanged from v1.1-2026-10.
v1.1-2026-10 – Statistical model: Elo + Dixon-Coles, log-pooled and calibrated0.0First version fitted on real results: open historical data (CC0) from 2016/17 plus live-season results after the open data's last update. Settings chosen on the 2020/21–2021/22 validation seasons, reported on 2022/23–2025/26. Claude and Codex not run yet (no AI layer).
v1.0-2026-10Not publishedStatistical model: Elo + Dixon-Coles, log-pooled and calibrated0.0Development prototype, run only on sample data while the site was being built. It was never published, and none of its forecasts are in the ledger or the track record.

Record changes

No corrections so far. Every change to a graded result will be listed here, newest first, with the reason and the source.

FAQ

Extra time and penalties happen only in some cup matches and follow different patterns. Grading every match on the same 90 minutes keeps the record comparable.

A win can come through 1-0, 2-0, 2-1 and many more scores, while draws sit on a few, mostly 1-1. So 1-1 can be the single most likely score even when a home win is the most likely result. Match pages show both.

Not in version 1. The published probability is the statistical model. Claude and Codex write the analysis and give their own view, which we grade separately. They get a weight only if they beat the model under the rules above.

Market odds are a strong benchmark, but the free sources do not allow public or commercial use. If we license odds later, they will be added as a separate, labelled layer.

Yes. Each locked forecast has a SHA-256 hash committed to our public ledger before kickoff. Recompute the hash from the published file and compare it with the one on the match page.

Key facts

  • Model versionv1.3-2026-11
  • Match scope90 minutes plus stoppage time; extra time and penalties excluded
  • OutputFull score grid; result, Over/Under 2.5 and BTTS all come from it
  • LockedBefore kickoff (normally 24 hours before), SHA-256 hash in a public ledger
  • UpdatesIn batches; next batch
  • Leagues14: Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Primeira Liga, Scottish Premiership, Eredivisie, Süper Lig, EFL Championship, Saudi Pro League, Champions League, Europa League, Conference League
  • Editorial reviewEvery written analysis is checked by an editor before it is published

See the method at work

Every match page shows the probabilities, the score grid, both AI views and the locked hash.

For information and entertainment only. Not betting advice. 18+. Predictions are probabilities, not certainties. Responsible gambling