xgEdge

Method

How the model works

Every figure on this site comes out of the same short chain: shots become expected goals, expected goals become a rating for each club, two ratings become two scoring rates, and those two rates become a probability for every scoreline. What follows is that chain in order, with a worked example in the middle and its limits at the end.

What goes in

Shots, not results

The model never reads a scoreline. It reads shots — where each one was taken from and what kind of chance it was — and values them as expected goals. A club that lost 1-0 having created three good chances is a club that played well, and the table on every league page says so.

Each club is fitted over its last 20 matches in the competition it plays in. Older matches count for less, so a side that has turned its season around is not held to how it started.

Where the shot feed carries enough of a season, penalties are separated out: the non-penalty figures are used wherever at least 50% of a club's shots have been mapped. A penalty is a chance the run of play did not create, and counting it as one flatters whoever wins them.

The fit

One attack and one defence per club

A competition is fitted as a whole rather than club by club. Every club gets an attacking rating and a defensive rating, both centred on 1.0, and the competition gets a baseline — the goals an average side scores at home and away in it. A rating of 1.20 means twenty per cent more than that competition's average, not twenty per cent more than some universal standard.

Recent matches count for more, on a half-life of 107 days: a match that old counts half as much as one played today. That is what lets the fit follow a January signing or a change of manager without throwing away the autumn.

Because the baseline belongs to the competition, ratings do not travel. A 1.30 attack in the Eredivisie and a 1.30 attack in Serie A are two clubs each thirty per cent better than their own league, which are not the same club.

From ratings to probabilities

Two rates, then every scoreline

The home side's expected goals are its attack times the opposition's defence times the competition's home baseline; the away side's are the mirror of that. Two numbers, and everything else follows from them.

Those two rates go into a Poisson distribution over goals, which gives a probability for every scoreline — 0-0, 1-0, 2-1, and on up. A Dixon-Coles correction adjusts the low-scoring corner, because 0-0 and 1-1 happen rather more often than two independent Poissons expect and draws would otherwise be underpriced.

Every market on the site is a sum of cells in that grid. The chance of a home win is every cell where the home side scores more; over 2.5 goals is every cell totalling three or more. One object, read several ways — which is why the answers to a single market always come to exactly one hundred per cent.

Worked example

One match, all the way through

Two constructed sides, neither of them real, taken through every step above. Every figure here is computed as this page renders, by the same code that prices the board.

The fit

Attack Defence Baseline
Home 1.20 1.04 1.50
Away 0.80 0.90 1.25

Attack and defence are centred on 1.0. The baseline is what an average side in this competition scores from that side of the fixture.

Expected goals

Home 1.20 × 0.90 × 1.50 = 1.62
Away 0.80 × 1.04 × 1.25 = 1.04

Each side's attack against the other's defence, scaled by the competition's baseline. These two numbers are the whole of what the grid is built from.

Every scoreline

Every scoreline
Away 0 Away 1 Away 2 Away 3
Home 0 7.3% 5.2% 3.6% 1.0%
Home 1 9.0% 14.7% 6.8% 2.0%
Home 2 9.2% 11.3% 5.9% 1.7%
Home 3 4.8% 5.8% 3.1% 0.9%

The sixteen likeliest cells, holding 92% of the probability. The rest is a tail of higher scores, too thin to draw and too real to round away.

The likeliest single scoreline is 1-1 at 14.7% — which is not the likeliest result. Most of a match's probability is spread across scorelines nobody would name.

Read as markets

  • Home win 49.7%
  • Draw 28.9%
  • Away win 21.4%
  • Both teams to score 57.5%
  • Over 2.5 goals 51.0%
  • Home team to score 82.7%

Each figure is a sum of cells in the grid. The three results of the match come to 100%, because between them they cover it.

Against a bookmaker

Invented prices for the same three answers. Their implied probabilities add to 3.7% — the surplus over one hundred per cent is the margin, removed before anything below is judged.

Home win Worth playing
Model
49.7%
Odds
2.15
Implied
46.5%
Edge
+3.1%
Value
+6.7%
Draw Not worth it
Model
28.9%
Odds
3.40
Implied
29.4%
Edge
-0.5%
Value
-1.7%
Away win Stay away
Model
21.4%
Odds
3.60
Implied
27.8%
Edge
-6.3%
Value
-22.8%

