Abstract
Expected goals (xG) scores the quality of every shot a team takes, but the way most tables aggregate it - a flat average over a season - quietly assumes a team is the same in August as it is in April. It is not. Squads change, tactics shift, and injuries land. rxG is the proprietary rolling expected goals metric developed by In Play Radar: it replaces the flat average with an exponentially weighted window that leans on recent matches and lets old ones fade. The result is a single, continuously updating estimate of how good a team is at creating and conceding chances right now.
This note walks through the math behind the metric, from the per-shot model up to the rolling estimator, shows where it diverges from season xG, and explains how In Play Radar's rxG modelleme turns that output into a live match model.
From shots to expected goals
A single shot's xG is the probability it becomes a goal, estimated from features known at the moment of the strike: distance, angle, body part, assist type, and the phase of play. A shot from the penalty spot might carry xG = 0.76; a speculative effort from thirty yards, xG = 0.03.
A team's expected goals for a single match is just the sum across its shots:
Aggregating that across a season gives a stable, descriptive number. The problem is purely one of weighting: a flat season average treats a match from nine months ago as exactly as informative as last weekend's. For prediction, that is the wrong assumption.
The rolling decay window
The fix is to weight each past match by its recency. Instead of a hard cutoff (“last 6 games”), rxG uses an exponential decay: every match further back contributes a little less than the one after it, with weights tapering smoothly toward zero. A match k games ago gets weight:
Here λ (lambda) is the decay factor. A value near 1 forgets slowly and behaves almost like a season average; a smaller value forgets fast and tracks short-term form. The chart in section 04 shows the shape of these weights.
Defining rxG formally
Put the per-match xG and the decay weights together and rxG is a weighted mean of a team's recent match xG values. With x_k the xG from the match k games ago:
The denominator normalises the weights so the output stays on the same scale as raw xG - it reads as “goals per match,” not an arbitrary index. Two teams with identical season totals can carry very different rxG values if one is trending up and the other is fading.
In practice the proprietary estimator runs twice per team: rxG-for (attack) and rxG-against (defence, built from chances conceded). The pair is the team's current attacking and defensive strength, and it is the backbone of In Play Radar's expected goals analysis.
Season xG vs. rxG
The difference is easiest to see over a run of matches. Season xG is a flat line - it only moves a little as the denominator grows. rxG breathes with results: it climbs through a hot streak and drops through a cold one, because recent matches dominate the weighted mean.
Over the stretch above, the two series agree on the team's average level but disagree sharply on its current level. A model that has to predict the next match cares about the second.
A worked example
Take six recent matches and a decay factor λ = 0.794 (a six-match half-life - see section 06). Each match's xG is weighted, summed, and divided by the total weight.
| k | Match | xG | Weight | xG × w |
|---|---|---|---|---|
| 0 | Last match | 2.40 | 1.000 | 2.400 |
| 1 | 2 games ago | 1.85 | 0.794 | 1.469 |
| 2 | 3 games ago | 0.95 | 0.630 | 0.598 |
| 3 | 4 games ago | 1.60 | 0.500 | 0.800 |
| 4 | 5 games ago | 1.10 | 0.397 | 0.437 |
| 5 | 6 games ago | 0.70 | 0.315 | 0.220 |
| Totals | 3.636 | 5.498 | ||
Dividing the weighted xG by the total weight gives 5.498 / 3.636 = 1.51 rxG. The flat six-match average is 1.43. The two strong recent games pull the rolling estimate above the plain mean - the team is rated as creating about 1.51 quality goals per match at this moment.
Calibration & half-life
The only real tuning knob is λ, and it is more intuitive to think in terms of half-life: the number of matches after which a result's weight has halved. The two are linked by:
A short half-life (2 - 3 matches) makes rxG twitchy and reactive - good for spotting a sudden tactical change, bad for noise. A long half-life (10+) is stable but slow. In football, a half-life of roughly five to eight matches tends to maximise out-of-sample predictive power; it is short enough to register a change of manager, long enough to ride out one freak scoreline.
The factor is fit by optimising predictive accuracy: pick the λ whose rxG values minimise log-loss against actual results on held-out matches, not by hand.
Application in match modeling
rxG is rarely the final product - it is the clean, proprietary input the rest of In Play Radar's statistical football model is built on. A few of the places it lands:
Match outcome odds
rxG-for and rxG-against feed a bivariate Poisson model that turns two strength numbers into win / draw / loss probabilities and a full scoreline grid.
Form detection
The gap between rxG and season xG is itself a signal - a widening positive gap flags a team improving faster than the league table has caught up to.
Live in-play shifts
Because rxG updates after every match, pre-game strengths can be carried straight into in-play models and nudged as chances accumulate.
Mispricing checks
Comparing a model's rxG-derived probabilities against the market surfaces matches where the price disagrees with the underlying chance quality.
See it live
rxG, running on real matches
In Play Radar applies its proprietary rolling expected goals metric to live and upcoming fixtures - turning the math on this page into form-aware ratings and probabilities you can read at a glance. The full rxG modelleme breakdown shows how the metric drives each strategy.