Zeitgewichtung (Exponential Decay)

Optimierung

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:

ProblemBeschreibung
Cliff-Edge-EffektBeim Uebergang von Fenster 5 auf 6 faellt ein Spiel schlagartig aus der Berechnung. Ein 5:0-Sieg kann den Durchschnitt abrupt senken.
GleichgewichtungEin 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 Spiele

Vergleich: Feste Fenster vs. EMA

AspektFestes Fenster (5/10)EMA
GewichtungAlle Spiele gleichNeuere Spiele staerker gewichtet
RandbegrenzungAbruptes Herausfallen (Cliff Edge)Graduelles Abklingen
SpeicherbedarfGesamte Matchliste im FensterNur ein Zustandswert pro Metrik
ReaktionszeitAbhaengig von FenstergroesseSteuerbar via alpha

Gewichtsverteilung bei alpha = 0.2

Spiel (neuestes zuerst)GewichtKumuliert
Letztes Spiel20.0%20.0%
2. juengstes16.0%36.0%
3. juengstes12.8%48.8%
4. juengstes10.2%59.0%
5. juengstes8.2%67.2%
6.–10. juengstesje 2.7–6.6%89.3%
Aeltere Spieleabnehmend→ 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)

FeatureInputNutzen
ppg_emaPunkte pro Spiel (3/1/0)Hoch
gf_emaTore erzieltHoch
ga_emaTore kassiertHoch
gd_emaTordifferenzHoch
cs_emaClean Sheet (1/0)Moderat
fts_emaFailed to Score (1/0)Moderat
btts_emaBoth Teams Scored (1/0)Moderat
xg_for_emaxG erzieltHoch
xg_against_emaxG kassiertHoch
xg_diff_emaxG-DifferenzHoch
tsr_emaTotal Shot RatioHoch
sot_ratio_emaShots on Target RatioHoch

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 Sentinel

Berechnung

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 Reset

Optionale 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 dargestellt

Forschungsgrundlage

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.

StudieKernaussageRelevanz
Dixon & Coles (1997)Fuehrte exponentielle Zeitgewichtung in der Fussballanalytik einGrundlagenpaper
Constantinou & Fenton (2013)Pi-Ratings mit EMA schlagen Standard-Elo ueber 5 PL-SaisonsPer-Match-EMA validiert
FiveThirtyEight SPIImplizite Zeitgewichtung mit bis zu 25% Recency-BonusPraxisbeispiel
Hubacek et al. (2017)Recency-Gewichtung als empfohlener VerbesserungspfadChallenge-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?

KategorieNutzenBegruendung
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

AspektEntscheidungBegruendung
Alpha-Wert0.2 (Span ~9 Spiele)Moderater Kompromiss zwischen Reaktionszeit und Stabilitaet
Decay-TypPer-Match (nicht Per-Day)Einfacher, regelmaessiger Spielbetrieb in allen 30 Ligen
VerhaeltnisErgaenzung zu festen FensternML-Modell lernt optimale Gewichtung beider Repraesentationen
Speicherungdecay_features JSONFieldKonsistent mit bestehenden Feature-Feldern
SaisonuebergangVorsaison-EMA als InitialisierungKein harter Reset, natuerliches Abklingen (~33% nach 5 Spielen)
Rundung4 DezimalstellenKonsistent 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