Only Home win survives: the model makes it 49.7% against an implied 46.5%, which is +6.7% expected value. A Kelly stake on that edge would be 1.5% of a bankroll — and the same three probabilities against a different book would give three different verdicts, which is the whole point of the column.

Against the price

A probability is only worth what it is priced at

A probability on its own decides nothing. What matters is the price beside it: 80% at 1.20 loses money over time and 65% at 2.00 makes it, and only expected value separates the two. Expected value is the model's probability times the decimal odds, minus one — what a unit staked returns on average, over many bets rather than in any one of them.

Edge is the other number people quote, and it is not the same claim. Edge is how far the model's probability sits above the price's implied one; value is what the bet actually pays. A small edge at long odds pays more than a bigger edge at short ones, so everything here is ranked by value.

The bookmaker's implied probabilities add up to more than one — that surplus is the margin, and it is removed proportionally before the comparison is made, so the model is measured against a fair price rather than against the book's cut. Anything below 5% expected value is not treated as worth playing: on a 20-match sample the error on the estimate is larger than an edge that small.

The five verdicts

Every graded outcome falls into one of five bands, decided by expected value alone. A probability never sets a verdict here: the price is half the question.

  • Great value +15% and above The model sees far more value here than the bookmaker is asking for.
  • Worth playing +5% and above The edge is big enough to outweigh the model's own uncertainty.
  • Marginal +0% and above Positive, but inside the model's own error — not one to play.
  • Not worth it -10% and above The bookmaker is asking for more than the model gives.
  • Stay away below -10% The price is far worse than what the model sees.

What it is worth

Measured against always guessing the base rate

The model is scored market by market against the simplest honest alternative: always predicting how often the thing happens. If a competition's matches end over 2.5 goals half the time, always saying fifty per cent is the benchmark, and a model that cannot beat it knows nothing about that market that the season's average does not already say.

The measure is the Brier skill score. Zero is exactly as good as the base rate, positive is better, negative is worse. The figures below are small on purpose — football is mostly noise, and a model that claimed a large edge over the base rate would be describing its own overfitting.

Backtest

Skill by market, against the base rate

Beats the base rate

  • Away win +7.20%
  • Home win +7.19%
  • Home team to score +3.77%
  • Home team 2+ goals +3.62%
  • Away team 2+ goals +2.61%
  • Away team to score +2.56%

Does not

  • Over 1.5 goals -0.01%
  • Both teams to score -0.43%
  • Over 2.5 goals -0.89%
  • Draw -1.04%

Across every market and every graded outcome, the skill score is +2.50%. Small, and positive — which is what a real edge on football looks like.

Measured over 7 competitions to 17/08/2026, in-sample: the matches being scored are matches that helped fit the ratings. Treat these as an upper bound rather than as a forecast.

The figures

What a club and squad page are printing

Eleven terms carry every number a club's expected-goals page and its squad page print. Each of them is one line there, two in its tooltip and this at length — one explanation read at three lengths rather than three explanations.

xG, xGA and xG difference

Expected goals is what a chance was worth before anybody struck it. Every shot is valued from where it was taken and what kind of chance it was, against what happened to thousands of shots like it, and a side's xG for a match is those values added up. A shot worth 0.30 is one that goes in about three times in ten; a side that built 2.10 xG made the sort of afternoon that usually ends in two goals.

Expected goals against is the identical sum over the chances a side was allowed. xG difference is the first minus the second, and it is the one figure here that a whole competition averages to zero on, because every chance one club creates is a chance another conceded.

None of the three is a forecast and none of them is a scoreline. They describe the chances, which is the part of a match that repeats itself.

npxG, and why penalties come out

A penalty is worth about three quarters of a goal wherever and whenever it is taken, and it is not a chance the run of play created. A handful of them inside a short season moves a club's xG by several goals without saying anything about how it plays.

So the non-penalty figures stand beside the totals: npxG is a side's expected goals with penalty attempts removed, npxGA the same for what it conceded. The trend lines and the chance-quality figures are non-penalty for that reason. The totals elsewhere are not, because a penalty is still a goal when it goes in.

Per match, and which matches

Clubs in one competition have played different numbers of matches for most of a season, so every comparative figure on a club page is a rate rather than a total. The total is still printed under it, because a total is what a reader cites.

The divisor is matches with xG, not matches played. A provider publishes a result before it publishes the shots behind it, and counting that match in the denominator would read a missing figure as a goalless afternoon. Where the two counts differ the page says so, and both sides of every actual-against-expected gap are summed over the same matched set.

