How TableTalk works

A match model turns each team's past results into a chance of every scoreline. A simulator plays the rest of the season 10,000 times with those chances. Both were tested on past seasons before any live prediction was made.

1. The match model

TableTalk uses the Dixon-Coles model (1997), a small model of goals that can be explained in a few sentences:

  1. Every team has two numbers: an attack strength and a defence strength. One league-wide home advantage is added on top.
  2. Those numbers give each side's expected goals in a match. They work as multipliers: an attack of +0.24 means about 27% more goals than an average team.
  3. Goals are then drawn around those expectations (a Poisson distribution), with one small correction: real football has more 0–0s and 1–1s, and fewer 1–0s and 0–1s, than that predicts. One extra number, called rho, fixes exactly those four scores.
  4. The numbers are fitted to past results, with recent matches counting more: a match's weight halves every 365 days.

Why this model: a season simulator needs whole scorelines, because goal difference decides places, and Dixon-Coles gives a full distribution over scores. Every number in it means something you can say out loud. The trade-off: it knows only results, nothing about injuries, transfers or managers.

2. From matches to a season

One simulated season works like this:

  1. Start from the real table.
  2. Draw this season's team strengths from how uncertain they are (next section).
  3. Play every remaining fixture by drawing a scoreline from the match model.
  4. Add the simulated results to the real ones and rank the table with the league's own points and tie-breaking rules.

That is repeated 10,000 times. A team's title chance is the share of those seasons it finished first; “Proj. pts” is its average final points across them. The fixtures come from the real published fixture list, never a generated one. Each league's rules (number of teams, tiebreakers, play-off places) are settings, and every official final table from 2010-11 to 2025-26 is reproduced exactly from the results.

3. Why season chances are less extreme

We don't know exactly how good each team is. A team that is really a little better than its rating is better in all its remaining matches, not just one. So each simulated season draws its own strengths, spread according to how well the results pin each team down: wide for promoted teams and early in a season, narrow for established sides.

Without this, early-season forecasts were over-confident in the Premier League backtest: when it said 70–99% before a season started, the outcome happened 71% of the time against an average forecast of 87%. With it, 83% against 86%. That is why a team's season chances are a little less extreme than repeating each match's chances would suggest.

5. How to read the numbers

  • Whole percentages. With 10,000 simulated seasons, a 50% chance carries about ±1 point of simulation noise, so a decimal would claim precision that isn't there.
  • Never 0% or 100%. “Didn't happen in 10,000 simulations” is not the same as impossible, so very small chances show as “<1%” and very large ones as “>99%”.
  • Home, draw and away add up to 100. They are rounded together so the three shown always sum to 100.
  • Zones are league positions only: title, top four, top five, top half, relegation and, where a league has one, the relegation play-off place. They are not claims about European qualification, which also depends on cups that aren't modelled.
  • Times are in your time zone. Kick-off times can still change, for example for television.

6. Backtests: how well it has done on past seasons

A backtest replays past seasons week by week: each forecast uses only results from before that week. The settings were chosen on 2012-13 to 2017-18, and the results below are from the report seasons (2018-19 and 2021-22 to 2025-26), which were never used to choose anything. The two seasons affected by COVID are left out, a decision made before any results were seen.

Scores are log loss (lower is better). Each forecast is compared, on the same matches, with base rates (the league's usual home, draw and away frequencies) and with the betting market (closing odds with the bookmaker's margin removed, the strongest public forecast). In the Premier League the log losses were: model 0.965, base rates 1.064, market 0.945.

Match forecasts, report seasons
LeagueMatchesLog loss compared with base ratesShare of the gap to the market closedModel minus market, log loss (± 95% interval)Calibration gap, home / draw / away (points)
Premier League2,2809.4% lower*83%+0.020 ± 0.0073.0 / 1.2 / 1.9
Bundesliga1,8367.5% lower*81%+0.019 ± 0.0083.2 / 1.2 / 2.4
La Liga2,2807.6% lower*83%+0.016 ± 0.0073.0 / 2.1 / 3.0
Serie A2,2809.6% lower*85%+0.018 ± 0.0071.9 / 2.7 / 3.1
Ligue 12,0586.4% lower*77%+0.020 ± 0.0071.2 / 0.7 / 2.1
  • Against the market: in every league the market's log loss is lower, by about 0.02, and every interval excludes zero. The model closes 77–85% of the gap between knowing nothing and the market. Part of the gap is information the model never sees: team news, line-ups, managerial changes.
  • Calibration gap: how far, on average, the forecasts sit from “60% happens 60% of the time”, in percentage points. Small is good.
  • * Against base rates the README gives no interval, so none is shown here. Contract request R10 asks for these numbers, with intervals, in a published file.
  • Numbers copied from the project README at commit bcca0a5, where every figure, the method and the code that produced it are written up.

The live track record is separate: it scores only predictions locked before kick-off, and is never mixed with these backtests.

7. Known limitations

  • Nothing beyond results: no injuries, suspensions, transfers, managerial changes or fixture congestion. A sudden change in a team reaches the ratings only through later results.
  • Ratings lag a team that is genuinely declining. Late in a season it still partly trusts ratings built on last season, and mid-to-late season forecasts are slightly under-confident.
  • It can't pick out likely draws. Draw forecasts are honest but almost all sit between 20% and 30%; the market's barely vary more.
  • Future points deductions are not anticipated. Only decisions already announced are applied.
  • One home advantage per league, although some grounds are harder to visit than others.
  • Ratings can't be compared across leagues. Each league is fitted on its own, so a rating is relative to that league's average.
  • Early-season forecasts lean on last season, because there are few results yet.

8. Locking and honesty rules

  • Every night the newest prediction for each upcoming match is saved. The last one saved before kick-off is the match's locked prediction, and only locked predictions are scored.
  • Postponed matches have their lock voided and get a new one before the new kick-off. A prediction found to be from after the actual kick-off is not counted. Nothing is back-dated.
  • Every lock records the exact version of the model that made it. Each line of the lock log carries a fingerprint of the line before it, so editing an old line shows.
  • Every night's files are published to a public, protected branch: strong evidence of when each prediction was made, not proof, since it rests on GitHub's records.

The scored results are on the track record page.

9. Source code and reference

All the code, the backtests and their write-up are public: github.com/umarjaved204/TableTalk.

Dixon, M. J. and Coles, S. G. (1997). Modelling Association Football Scores and Inefficiencies in the Football Betting Market. Journal of the Royal Statistical Society, Series C (Applied Statistics), 46(2), 265–280.