Over the last month I have been doing a lot of performance reviews of my football ratings. I wanted to prove that capping the value of an xG chance is a useful thing to do. I had this idea from a very early stage in my football analytics journey and today I want to share it.
Normal xG is initially designed as a descriptive measure. It uses different parameters about the shot to calculate the average chance of scoring each shooting attempt made on goal. My goal is to approach all this kind of analysis with a more predictive mindset. I am happy to discard any descriptive meaning for a metric that does a better job of telling us how well a team will perform tomorrow. What do the attempts on goal today mean for the ability of a team tomorrow? That is a different question to ‘what was the average numbers of goals a team would score from the shots today?’.
Firstly, today I want to look at adding values for goals to the xG metric. I speculate that adding real goals to the xG metric will improve the predictive performance. This is because I expect adding some value for real goals will capture some above/below average finishing ability or goalkeeping ability of the team. It may also be the case that goal difference diverging from expected goal difference is telling us that the assigned xG values were not representative of the real quality of the chances.
Afterwards I will consider the idea of capping large xG chances.
My xG metric uses 33 different zones and 7 different shot types. There will be more precise and complicated xG models out there but I’m not sure the precision is necessarily worth much predictive value. I have incorporated schedule adjustments, red card adjustments and lowered the value of rebound shots.
Why do I compare to betting odds?
To test the metric, I am comparing the metric to betting odds at kick off (thanks to Joseph Buchdahl for his footballdata.co.uk website). I am assuming that the global betting markets are quite efficient (at kick-off) and are a good way to test the metric performance. I have been doing similar analysis looking how xG predict goal difference (GD) as well, but it doesn’t feature today. I preferred comparisons to the betting odds as the sample size for GD drops as we go through the season, GD is more subject to variance and may be complicated by game state. I hope I will incorporate goal difference in the future to test predictive performance as it still has value. There’s a lot of permutations with which I can analyse this material today so I had to settle on one of these options otherwise this article would keep getting delayed!
This is using data from the 2021/22 & 2022/23 Premier Leagues, the 2023/24 Serie A and the 2023/24 La Liga. These leagues were randomly selected as I was having trouble with certain datasets.
Adding values for goals
My process for testing the metric performance against the betting odds is as follows:
- Calculate performance for each team for the season to that point
- Price up each game using said metric and home advantage
- Compare how favoured each team is vs. how favoured each team is according to the betting lines at kick-off
- Calculate the average difference between how the metric would price up each game vs. how the betting lines did

Figure 1
Each series in Figure 1 compares the predictive performance of the raw xG metric with the performance performance of the same xG metric with certain values added when goals are scored (as shown by the key). When the line drops below the x-axis into the green area, this means the added goal value is improving the performance of the rating and vice versa. Each series uses a 5-game rolling average.
When we add 0.25 xG for real goals (solid red line) we can see it damages the predictive performance of the team until we reach a sample size of 10 games. For sample sizes of larger than 15 games the graph shows that we learn more about the real ability of the team by adding 0.25 xG for every goal scored.
Adding 0.5 xG for goals (solid black line) hurts the metric more for early chances but then helps a little more for larger samples. As we are effectively adding 0.5 xG for every 1 xG scored this means this metric has a weight of 66% xG and 33% goals. I didn’t expect the uptick on the right side of the graph, but the most likely explanation is noise based on teams having different motivations in the late season.
Adding 1 xG (dotted black line) for every goal scored is clearly too much and even for larger samples the metric performs poorly compared to the previous smaller added values.
Overall I prefer working with the smaller added goal value of 0.25 xG. Larger goal values than this damaged the performance for small samples more than they help over larger samples.
Capping high value xG chances
Next, I want to consider capping the value of xG chances. In standard xG models, the highest possible xG value will be close to 1 as some shots are almost guaranteed to be a goal (e.g. shots attempted from very close to the goal line)
Large xG chances often feel too large to me, i.e. does a team deserve 6 times the credit for creating 1 0.6xG chance vs 1 0.1xG chance. Or similarly, should creating 6 0.1xG chances be worth more than creating 1 0.6xG chance?
Using similar methods to Figure 1 I set out to compare the performances of xG metrics with different caps.

Figure 2
Let’s consider how each cap affects the predictive performance of the metric. All these metrics are compared to a raw xG metric with no caps and no value added for goals.
The 0.1 xG cap is an extreme cap that removes a lot of shot quality information. Any more of a cap and we essentially be left with a simple raw shot ratio. As soon as the sample becomes a reasonable size this cap significantly damages the metric performance.
The 0.2 xG cap is more intriguing. We see a clear improvement in metric performance for smaller samples but for larger samples it performs poorly. If we are using a small sample of games to rate a team (e.g. the first 11 games or a team has been using a much changed line up for a small sample of games) then on average capping xG chances at 0.2 xG will give us a more accurate assessment of their performance.
0.3 xG and 0.5 xG caps see similar trends but with less extremes.
There is reasonable evidence from this graph that we don’t need to cap xG chances.
Capping the maximum allowed xG value and adding values for goals the same time
So far, I have looked at adding goal values and capping xG chances separately.
Next I want to consider if we could reach any different conclusions by capping xG chances and goal values at the same time.
I am going to use an xG metric that has an added value of 0.25 xG for goals.
The goal values are separate to the caps so you could argue the cap of a single chance is not really 0.25 xG (if an 0.25xG chance is scored it will be worth 0.50 xG in the metric).
Over the last few weeks, I have been comparing no xG caps with 0.25 xG added goal value against a 0.25 xG cap with 0.25 xG added goal value. The sample here stands at 11 leagues (I have attached the data at the bottom of the article).

Figure 3
Data from the 2023/24 Serie A and La Liga, the 2022/23 Premier League, and the 2025/26 Premier League, Bundesliga, Ligue 1, League 1, League 2, Bundesliga II and Championship are used for this graph.
This graph is a comparison between an xG metric with 0.25 xG added for goals scored and an xG metric with 0.25 xG added for goals scored and a maximum limit of 0.25 xG for any 1 chance. We can see a consistent improvement of around 3% for all the sample sizes pictured here. This is a different trend to when we capped xG chances in the absence of all added goal values (Figure 2). I think the two changes blend together well as goals helps improve the predictive power of the rating at larger samples while capping high xG chances helps at lower samples.
The average error for each game is a little under 0.2 goals. The capped xG metric is showing around a 3% improvement in prediction which is a little less than 0.01 goals per game. Not that high but this will amount to something significant over hundreds or thousands of games.
Conclusion
We saw today that weighting xG difference with real goals improved the performance of our metric. I think the best weight for goals in an xG metric is somewhere between 18-33% (between 0.18 xG and 0.50 xG added for each goal). The lower end of this (0.18 xG) will not hurt the performance of the metric for smaller samples while the higher end might be best for larger samples.
Next, we looked at limiting the maximum value that could be awarded to individual chances. When doing this we saw we improved the xG metric up to around 12 game samples but for larger samples we were better off just using full xG.
Finally, I combined the two ideas and capped xG chances for an xG metric that included value added for goals. This result in a solid improvement of the performance of the metric across a large spectrum of sample sizes.
I am planning plenty more work in this area, including some analysis with game state adjustments (I theorise that capped xG stands to benefit more from a game state adjustment than non-capped!).
If you enjoyed this piece today, please consider subscribing using the box on the top left on the home page syzygyanalytics.co.uk. Also if you want to contact me for any reason at all you can leave a comment or DM me at x.com/samh112358.
Thanks for reading!















