Player Form Trends Using Moving Averages and xG
Ever watched a striker score a hat-trick one week, then go completely silent for three games, and wondered if they're actually in "good form" or just riding a hot streak? That's the problem with raw match-by-match data—it's noisy, emotional, and deceiving. You need a filter to separate real performance trends from random noise. That filter is the moving average, paired with Expected Goals (xG).
This checklist will walk you through how to build, interpret, and apply moving averages to xG data to track player form trends. No insider tips, no guarantees—just publicly available stats and a systematic approach.
What You’ll Need
Before diving in, gather these tools:
- Public data sources: FBref, Understat, or WhoScored for match-by-match xG per player. Transfermarkt for context like contract expiry or market value shifts.
- Spreadsheet or coding environment: Google Sheets, Excel, Python, or R. Even a pen and paper work for small samples.
- A player in mind: Pick someone with at least 8–10 appearances in a season. Fewer games make moving averages unreliable.
Step 1: Collect Match-by-Match xG Data
Raw xG per game is your foundation. For each match, record:
- Player name
- Match date
- xG (total from open play, set pieces, penalties—keep them separate if possible)
- Minutes played (crucial for per-90 normalization)
- Opponent and venue (home/away)
| Match Date | Opponent | Minutes | xG |
|---|---|---|---|
| 2024-08-17 | Arsenal | 90 | 0.45 |
| 2024-08-24 | Chelsea | 82 | 0.12 |
| 2024-09-01 | Man City | 90 | 0.78 |
Why minutes matter: A player who gets 15 minutes off the bench and records 0.05 xG isn't in "bad form"—they just didn't play. Always normalize to per 90 minutes for fair comparisons.
Step 2: Choose Your Moving Average Window
The moving average smooths out individual game fluctuations. The window length determines how sensitive your trend line is:
- 3-game moving average: Very responsive. Catches hot streaks quickly but also overreacts to one bad game.
- 5-game moving average: Standard for form analysis. Balances responsiveness with reliability.
- 10-game moving average: Long-term trend. Useful for identifying sustained dips or rises, but lags behind recent performances.
Formula (in spreadsheet terms): `=AVERAGE(range of last 5 xG per90 values)`
Step 3: Calculate xG per 90 Before Averaging
Never average raw xG across games with different minutes. Normalize first:
xG per 90 = (xG / Minutes played) × 90
Now your moving average is based on consistent rate, not raw accumulation. A player who plays 60 minutes and gets 0.3 xG has the same per-90 rate (0.45) as someone who plays 90 minutes with 0.45 xG.
Example calculation for a midfielder:
| Match | Minutes | xG | xG per 90 |
|---|---|---|---|
| Game 1 | 90 | 0.20 | 0.20 |
| Game 2 | 75 | 0.15 | 0.18 |
| Game 3 | 90 | 0.35 | 0.35 |
| Game 4 | 65 | 0.10 | 0.14 |
| Game 5 | 90 | 0.25 | 0.25 |
5-game moving average: (0.20 + 0.18 + 0.35 + 0.14 + 0.25) / 5 = 0.224 xG per 90
Step 4: Add a Baseline for Context
A moving average alone tells you if a player is trending up or down, but not whether those numbers are good. You need a benchmark:
- League average xG per 90 for the position: For a Premier League striker, that's roughly 0.35–0.45 xG per 90. For a central midfielder, it's closer to 0.08–0.12.
- Player's own season average: Compare the moving average to their full-season xG per 90. If their 5-game moving average is 0.30 but their season average is 0.45, they're underperforming their baseline.
- Positional peers: Use FBref's percentile rankings to see where the player stands relative to others in the same league and position.
Step 5: Interpret the Trend—Not Just the Number
A moving average of 0.40 xG per 90 over 5 games could mean:
- Consistent finisher: 0.40, 0.42, 0.38, 0.41, 0.39—steady, reliable form.
- Hot streak from low base: 0.10, 0.15, 0.50, 0.55, 0.60—recent surge, but check if it's sustainable (e.g., penalties, tap-ins, or long shots).
- Declining from high base: 0.60, 0.55, 0.35, 0.30, 0.25—a player who started strong but is fading.
- Sustained rise over 3+ windows: Genuine form improvement.
- Single spike: Could be a penalty or a lucky deflection. Don't overreact.
- Plateau above or below baseline: The player has settled into a new performance level.
Step 6: Compare xG Moving Average to Actual Goals
This is where the analysis gets actionable. Plot both the xG moving average and the actual goals moving average on the same chart. The gap between them is the "finishing variance."
Interpretation scenarios:
| xG MA | Goals MA | Gap | Interpretation |
|---|---|---|---|
| 0.40 | 0.50 | +0.10 | Overperforming xG. Likely unsustainable unless player is elite finisher. |
| 0.40 | 0.30 | -0.10 | Underperforming xG. Could be bad luck or poor finishing. |
| 0.40 | 0.40 | 0.00 | Perfect efficiency. Rare and usually reverts to mean. |
Practical use: If a player's xG moving average is rising but goals are stagnant, expect regression to the upside. If xG is dropping but goals remain high, brace for a scoring drought.
Step 7: Add Contextual Filters
Not all xG is created equal. Layer these filters onto your moving average:
- Shot type breakdown: Separate open-play xG from set-piece xG. A striker relying on penalties for their xG moving average is less sustainable.
- Shot location: Use FBref's shot maps (or similar) to see if chances are coming from high-danger areas (six-yard box) or low-percentage zones (outside the box). A moving average built on long shots is less reliable.
- Defensive pressure: Some sources provide "xG assisted" or "key passes." A player whose xG is dropping because they're receiving fewer quality passes might be suffering from team form, not personal decline.
Step 8: Visualize the Trend
A table of numbers is useful, but a chart tells the story instantly. Create a line chart with:
- X-axis: Match date or game number
- Y-axis: xG per 90
- Line 1: Raw xG per 90 (noisy, but shows individual games)
- Line 2: 5-game moving average (smoothed trend)
- Line 3: Season average baseline (horizontal line)
- Crossing above the baseline: Player entering a hot streak.
- Crossing below the baseline: Player in a slump.
- Narrowing gap between raw and moving average: Volatility decreasing; form stabilizing.
- Widening gap: Inconsistent performances—boom-or-bust pattern.
Step 9: Apply the Analysis
Once you have your moving average trend, here's how to use it:
- For scouting: A player whose xG moving average has been rising over 10+ games might be undervalued by Transfermarkt or the market. Check their contract expiry and release clause for context.
- For fantasy football: Pick players whose xG moving average is trending up but whose goals haven't caught up yet—they're due for a scoring burst.
- For betting: A striker with a rising xG moving average but low goals might see their odds shorten as bookmakers adjust. Don't bet on guaranteed outcomes, but use the trend to inform your own expectations.
Step 10: Review and Refine
After a few weeks, revisit your analysis:
- Did the moving average predict the subsequent performance?
- Were there false signals (e.g., a spike from a penalty that wasn't sustainable)?
- Did contextual factors (opponent strength, formation changes, minutes fluctuation) explain deviations?
- For players with erratic minutes, use a weighted moving average (more weight on recent games with more minutes).
- For defenders, consider xG against or defensive actions per 90 instead of xG.
- For goalkeepers, use post-shot xG (PSxG) minus goals allowed for a form metric.
Quick Recap Checklist
- Collect match-by-match xG and minutes from public sources (FBref, Understat)
- Normalize to xG per 90
- Choose a moving average window (5-game recommended)
- Calculate moving average for each match
- Add baseline (league positional average or player's season average)
- Compare xG moving average to actual goals moving average
- Filter by shot type, location, and team context
- Visualize the trend on a line chart
- Apply insights (scouting, fantasy, betting awareness)
- Review and refine over time
Final thought: Moving averages don't guarantee future goals. They don't predict exact scores or sure wins. What they do is give you a cleaner lens to see through the noise of individual games. Use them as one tool in your analytical toolkit—alongside xG per shot, shot maps, and team pressing intensity (PPDA)—to build a fuller picture of player form. The numbers don't make decisions for you; they just make your decisions more informed.
Remember: All statistics are publicly available. No insider information, no guarantees. Bet responsibly and never wager more than you can afford to lose.