A rate over fewer than 3 matches is not ranked at all. First place on two afternoons is not first place.

xPts

Expected points takes a played match's two xG totals as scoring rates and reads the same grid of scorelines every market on this site is read from. The win and draw probabilities that fall out give the side 3 × P(win) + 1 × P(draw), and its season figure is that summed over its matches with xG.

It answers one question: what would this set of performances usually be worth. It is model output rather than a record of anything, which is why it is the only figure on a club page wearing a mark, and why the points the club actually has are printed beside it every time.

Verdict bands

A gap between what happened and what the chances called for is not a finding on its own. Goals are rare enough that a season of identical performances would produce a different gap each time, so each gap is measured against the spread chance alone would put on it: about the square root of the expected figure for goals, and each match's own win and draw probabilities for points.

A club page says which way the gap went and then, separately, how unusual that is: inside one spread is within normal variance, one to two spreads outside it, beyond two far outside it. The two are printed apart because they answer different questions — a gap can be real, in the club's favour, and still well inside what chance produces. Below 5 matches with xG there is no reading at all, only the figures.

The bands are themselves a model, and a modest one: they assume goals land around xG on a Poisson and that one match's outcome is independent of the next. They are here to stop a small sample producing a confident sentence, not to put a probability on what happens next.

Results and chance comparisons

Results keep the actual win, draw or loss separate from an interpretation of provider xG. Every score and xG pair is shown from the selected team's perspective, including away matches. Total xG includes penalties during play; shootout goals must not be added to it or to the normal score.

A match has a positive chance difference at xGD ≥ +0.25, a negative difference at xGD ≤ −0.25, and approximately even chances strictly between those limits. Classification uses the unrounded difference, although figures display two decimals. These editorial bands are not significance tests and do not prove fairness, dominance or team strength. The xG ledger's stronger opposite-result marker uses an absolute xGD of at least 1.00; it marks a subset of these comparisons.

Missing or invalid xG never means zero or even chances. Comparative labels require a reviewed provider, competition, season and period contract. Scores and xG with unverified period coverage remain recorded information, without a chance interpretation. Extra-time, shootout and neutral-venue details cannot be inferred from the stored totals. Home and away refer to the provider-designated sides.

The current review covers the 2026 season of every competition with full coverage, for kickoffs through 24 September 2026 UTC, and the Premier League, La Liga and Serie A 2025 seasons. A competition that splits into groups or goes to playoffs is reviewed only up to the split: its later matches use points and xPts equivalents without a chance comparison until a review extends it. Other coverage remains unverified. The 2025 Bundesliga and Ligue 1 feeds include extra-time or shootout fixtures and are not enabled as whole seasons. Results can therefore have fewer comparable matches than the Team xG page; no missing value is filled to make totals agree.

Chances totals use only selected matches with complete, finite, nonnegative xG and verified compatible regulation-time scores and xG. Points vs xPts narrows that set again to valid model outputs between 0 and 3: both actual points and xPts use exactly those same matches. The full results record keeps every selected valid played match, even when xG or xPts is missing. Coverage shows each denominator; fewer than five comparable matches is a small descriptive sample. A model failure does not remove valid xG or its classification.

Post-match xPts reuses the application's ExpectedPoints calculation: 3 × win probability + draw probability from the played match's provider xG. Its score matrix uses binomial goal marginals with measured shot quality 0.328 and rho 0, truncates at 10 goals per side, then normalizes. It is neither a pre-match forecast nor a shot-by-shot simulation. Results uses the same arithmetic as Team xG on the same eligible match, but its stricter period policy can give different coverage and totals.

Match points are 3 for a win, 1 for a draw and 0 for a loss, before deductions or sanctions. Cup, mixed or unverified scoring formats use points and xPts equivalents; they do not describe standings points or qualification. Goals and points are integers. Provider xG is an estimate; xGD, totals and gaps are derived arithmetic; xPts is application-model output.

Sums and differences use unrounded values; figures display two decimals, with negative zero shown as 0.00. A displayed total can differ from the sum of rounded rows, and a rounded gap can differ from the difference of displayed components by 0.01. Genuine zero xG and xPts remain numbers; unavailable values are never substituted with zero.

