Holt-Winters für Trader: klassische Forecasting-Methode neu betrachtet.
Holt-Winters Exponential Smoothing ist ein Klassiker aus den 1960ern, der heute in jeder Forecasting-Vorlesung auftaucht. Im Trading wird er selten erwähnt — was eine Mischung aus mangelnder Bekanntheit und richtiger Skepsis ist. Auf reine Preise angewendet funktioniert er nicht. Auf Volume oder Volatilität mit saisonalen Mustern dagegen schon.
Ich nutze Holt-Winters in Mandanten-Projekten meist nicht für Preis-Forecasts (dafür ist er zu schlicht), sondern für Hilfsgrößen: Tages-Volume, intraday-Volatilität, Anzahl-Trades-pro-Stunde. Genau dort sind seine Stärken — saisonal-additive oder -multiplikative Komponenten mit stabilen Trends.
Was Holt-Winters wirklich tut.
Holt-Winters zerlegt eine Zeitreihe in drei exponentiell geglättete Komponenten:
- Level (L): der momentane Niveau-Schätzer der Serie.
- Trend (T): die geschätzte lineare Veränderung pro Periode.
- Seasonality (S): ein wiederkehrender Faktor (oder Summand) für die saisonale Position.
Jede Komponente hat einen eigenen Glättungs-Parameter (Alpha für Level, Beta für Trend, Gamma für Saisonalität). Der Forecast für Periode t+h ist dann L + h·T multipliziert (oder addiert) mit dem passenden Saisonal-Faktor. Das ist einfach, robust und überraschend gut — wenn die zugrunde liegenden Annahmen halten.
Warum Holt-Winters auf Preise nicht funktioniert.
Preisreihen sind nahezu Random Walks. Sie haben keinen stabilen Trend, keine zuverlässige Saisonalität (außer in sehr spezifischen Asset-Klassen wie Strom oder Agrar-Futures), und ihre Volatilität ist nicht-stationär. Holt-Winters unter solchen Bedingungen produziert optisch glatte Forecasts, die als Trading-Signal genauso schlecht abschneiden wie ein simpler EMA.
Wer Holt-Winters auf SPY-Tagesschluss-Preise wirft und 5-Tage-Forecasts generiert, bekommt etwas, das wie eine geglättete Fortschreibung aussieht — aber die Forecast-RMSE liegt systematisch über der Naive-Forecast-Baseline (Forecast = aktueller Preis). Mehr braucht es nicht zu sagen.
Wo Holt-Winters glänzt: Volume und Volatilität.
Tages-Volume und intraday-Volatilität haben echte Saisonalität: Wochentags-Muster (Montag-Volume vs. Freitag-Volume), Monatsende-Effekte, Optionsverfall-Tage. Auf Stunden-Granularität gibt es die U-Form des Handelstages (hoher Volume bei Open und Close). Diese Muster sind stabil, additiv und genau das, was Holt-Winters modellieren kann.
Konkret: in einer VWAP-Execution-Strategie braucht man eine möglichst gute Schätzung des erwarteten Volume-Profils des kommenden Tages, um den Order-Slicing-Plan zu kalibrieren. Holt-Winters mit Saison-Periode = 5 (Wochentage) und unterliegendem Stunden-Profil liefert hier oft bessere Forecasts als ein einfacher 20-Tage-Mittelwert — und ist deutlich einfacher zu warten als ein gradient-boostendes Modell.
Holt-Winters vs. ARIMA: wann was?
ARIMA modelliert AR-Terme, MA-Terme und Differenzierung. Es ist mächtiger, aber auch empfindlicher gegenüber Modellauswahl, Stationarität und Sampling.
- ARIMA: besser für komplexere Autokorrelations-Strukturen ohne klare Saisonalität, oder wenn SARIMA mit mehreren Saisonalitäten nötig ist.
- Holt-Winters: besser bei klaren saisonalen Mustern, robusten Trends und wenn Sie ein wartbares Produktions-Modell brauchen, das nicht jedes Quartal neu kalibriert werden muss.
In meiner Praxis: für Volume-Forecasting nehme ich Holt-Winters fast immer, weil die Saisonalität dominant ist und das Modell selbsterklärend bleibt. Für Volatilitäts-Forecasts mit Clustering nehme ich eher GARCH-Familien — Holt-Winters kann Vola-Clustering nicht modellieren.
Konkretes Setup: Volume-Prediction für VWAP-Algos.
# Holt-Winters für Tages-Volume-Forecast import yfinance as yf import numpy as np import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing vol = yf.download("SPY", start="2018-01-01", auto_adjust=True)["Volume"] vol = np.log(vol) # Log-Transform stabilisiert Varianz train = vol.iloc[:-60] test = vol.iloc[-60:] model = ExponentialSmoothing( train, trend="add", seasonal="add", seasonal_periods=5 # Wochentage ).fit(optimized=True) forecast = model.forecast(60) rmse_hw = np.sqrt(((forecast - test) ** 2).mean()) rmse_naive = np.sqrt(((train.iloc[-1] - test) ** 2).mean()) print(f"RMSE Holt-Winters: {rmse_hw:.4f}") print(f"RMSE Naive: {rmse_naive:.4f}")
In typischen Setups schlägt Holt-Winters den Naive-Forecast deutlich (RMSE-Reduktion 20–35 %). Die nächste Stufe wäre, das Modell auf intraday-Slots (z. B. 30-Minuten-Buckets) zu erweitern — dann mit Saison-Periode entsprechend der Anzahl Slots pro Tag.
Praktische Stolperfallen.
- Log-Transform: bei Volume oder anderen rechtsschiefen Größen vor dem Modellieren log-transformieren, danach exp-Rücktransformation.
- Holidays und Halbtage: US-Halbtage (Black Friday, vor Weihnachten) brechen die Wochentags-Saisonalität — entweder ausklammern oder als Dummy-Effekt korrigieren.
- Regimewechsel: Volume-Profile ändern sich nach großen Marktevents. Modell-Refresh alle 3–6 Monate ist sinnvoll, ein voller Re-Fit nicht öfter.
- Optimierungs-Vorsicht: die Alpha/Beta/Gamma-Optimierung kann in lokale Optima laufen. Mehrfach-Start oder fixe Parameter aus Domain-Wissen helfen.
Ehrliche Bewertung.
Holt-Winters ist keine Edge-Quelle für Preis-Trading. Wer das versucht, verschwendet Zeit. Aber als Werkzeug in der zweiten Reihe — für Volume, Volatilität, Order-Slicing, Liquiditäts-Forecasts — ist es robust, schnell und transparent. Genau die Eigenschaften, die in einem Produktions-Setup wichtiger sind als das letzte halbe Prozent Genauigkeit.
Mein Rat: legen Sie Holt-Winters nicht in die Kategorie „veraltet", weil er aus den 1960ern stammt. Im Vergleich zu vielen modernen Deep-Learning-Forecast-Modellen schneidet er auf saisonalen Reihen bemerkenswert kompetitiv ab — und ist deutlich wartbarer.
Sie haben eine Execution-Strategie oder ein Forecasting-Problem, das mehr als Bauchgefühl verträgt? Erstgespräch buchen — wir prüfen, welche Methode passt.