xG-Features
Expected Goals (xG) basierte Features — xG-Differenz, xG-Overperformance, Expected Points und der Luck-Index. xG misst die Qualitaet der kreierten Torchancen unabhaengig davon, ob der Ball tatsaechlich im Tor landete. xG-basierte Modelle uebertreffen Goals-basierte Modelle konsistent, da sie den Prozess der Chancenerarbeitung erfassen statt das Ergebnis.
Ueberblick
xG-basierte Features gehoeren zu den staerksten Praediktoren fuer Fussball-Vorhersagen. Sie erfassen die Qualitaet der Torchancen eines Teams — unabhaengig davon, ob der Ball tatsaechlich im Tor landete. Da Finishing-Qualitaet (Abschlussstaerke) stark zur Mitte regressiert, ist xG langfristig aussagekraeftiger als tatsaechliche Tore.
| Metrik | Saison-zu-Saison-Korrelation | Signal |
|---|---|---|
| xG | ~0.6–0.7 | Stabil, erfasst Chancenqualitaet |
| Shot Count | ~0.5–0.6 | Gut, aber ignoriert Schussqualitaet |
| Tatsaechliche Tore | ~0.3–0.5 | Verrauscht durch Finishing-Varianz |
| Possession | ~0.3–0.4 | Schwacher Praediktor allein |
Evidenz: Die Gewinnerloesung der Soccer Prediction Challenge 2017 (Hubacek et al.) nutzte Expected Goals als zwei der sechs entscheidenden Features (RPS: 0.2063). FiveThirtyEight SPI basiert primaer auf Shot-based xG und Non-Shot xG. In Beat-the-Bookie- Analysen liefern xG-Rolling-Averages ueber 10 Spiele den besten Kompromiss zwischen Signal und Rauschen.
Enthaltene Features
| # | Feature | Beschreibung | Relevant fuer |
|---|---|---|---|
| 4 | xG-Differenz (Net xG) | Avg xG For - Avg xG Against ueber Rolling Windows | 1X2, O/U |
| 5 | xG-Overperformance | Tatsaechliche Tore minus xG — Regressions-Indikator | 1X2, O/U |
| 6 | Expected Points | Via Poisson-Verteilung auf xG berechnet | 1X2 |
| 7 | xPoints vs. Punkte | Luck-Index: wie viel Glueck/Pech hatte das Team | 1X2 |
Berechnung
Avg xG For / Against (Rolling Windows)
xg_for = xG des eigenen Teams pro Spiel
xg_against = xG des Gegners (= xGA des eigenen Teams)
Avg xG For (Window W): avg(xg_for) ueber W Spiele
Avg xG Against (Window W): avg(xg_against) ueber W Spiele
Windows: 5, 10, Season
Gewichteter Avg: 0.5 * val_5 + 0.3 * val_10 + 0.2 * val_seasonxG-Differenz (Net xG)
Net xG = Avg xG For - Avg xG Against
Positiv → Team erzeugt mehr Chancen als der Gegner
Negativ → Team laesst mehr Chancen zu als es selbst kreiert
Windows: 5, 10, Season + gewichteter DurchschnittxG-Overperformance
Misst, ob ein Team ueber oder unter seinen erwarteten Toren liegt. Positive Werte deuten auf Glueck oder ueberdurchschnittliches Finishing hin — statistisch regrediert dieser Wert zum Mittelwert (Saison-zu-Saison-Korrelation nur ~0.1–0.2).
Offensive Overperformance = Tore erzielt - xG For
Defensive Overperformance = Tore kassiert - xG Against| Wert | Offensiv | Defensiv |
|---|---|---|
| > 0 | Ueberperformt (Glueck / Elite-Finishing) | Unterperformt (Pech / schwacher Torwart) |
| = 0 | Leistung wie erwartet | Leistung wie erwartet |
| < 0 | Unterperformt (Verschwendung / Pech) | Ueberperformt (starker Torwart / Glueck) |
Wichtig: Differenz-Methode (Goals - xG), nicht Ratio (Goals / xG) verwenden. Die Ratio hat Probleme mit Division durch Null und gibt bei niedrigen xG-Werten irrefuehrende Ergebnisse. Fenster: 5, 10, Season (kein gewichteter Durchschnitt, da der saisonweite Wert am aussagekraeftigsten ist).
Expected Points (Poisson-Modell)
Berechnet die erwarteten Punkte eines Teams basierend auf den xG-Werten beider Teams via Poisson-Verteilung:
Fuer k=0..7 Tore fuer beide Teams:
P(Heim=k, Auswaerts=j) = Poisson(xG_Heim, k) x Poisson(xG_Auswaerts, j)
P(Heimsieg) = Summe aller P(k,j) wobei k > j
P(Unentschieden) = Summe aller P(k,j) wobei k == j
P(Auswaertssieg) = Summe aller P(k,j) wobei k < j
xPoints = 3 x P(Sieg) + 1 x P(Unentschieden)Beispiel: Heim-xG 1.82, Auswaerts-xG 0.53 → P(H) = 0.668, P(D) = 0.213, P(A) = 0.119 → Heim-xPts = 2.22, Auswaerts-xPts = 0.57. Eigene Poisson-Implementierung (pure Python, ohne scipy) — unabhaengig von Sportmonks, liefert Zusatz-Features.
xPoints vs. tatsaechliche Punkte (Luck-Index)
luck_index = tatsaechliche_Punkte (Season) - xPoints (Season)
Positiv → Team hat mehr Punkte als die Leistung rechtfertigt
Negativ → Team hat weniger Punkte als verdientNur als Saison-Feature sinnvoll — zu wenig Datenbasis fuer 5/10er Fenster. Teams mit hohem Luck-Index tendieren zur Regression in den folgenden Spielen.
Feature-Output-Struktur
Team-Level Features (23 pro Team)
# xG For (offensiv, 4 Werte)
xg_for_5, xg_for_10, xg_for_season, xg_for_avg
# xG Against (defensiv, 4 Werte)
xg_against_5, xg_against_10, xg_against_season, xg_against_avg
# Net xG = For - Against (4 Werte)
xg_diff_5, xg_diff_10, xg_diff_season, xg_diff_avg
# Overperformance (6 Werte)
xg_overperf_off_5, xg_overperf_off_10, xg_overperf_off_season
xg_overperf_def_5, xg_overperf_def_10, xg_overperf_def_season
# Expected Points via Poisson (4 Werte)
xpts_5, xpts_10, xpts_season, xpts_avg
# Luck Index (1 Wert, nur Season)
xpts_luck_index
# Meta
matches_with_xgMatch-Level Features (21 Features)
# xG For (Angriff beider Teams + Differenz)
home_xg_for_avg, away_xg_for_avg, xg_for_diff
# xG Against (Verteidigung beider Teams + Differenz)
home_xg_against_avg, away_xg_against_avg, xg_against_diff
# Net xG (Dominanz beider Teams + Differenz)
home_xg_diff_avg, away_xg_diff_avg, xg_dominance_diff
# Overperformance (offensiv + defensiv)
home_xg_overperf_off, away_xg_overperf_off
home_xg_overperf_def, away_xg_overperf_def
# Expected Points (+ Differenz)
home_xpts_avg, away_xpts_avg, xpts_diff
# Luck Index
home_xpts_luck, away_xpts_luck
# Meta
home_matches_with_xg, away_matches_with_xg
has_xg — 1/0 SentinelPraediktive Kraft
xG-basierte Modelle uebertreffen Goals-basierte Modelle konsistent. xG hat eine niedrigere Varianz und erfasst die Qualitaet der kreierten Chancen besser als tatsaechliche Tore.
| Modell | Brier Score |
|---|---|
| Buchmacher-Benchmark | 57.2 |
| xG-basiertes Poisson-Modell | 58.6 |
| Goals-basiertes Poisson-Modell | 59.7 |
Das xG-Modell liegt 1.1 Brier-Punkte vor dem Goals-Modell und nur 1.4 Punkte hinter dem Buchmacher-Benchmark. Die Top-10-Modelle in Benchmarks sind allesamt xG-basiert.
FiveThirtyEight-Ansatz: Nutzt einen Kompositwert aus vier Metriken — tatsaechliche Tore, angepasste Tore (reduziertes Gewicht bei Fuehrung), Shot-basiertes xG und Non-Shot xG. Dies erkennt an, dass jede Metrik leicht unterschiedliche Informationen erfasst.
Vergleich: xG vs. tatsaechliche Tore
Tatsaechliche Tore behalten trotz der Ueberlegenheit von xG ihren Wert: Sie sind verfuegbar wenn xG-Daten fehlen, enthalten ein Finishing-Ability-Signal und beeinflussen Teamvertrauen.
| Szenario | Interpretation | Prognose |
|---|---|---|
| Tore = 0.8, xG = 1.8 | Kreiert Chancen, konvertiert schlecht | Kuenftig mehr Tore (Regression nach oben) |
| Tore = 2.0, xG = 0.9 | Ueberperformt massiv | Kuenftig weniger Tore (Regression nach unten) |
| Tore = 1.5, xG = 1.4 | Ergebnis entspricht Leistung | Stabile Prognose |
Overperformance als Regressions-Signal: Hohe positive offensive Overperformance → Team wird wahrscheinlich zurueckfallen. Hohe negative defensive Overperformance → Team wurde evtl. durch Glueck beschuetzt.
Abgrenzung: npxG, xGoT, xGA
Sportmonks bietet weitere xG-Varianten in teureren Paketen an. Fuer den aktuellen Basic-Plan (39 EUR) steht nur der Basis-xG-Wert zur Verfuegung — mit Workarounds fuer die wichtigsten fehlenden Metriken.
| Metrik | Paket | Workaround |
|---|---|---|
| xG (Type 5304) | Basic (39 EUR) | Verfuegbar |
| npxG (Non-Penalty) | Advanced (269 EUR) | Standard-xG verwenden — Elfmeter-Bias akzeptabel (~0.02 pro Tor) |
| xGoT (on Target) | Standard (129 EUR) | Shot Accuracy (Feature #8) als Proxy fuer Schussqualitaet |
| xGA (Against) | Advanced (269 EUR) | Gegner-xG = xGA (mathematisch identisch, andere Perspektive) |
Design-Entscheidungen
| Aspekt | Entscheidung | Begruendung |
|---|---|---|
| xG-Speicherung | FixtureStatistic | Kein neues Model — gleiche Query-Patterns wie Shot Statistics |
| Import | Separates Command import_xg | Eigener Include (xGFixture), nicht Teil von statistics |
| Fixture-Tracking | has_xg Boolean-Feld | Konsistent mit has_statistics, has_odds |
| xGA-Berechnung | Gegner-xG als Proxy | Mathematisch identisch, kein Upgrade noetig |
| xPts-Berechnung | Eigene Poisson-Implementierung | Unabhaengig von Sportmonks, liefert Zusatz-Features |
| Overperformance | Differenz (Goals - xG) | Kein Division-by-Zero-Problem (vs. Ratio) |
| Rolling Windows | 5, 10, Season + Weighted Avg | Standard-Pattern, konsistent mit allen anderen Features |
Datenquelle
| Feld | Wert |
|---|---|
| API | Sportmonks xG Basic via xGFixture Include |
| Type ID | 5304 (Expected Goals) |
| Kosten | 39 EUR/Monat (xG Basic Add-On) |
| Verfuegbarkeit | 12h post-match |
| Abdeckung | Alle 30 Ligen im Custom Plan |
Die 12-Stunden-Verzoegerung ist fuer Rolling-Average-Berechnungen irrelevant, da Features nur fuer vergangene Spiele berechnet werden. xG-Daten werden im bestehenden FixtureStatistic Model als Eintraege mit type_id=5304 gespeichert — kein neues Model noetig.
Quellen
- Hubacek, Sourek & Zelezny (2019): "Learning to predict soccer results from relational data with gradient boosted trees" — Soccer Prediction Challenge Gewinner
- Beat the Bookie: "The Predictive Power of xG" — xG Rolling Averages als optimaler Kompromiss
- FiveThirtyEight: "How Our Club Soccer Predictions Work" — SPI basiert auf Shot-based xG und Non-Shot xG
- Dixon & Coles (1997): "Modelling Association Football Scores" — Poisson-Grundlage fuer Expected Points
- Expected Goals (analytische Studien): xG korreliert staerker mit zukuenftigen Ergebnissen als tatsaechliche Tore