Highest and lowest xGD use only the selected comparable results, with at least five required. Both links disappear when the extremes round to the same displayed value. Ranking uses unrounded xGD; exact ties show the latest kickoff, then greatest fixture ID, and state how many share the value. “Before rounding” means another distinct value displays the same xGD. Lowest describes this selection only and may still be positive.

The form window

Form on this site is one definition in one place: non-penalty expected goal difference per match over a club's last 6 matches with xG. The stored form column, the competition's form table and the rolling lines on a club's trend chart are all that same figure, so no page can show three competing accounts of one word.

Before 6 matches have been played the lines are the average of everything so far, drawn lighter. An average of two matches drawn as a trend is a trend invented out of two matches.

Shots and chance quality

Expected goals comes apart into how many chances a side takes and how good each one is. Shots per match is the first, non-penalty xG per shot the second, and the pair says whether an attack is built on volume, on quality, or on neither — two clubs on the same xG can be doing entirely different things.

Both divide over the matches carrying a shot count and xG together, which in some competitions is fewer than the matches with xG; the page says when. The shot count includes penalty attempts while the figure above it excludes penalty xG, which biases the quality figure down by under one per cent and is the honest arithmetic available from what the providers publish.

Under the four figures sits the shot profile, which describes a style rather than ranking a merit. Shots inside the box is the share of a side's attempts taken inside the penalty area, from the provider's own per-match counts of shots inside and outside it, penalty attempts included. The location flag on each stored shot is not used for it: shots are stored only in the competitions where they are bought, while the match counts cover every competition on the site, so every club is measured from one source.

Open play and set pieces splits non-penalty xG by the situation each shot came from. Set pieces are corners, free kicks, set-piece throw-ins and other set pieces; open play is shots in the run of play, from a pass or without one, and fast breaks. Penalties, own goals, shots without an xG value and shots whose situation is missing or not one of those count in neither half. It is a share of npxG rather than of shots because ten hopeful headers from corners are not worth ten tap-ins, and the question is how much of the danger each route makes. It needs the stored shots, so it appears only in the competitions whose shots are bought; a club in any other has no row rather than a zero.

A reading is printed once it covers at least 3 of the club's matches with xG, and at least 60% of them. Below 10 covered matches it carries an early-season note, and below every match it says how many it covers. Where a competition is still buying its shots and the club is below that share, the page says the figure is coming rather than printing a share of the season's first weeks.

The league average marked on each bar is pooled: the qualifying clubs' inside-box shots over all their shots, or their set-piece npxG over all their npxG, the club itself included — not an average of their percentages, so a club with twice the shots weighs twice. It is printed only when at least 6 clubs qualify.

A player's season figures

On a squad page, appearances, starts, minutes, goals and assists are the provider's own season line for one competition. Expected goals, expected assists and non-penalty expected goals are summed here out of its per-match feed, over that club's fixtures in that competition — so both halves of any figure that adds two of them come from one place, and a cup run is in neither.

A player who changes club inside the same league keeps one line, filed under the club the provider names. One who leaves the league mid-season stops being refreshed and stands at the figure he left on.

A player's own page counts differently, and on purpose: there the appearances, minutes, goals and assists are summed from the per-match feed too, wherever it holds a match he played in that competition-season, so that every count sits on the same feed and the same day as the chances it is set against. The season line is bought a few times a season and the per-match feed is refreshed nightly, so the two can part for a round or two — his page says by how much when they do.

Expected goal involvement, and its share

Expected goal involvement is a player's expected goals and expected assists added together. It needs both halves: a player the feed measured for one and not the other carries no involvement rather than half of one.

His share is that involvement over the involvement measured across his whole squad — every player with both halves, including players who have since left, and excluding players the feed holds no figures for. It does not reconcile with the club's own expected goals, and is not meant to: those count every shot the club took, including shots by players the feed missed, and expected assists are no part of them at all.

Per-90 rates and the minutes floor

A rate per ninety minutes is the figure divided by the minutes played and multiplied by ninety. Over a small number of minutes it stops being a rate — one chance in twenty minutes reads as a season of four and a half goals — so a squad table hides its per-90 figures below a minimum-minutes setting, which opens at 270 minutes and can be moved or turned off.

The floor empties those cells and removes nobody: a squad with its substitutes taken out of it is not a squad, and a figure that cannot be quoted honestly is better shown as a dash than as a number.

Fixture difficulty

