1. Freeze the data cutoff
Record the xG provider, model version and latest match available before the target fixture. Opta's guide illustrates one provider definition; totals from other models may differ.
2. Build contextual features
Calculate attacking xG and xGA over predeclared windows, then add opponent strength, venue, penalties, red cards and lineup continuity where available. Publish raw match counts beside per-match rates.
3. Use a model, not a narrative
Map the features to a defined target such as home, draw and away probabilities or home and away goal rates. Compare with a simpler team-strength baseline. Avoid rules such as “back every team underperforming xG”; outcome gaps can reflect model error and do not have a universal correction date.
4. Validate in time order
TimeSeriesSplit documents chronological validation. Keep the final period untouched while selecting windows, features and hyperparameters.
5. Evaluate probabilities
Use log loss or Brier score, calibration plots and relevant slices. scikit-learn's calibration guidance explains why a 60% forecast is judged across repeated future cases, not one result.
6. Compare with a timestamped price
Only after validation, compare the model probability with a like-for-like market price and state the margin-removal method. Store passes as well as selections so evaluation is not outcome-selected.
| Required record | Example |
|---|---|
| Provider and cutoff | Named xG feed through 10 July |
| Target | 90-minute match result |
| Test period | Later fixtures only |
| Baseline | Team rating plus venue |
| Metric | Log loss and calibration |
Football forecasting research provides historical evidence that football models and fixed-odds markets can be studied together, but its sample does not establish a current universal edge.
Worked research record
Suppose the hypothesis is that a team's rolling non-penalty xG difference improves a pre-match goal model. Define the feature as the average over the previous eight eligible league matches, adjusted for venue and opponent strength. Freeze each row at the day before kickoff and compare two models on the same later fixtures: the baseline without the feature and the candidate with it.
| Record | What to publish |
|---|---|
| Data | Provider, competitions, seasons and correction date |
| Feature | Window, penalty rule, weighting and missing values |
| Split | Expanding or rolling training dates and test dates |
| Forecast score | Log loss, Brier score or count likelihood |
| Calibration | Probability-band observed frequencies |
| Price test | Bookmaker set, timestamp and margin method |
If the candidate improves one period but not others, report that instability. Do not keep changing the window after inspecting the final test.
Operational safeguards
Late team news, provider corrections and postponed fixtures need explicit handling. Version the daily inputs and retain the probability generated at the decision time. A backtest that substitutes final clean data for what was actually available can overstate real-world performance.
scikit-learn's calibration guidance supports the probability-evaluation checks used below.
The research output is a probability estimate with uncertainty. Staking, product eligibility and responsible-gambling decisions are separate layers and should never be inferred from an xG chart alone.
Related resources
Read xG explained first, then expected value for model-price arithmetic.
Continue learning
- Next guide: League-Specific Football Statistics
- Related guide: Poisson Over/Under and Correct Score Calculation
Assumptions and limitations
This is a research workflow, not a profit claim. Provider revisions, sparse teams and tactical changes affect xG features. Any apparent advantage must survive future evaluation, costs, availability and model uncertainty.

