Methodology

Methodology

Every probability on this site comes out of one pipeline, run twice a day. Here it is end to end — including the parts that decide what it cannot know.

How we turn a match into probabilities

Four steps, always in this order. No fixture gets a hand-typed override at any point — a person does not replace the model’s number with their own.

  1. The form window

    For every club, we start with its last 15 finished matches, with the newest match first. Older matches count a little less each time, by about a tenth at each step back. If expected-goals records cover at least 60% of that weight, the window uses expected goals. If not, it uses the goals the team scored and conceded. After that, both numbers are moved part of the way back toward the competition’s scoring average. That keeps a club with only a small record nearer to average, because a short record is thin evidence and the model should show that.

  2. The scoreline grid

    Those attack and defence ratings are converted into an expected-goal rate for each side. The two rates are then put through a Dixon-Coles adjusted Poisson model — Poisson estimates goal counts, while the adjustment deals with the four low-score cells (0-0, 1-0, 0-1, 1-1), where real matches do not line up well with plain Poisson. The result is not a tip. It is a probability for every scoreline from 0-0 to 10-10: 121 cells, adding up to one.

  3. Markets are taken from the grid

    For 1X2, we add the cells where the home team is ahead, the cells where the away team is ahead, and the cells where the scores are level. Over/under 2.5 comes from adding every cell with three goals or more. Both teams to score adds the cells where both scores are above zero. A correct score is just one cell. The other markets shown on the site — double chance, draw, handicap and the goals ladder — are all calculated from the same 121 cells. That is why the markets are kept consistent with each other.

  4. The market has a say — only on 1X2

    When bookmaker prices are recorded for a fixture, we take the median price for each of the three 1X2 selections across every book that quotes the full market. That means the market side is the market as a whole, not one book’s view. We then remove the margin by inverting each price and rescaling the three numbers so they add up to one, before blending that with our number: 25% our model, 75% the market. That split is intentional and modest about the model. A liquid market carries money and information, so our number is used more as a lens on the price than as a replacement for it. This blend is used for 1X2 only. Over/under, both teams to score and correct score are published exactly as the model produced them, with no market number added.

How to read the A, B and C grades

Each prediction has a letter. The letter judges the strength of the evidence, not whether the pick will land.

Grade A

Both teams have expected-goals records supporting their form windows. This is the best input available to the model.

Grade B

One team’s rating is supported by expected goals, while the other team is rated using goals only.

Grade C

Neither team has that expected-goals support. The probability is still calculated and published, but the claim is weaker, so the letter is shown instead of being hidden.

A grade C match is not one we expect to be wrong. It means the number is based on goals rather than the chances behind those goals, so an upset should feel less surprising. Where fixtures are ranked against each other — on value bets — A and B sit above C for that exact reason.

What this process leaves out

The clear limits. Everything listed here is absent by choice, not waiting to be added.

  • It does not read team news. Ratings come from results, expected goals and prices. If the data feed provides a confirmed line-up or an absence, the match page displays it — but that information does not change any probability on the page.
  • It does not track live play. Every number is a pre-match number, worked out on the final run before kick-off.
  • It does not model a whole season. You will not find title odds, promotion odds or relegation odds here, because we do not run the simulation needed to create them.
  • It struggles most with clubs that have a short record — for example, a promoted team early in a season, or a squad rebuilt in one window. The form window needs time to fill before the rating says much, and the grade shows when that has not happened.
  • It is not a tip. A probability of 62% means this happens about six times in ten, and that still includes the four times it does not happen.

Run times and page lifetime

The pipeline runs twice a day. Fixtures, results and price snapshots are pulled in, ratings are rebuilt, and any page with changed numbers is written again. The timestamp in each page footer shows when that page was last built.

A fixture receives its own page no more than 7 days before kick-off for a league match (21 for a cup tie, 60 for a national-team game, and as soon as the draw is made for a tournament). It stays there for 14 days after the final whistle, then leaves the site. That is why an old match link may stop working, and why the live-page list on our index can change from one run to the next.

Competitions covered here

The competitions included in this run.

Competitions hub

Choosing depth over breadth is intentional. The model needs a couple of seasons with the same teams playing each other before its ratings have real meaning, and any competition we add would also need its calibration published.

Read this next

Our accuracy page gives the figures behind everything above: how the model performed across five leagues and three seasons, where it missed, and why anyone claiming 99% accuracy is not being straight with you. The full equations are on the mathematics page.