How hard a fixture is, and what the five bands mean

Every fixture gets a band from 1 to 5, easiest first, from the side of the club whose page you are on. The band is cut from one figure: the model's chance of that club winning the match minus its chance of losing it, in percentage points. The draw is in it by what it leaves out: a match the model thinks will often be drawn has less between the two decisive results.

The chances come from the same model as every other projection on the site. Each club's attack and defence are fitted from its last 20 matches, newest counting most; the two clubs' ratings and the competition's average scoring at home and away give each side's projected goals; and a grid over every scoreline turns those into a win, a draw and a loss. A home side projected to win 2.05 to 1.20, for example, comes out at 56% win, 24% draw and 19% loss, so its figure is +37 and its opponent's is −37.

Venue is part of it. A club is more likely to win at home, so the same two clubs make a kinder fixture for the home side. With the venue swapped, the pair in that example comes out close to level.

The bands. Very favourable, +50 or more: the model makes a win much more likely than a loss. Favourable, +20 to +50: the model favours this team, but the matchup remains competitive. Balanced, within 20 either way: neither side has a large modelled advantage. Difficult, −20 to −50: the model favours the opponent. Very difficult, −50 or less: the model makes a loss much more likely than a win.

Balanced does not mean a coin toss. A fixture in it can lean a few points one way, and two comparable sides with the usual home advantage land there. The inner cut is at 20 because, replayed over matches already played with the chances stored before kickoff, fixtures below it came out alike, with about a ten-point lean. Above it, the favoured side won clearly more often than it lost.

The cuts are the same in every competition, and that is the reason the scale is cut on chances rather than on goals. Half a goal decides more in a league that averages two and a quarter goals a match than in one that averages three and a half, so a margin in goals would call far more fixtures very favourable in a high-scoring league. A difference in chances means the same thing everywhere.

Hover any badge to see the three chances it was cut from. Beside every band are the opponent's attack and defence on the 1–99 scale, where 50 is the competition's average side. A fixture in another competition gets no band, because the ratings are fitted inside one competition, and a fixture the model has not priced yet says so rather than showing a guess.

A run's difficulty is the mean of its bands, over the fixtures that have one. The fantasy pages use the same bands for their fixture grids and tickers, so a 2 there means what a 2 means on a club page.

Strength of schedule

How strong a club's opponents have been, and will be

A club's strength as an opponent is its fitted margin: the competition's average expected goals a match times the club's attack rating minus its defence rating. That is the non-penalty xG it would create minus the xG it would concede against an average side at a neutral ground. The fit has already allowed for who every club has played, so nothing is adjusted twice.

The margins are centred on the competition's rated clubs, so 0.00 is the league-average opponent. A positive figure is a stronger opponent than average, and so a harder schedule; a negative one is a weaker opponent. Every figure is printed to two decimals with its sign.

A schedule is the mean of its opponents' strengths, one per fixture, so a club met twice counts twice. An opponent the model has not rated is listed and left out of the mean rather than counted as nought, because nought would claim it is exactly average. Where that happens, the sample says how many of the fixtures were against a rated opponent.

Faced is every league match played this season, whether or not it carries xG. Last 5 is the newest 5 of those, and Next 5 is the first 5 league fixtures still scheduled, soonest first. Void matches, other competitions and scheduled fixtures whose kickoff has passed are in no window.

Home and away do not change an opponent's strength. The fit carries home advantage in two constants shared by the whole competition, so adding it would move each window by its mix of home and away matches and measure the calendar rather than the opponents.

Every opponent is valued at its current rating. There are no snapshots, so a schedule already played is revalued as ratings move: a side that has improved since it played a club makes that match read harder today. The figure is how strong the opponents are now, not how strong they were on the day.

Ranks run hardest first, and clubs level at two decimals share a place, shown as “=3”. Faced is ranked once the median club has played 3 league matches, and a club needs matches against rated opponents numbering at least 75% of the median, never fewer than 3. Last 5 and Next 5 rank only a full run: 5 fixtures, every one against a rated opponent. A club with three still scheduled has a figure over three and no rank, because ranking it against runs of 5 would rank the calendar's reach. No window is ranked at all unless at least 6 clubs qualify.

In a round-robin league Faced bunches together as the season goes on. By the middle of it most clubs have met most of the others, so the spread narrows, and once every club has played every other equally often, a club's Faced is close to a mirror of its own strength: the strongest club has had the easiest schedule, because it is the one strong side it never plays. Faced says most early and in mid-season; Last 5 and Next 5 keep their spread all year.

