Zeitgewichtung (Exponential Decay)
Exponential Moving Average (EMA) basierte Features als Ergaenzung zu festen Rolling Windows. Neuere Spiele erhalten hoehere Gewichte, aeltere Spiele verlieren graduell an Einfluss — ohne den "Cliff-Edge-Effekt" fester Fenster.
Motivation
Alle bisherigen Features basieren auf festen Rolling Windows (5, 10, Season). Innerhalb eines Fensters zaehlt jedes Spiel gleich viel. Das fuehrt zu zwei Problemen:
| Problem | Beschreibung |
|---|---|
| Cliff-Edge-Effekt | Beim Uebergang von Fenster 5 auf 6 faellt ein Spiel schlagartig aus der Berechnung. Ein 5:0-Sieg kann den Durchschnitt abrupt senken. |
| Gleichgewichtung | Ein Sieg vor 10 Spielen zaehlt genauso wie der letzte Sieg, obwohl neuere Ergebnisse die aktuelle Teamstaerke besser widerspiegeln. |
Evidenz: Eine vergleichende Studie fand eine ~12% Verbesserung (MAE 0.3028 vs. 0.3434) durch Exponential Weighted Regression gegenueber Rolling Regression. Die Gewinnerloesung der Soccer Prediction Challenge 2017 (Hubacek et al.) empfahl "Weighting aggregated data according to recency" als wichtigen Verbesserungspfad.
Mathematische Grundlage
Exponential Moving Average (EMA)
Die EMA ist ein rekursiver Update-Mechanismus, bei dem jede neue Beobachtung mit dem Glaettungsfaktor alpha gewichtet wird:
EMA_t = alpha * x_t + (1 - alpha) * EMA_{t-1}
alpha = Glaettungsfaktor (0 < alpha < 1)
x_t = neuer Beobachtungswert
EMA_{t-1} = vorheriger EMA-Wert
Zusammenhang mit Span N:
alpha = 2 / (N + 1)
→ alpha = 0.2 entspricht Span ~9 SpieleVergleich: Feste Fenster vs. EMA
| Aspekt | Festes Fenster (5/10) | EMA |
|---|---|---|
| Gewichtung | Alle Spiele gleich | Neuere Spiele staerker gewichtet |
| Randbegrenzung | Abruptes Herausfallen (Cliff Edge) | Graduelles Abklingen |
| Speicherbedarf | Gesamte Matchliste im Fenster | Nur ein Zustandswert pro Metrik |
| Reaktionszeit | Abhaengig von Fenstergroesse | Steuerbar via alpha |
Gewichtsverteilung bei alpha = 0.2
| Spiel (neuestes zuerst) | Gewicht | Kumuliert |
|---|---|---|
| Letztes Spiel | 20.0% | 20.0% |
| 2. juengstes | 16.0% | 36.0% |
| 3. juengstes | 12.8% | 48.8% |
| 4. juengstes | 10.2% | 59.0% |
| 5. juengstes | 8.2% | 67.2% |
| 6.–10. juengstes | je 2.7–6.6% | 89.3% |
| Aeltere Spiele | abnehmend | → 100% |
Die letzten 5 Spiele tragen ~67% bei (vs. 100% beim festen 5er-Fenster). Aeltere Spiele behalten einen kleinen, aber nicht-null Einfluss.
Enthaltene Features
Team-Level EMA (12 pro Team)
| Feature | Input | Nutzen |
|---|---|---|
| ppg_ema | Punkte pro Spiel (3/1/0) | Hoch |
| gf_ema | Tore erzielt | Hoch |
| ga_ema | Tore kassiert | Hoch |
| gd_ema | Tordifferenz | Hoch |
| cs_ema | Clean Sheet (1/0) | Moderat |
| fts_ema | Failed to Score (1/0) | Moderat |
| btts_ema | Both Teams Scored (1/0) | Moderat |
| xg_for_ema | xG erzielt | Hoch |
| xg_against_ema | xG kassiert | Hoch |
| xg_diff_ema | xG-Differenz | Hoch |
| tsr_ema | Total Shot Ratio | Hoch |
| sot_ratio_ema | Shots on Target Ratio | Hoch |
Match-Level Features (39 Features)
# Pro Metrik (12 Metriken):
home_<metrik>_ema — EMA-Wert des Heimteams
away_<metrik>_ema — EMA-Wert des Auswaertsteams
<metrik>_ema_diff — Differenz (Heim - Auswaerts)
# Ausnahme: BTTS nutzt Summe statt Differenz
btts_ema_sum — home_btts_ema + away_btts_ema
# Meta
home_matches — Anzahl bisheriger Spiele (Heim)
away_matches — Anzahl bisheriger Spiele (Auswaerts)
has_decay — 1/0 SentinelBerechnung
EMA-Update
# Erstes Spiel: EMA wird mit dem Beobachtungswert initialisiert
EMA_1 = x_1
# Folgende Spiele: gewichtetes Update
EMA_t = 0.2 * x_t + 0.8 * EMA_{t-1}
# Beispiel: Team gewinnt 3 Spiele (3 Punkte je Spiel)
EMA_1 = 3.0
EMA_2 = 0.2 * 3 + 0.8 * 3.0 = 3.0
EMA_3 = 0.2 * 3 + 0.8 * 3.0 = 3.0 → konvergiert auf 3.0
# Beispiel: Team gewinnt, dann verliert
EMA_1 = 3.0 (Sieg, 3 Punkte)
EMA_2 = 0.2 * 0 + 0.8 * 3.0 = 2.4 (Niederlage, 0 Punkte)
EMA_3 = 0.2 * 0 + 0.8 * 2.4 = 1.92 (weiter sinkend)Saisonuebergang
Der finale EMA-Wert der Vorsaison wird als Startwert fuer die neue Saison verwendet. So gehen historische Informationen nicht verloren, werden aber durch aktuelle Ergebnisse schnell ueberlagert.
# Vorsaison: Team hatte finalen ppg_ema von 2.1
# Neue Saison, 1. Spiel: Niederlage (0 Punkte)
EMA_1 = 0.2 * 0 + 0.8 * 2.1 = 1.68
# Nach 5 Spielen: Vorsaison-Wert hat nur noch ~33% Einfluss
# Nach 10 Spielen: nur noch ~11% Einfluss
# → Natuerlicher Uebergang, kein harter ResetOptionale Metriken (xG, Schuesse)
xG- und Schuss-Daten sind nicht fuer alle Spiele verfuegbar. Wenn ein Wert fehlt, bleibt der vorherige EMA-Zustand unveraendert. Sobald neue Daten eintreffen, wird normal aktualisiert.
# xG fuer Match vorhanden:
xg_for_ema = 0.2 * xg_for + 0.8 * prev_xg_for_ema
# xG fehlt (kein xG-Provider fuer dieses Spiel):
xg_for_ema = prev_xg_for_ema (unveraendert)
# Noch nie xG gehabt:
xg_for_ema = None → wird als 0.0 im Feature-Output dargestelltForschungsgrundlage
Die exponentielle Zeitgewichtung ist eine der am besten untersuchten Optimierungen in der Fussball-Vorhersage. Die wissenschaftliche Grundlage reicht von Dixon & Coles (1997) bis zu modernen Prediction Challenges.
| Studie | Kernaussage | Relevanz |
|---|---|---|
| Dixon & Coles (1997) | Fuehrte exponentielle Zeitgewichtung in der Fussballanalytik ein | Grundlagenpaper |
| Constantinou & Fenton (2013) | Pi-Ratings mit EMA schlagen Standard-Elo ueber 5 PL-Saisons | Per-Match-EMA validiert |
| FiveThirtyEight SPI | Implizite Zeitgewichtung mit bis zu 25% Recency-Bonus | Praxisbeispiel |
| Hubacek et al. (2017) | Recency-Gewichtung als empfohlener Verbesserungspfad | Challenge-Gewinner |
| Phatak et al. (2022) | Kombinierte Repraesentationen (roh + normalisiert): R-squared 57.83% vs. 49.90% | EMA + Fixed Windows ist besser als nur eines |
Welche Features profitieren?
| Kategorie | Nutzen | Begruendung |
|---|---|---|
| Form, Tore, xG, Schuesse | Hoch | Stark formabhaengig, zeitgewichtete xG ist laut StatsUltra das wichtigste Feature (Importance 0.51) |
| Raten (CS, BTTS, FTS) | Moderat | Binaere Outcomes sind verrauscht, Varianz bleibt hoch |
| Elo, Odds, Kontext, H2H | Nicht anwendbar | Bereits zeitgewichtet (Elo), marktaktuell (Odds) oder punktuell (Kontext) |
Design-Entscheidungen
| Aspekt | Entscheidung | Begruendung |
|---|---|---|
| Alpha-Wert | 0.2 (Span ~9 Spiele) | Moderater Kompromiss zwischen Reaktionszeit und Stabilitaet |
| Decay-Typ | Per-Match (nicht Per-Day) | Einfacher, regelmaessiger Spielbetrieb in allen 30 Ligen |
| Verhaeltnis | Ergaenzung zu festen Fenstern | ML-Modell lernt optimale Gewichtung beider Repraesentationen |
| Speicherung | decay_features JSONField | Konsistent mit bestehenden Feature-Feldern |
| Saisonuebergang | Vorsaison-EMA als Initialisierung | Kein harter Reset, natuerliches Abklingen (~33% nach 5 Spielen) |
| Rundung | 4 Dezimalstellen | Konsistent mit anderen Feature-Modulen |
Quellen
- Dixon, M. J. & Coles, S. G. (1997): "Modelling Association Football Scores and Inefficiencies in the Football Betting Market", JRSS-C, 46:265-280
- Constantinou, A. C. & Fenton, N. E. (2013): "Determining the number of matches for accurate pi-rating estimation", Journal of Quantitative Analysis in Sports
- Hubacek, O., Sourek, G. & Zelezny, F. (2017): "Exploiting sports-betting market using machine learning", Soccer Prediction Challenge 2017
- Phatak, A. et al. (2022): "Feature normalization for football match prediction"
- FiveThirtyEight: "How Our Club Soccer Predictions Work" — SPI mit impliziter Zeitgewichtung
- dashee87 (2018): "Predicting Football Results With Statistical Modelling: Dixon-Coles and Time-Weighting"
- opisthokonta.net (2014): "Dixon-Coles time weighting parameter analysis" — Optimale Decay-Raten nach Liga
- StatsUltra: "Football Forecast: How GxG and GAxGA Shape Match Analysis" — xG-EMA als wichtigstes Feature