Player Form Trends Using Moving Averages and xG

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)
Example snippet for a Premier League striker:

Match DateOpponentMinutesxG
2024-08-17Arsenal900.45
2024-08-24Chelsea820.12
2024-09-01Man City900.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.
Recommendation: Start with a 5-game window. It's the sweet spot for most forward, midfielder, and defender roles. For goalkeepers, consider 8–10 games because save-based metrics are more volatile.

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:

MatchMinutesxGxG per 90
Game 1900.200.20
Game 2750.150.18
Game 3900.350.35
Game 4650.100.14
Game 5900.250.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.
Pro tip: Create a simple table with three columns—player's moving average, season average, and league positional average. The gap between the first two tells you about form; the gap between the last two tells you about overall quality.


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.
What to look for:
  • 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.
Caveat: xG measures chance quality, not finishing ability. A player with high xG but low goals might be in good form regarding positioning but poor at converting. That's a separate analysis.


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 MAGoals MAGapInterpretation
0.400.50+0.10Overperforming xG. Likely unsustainable unless player is elite finisher.
0.400.30-0.10Underperforming xG. Could be bad luck or poor finishing.
0.400.400.00Perfect 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.
Example: A winger in a 4-3-3 formation might see their xG per 90 drop from 0.25 to 0.12 over a 5-game window. But if you check the team's PPDA (passes per defensive action) and see the team is facing more high-pressing opponents, the drop might be systemic rather than individual.


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)
What to look for on the chart:
  • 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.
Warning: Moving averages are backward-looking. They tell you what has happened, not what will happen. Injuries, tactical changes (e.g., switching from 4-2-3-1 to 3-5-2), or opponent quality can break a trend instantly.


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?
Refinement tips:
  • 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.