A club with few matches in the fit, usually a promoted side early in the season, is shrunk towards average: its ratings are blended with 5 matches' worth of an average side. So its strength as an opponent starts near 0.00 and moves out as its own matches arrive.

Every figure is relative to one competition. The ratings are fitted inside it and centred on its own clubs, so +0.20 in the Eredivisie and +0.20 in Serie A are each a fifth of an xG a match above their own league's average opponent, not the same opponent. Schedules are never ranked across competitions.

Goals vs xG

Who is scoring above and below their chances, and how the lists are drawn

xG values every shot by how often chances like it are scored, and a player's or a club's xG is those values added up. Goals vs xG sets the goals beside them: the gap is goals minus xG, so +3.80 means 3.80 more goals than chances like those usually produce, and −3.80 as many fewer. Players are shown in two measures: npG − npxG, non-penalty goals against the xG of every shot that was not a penalty, and G − xG, every goal against every shot.

Players open on the non-penalty measure. A penalty is awarded rather than created, it is worth about three quarters of a goal wherever it is taken, and whoever takes a club's penalties would otherwise carry a figure made on the spot. It is also the measure League › Players › Finishing ranks on, so the two pages give the same answer. The All goals pill switches the list to G − xG, the figure the player page prints. Clubs are shown in G − xG only, penalties included.

A player is listed with 450 minutes or more and at least 2.0 xG in the measure shown: npxG under Non-penalty, xG under All goals. A club is listed once it has played 8 matches, with xG on at least 90% of them. Either way the gap has to be at least 1.0 goals, on its own side: a smaller gap is in line with the chances and is on neither list. Below a floor there is no row and no place, rather than a row printed from too little.

A competition's players join the list once its median club has played 6 matches this season. Before that, minutes and xG are spread too thin for a gap to say much, and the coverage panel names the competition as one whose lists open after 6 matches. Each competition contributes its current season, the one its league pages open on, so a calendar-year league and a split-year one sit on the same list.

Above xG puts the largest gap above xG first and Below xG the largest gap below it, each on the gap rounded to 2 decimals, and equal rounded gaps share a place. A place is taken against the list on screen, with its side, measure and competition, so #3 is the third-largest gap on that list: a distance from the chances, not a grade. Colour marks a gap of 2.0 goals or more, and never in red.

Last 5 is context and nothing else: never ranked, never sorted on and never a floor. For a player it is their last 5 appearances in the row's competition this season, a substitute's minute counting as a match, in the measure shown. For a club it is its last 5 league matches with xG. Fewer than 5, or any of them without xG, prints a dash rather than a shorter window under the same heading.

An own goal counts in the club's goals, because it is on the scoreboard, and in no player's figures. The shot it came from is added to nobody's xG, npxG or penalties: it was not a chance the player who turned it in was trying to take.

A missing figure is left out, never read as nought. A player with goals and no xG is not listed, and a club's matches without xG come out of both its goals and its xG, with a marker saying how many. The players list draws on the competitions whose season carries the full per-match player feed, and the non-penalty measure only on those whose shot feed marks penalties. A competition with club figures and no player feed is on the teams list only. The coverage panel under each list names every competition and which of these it is.

A gap describes the season so far; it is not a forecast. It says how far the goals have run from the chances behind them, and nothing about whether the two will stay apart or come back together. xG values a chance without knowing who took it, so a gap holds everything the model does not measure — the shooter, the goalkeeper and the ordinary spread of a few dozen shots — and the list is printed beside the chances rather than instead of them.

The lists are rebuilt once a day, after the overnight ingest has settled the day's matches, and the key line gives the latest kickoff they include. A correction to a stored match reaches the list on the next rebuild; a late correction from the provider arrives only when the match is fetched again.

Limits

What none of this can see

  • Absences, cards and rotation — xG measures what happened, not who is playing on Sunday.
  • Motivation, the pitch, the weather and the schedule (a midweek European tie, say).
  • Different xG models produce different numbers; the bookmaker may be reading another.
  • Newly promoted sides with no history in the league.
  • The backtest below is measured in-sample: it is scored over the same matches they were fitted from, so the real figures are lower than the ones printed.
  • Every price in the worked example is invented, and the match it prices does not exist.