Feature Stores für Quant-Trading: Daten-Infrastruktur, die skaliert.
Eine Strategie mit drei Features kommt mit einem Notebook aus. Bei fünfzehn Strategien, die über Wochen, Monate und verschiedene Modelle dieselben rollierenden Volatilitäten, Order-Flow-Imbalances und Macro-Daten brauchen, wird Daten-Logistik zum Engpass. Feature Stores sind die Antwort, die das ML-Team von Uber 2017 erfunden hat — und die auch in kleinen Quant-Setups Sinn ergibt, sobald die Strategie-Zahl wächst.
Was ein Feature Store leistet.
Ein Feature Store ist eine zentrale Schicht, die drei Dinge bündelt:
- Feature-Definitionen als Code (eine Funktion, die aus Rohdaten ein Feature berechnet, mit Versionierung und Tests).
- Offline-Store für historische Werte — wird beim Backtesting und Modell-Training abgefragt.
- Online-Store für aktuelle Werte — wird vom Live-Modell mit niedriger Latenz konsultiert.
Die entscheidende Eigenschaft: Offline und Online sehen dieselbe Definition. Wer ein Feature offline ändert (etwa die Lookback-Fenster-Länge), muss bewusst beide Stores migrieren. Das eliminiert die häufigste Quelle stiller Bugs in ML-Pipelines: Training-Serving-Skew.
Die etablierten Tools 2032:
- Feast: Open-Source, Python-nativ. Pluggable Offline-Stores (Parquet, BigQuery, Snowflake, Redshift) und Online-Stores (Redis, DynamoDB, Postgres). Mein Default für kleine und mittlere Setups.
- Tecton: Managed (kommerziell), aus dem Feast-Umfeld hervorgegangen. Bietet eingebaute Streaming-Pipelines, Monitoring, Access-Control. Sinnvoll ab Team-Größe 3+ Quants.
- Vertex AI Feature Store / SageMaker Feature Store: Cloud-managed, integriert in GCP/AWS-Pipelines. Pragmatisch, wenn Stack eh dort liegt.
- Hopsworks: enterprise-lastig, gut bei strikten Compliance-Anforderungen.
Online- vs. Offline-Serving.
Beim Backtest will ich tausende Feature-Werte über Jahre für hunderte Symbole holen. Latenz ist egal, Durchsatz und Joinability zählen. Beim Live-Modell will ich für ein einzelnes Symbol den aktuellsten Wert in <10 ms — Durchsatz egal, Latenz alles.
Feature Stores lösen das mit zwei separaten Engines:
# Offline (Backtest, Training): Parquet auf S3 / Snowflake
historical_features = store.get_historical_features(
entity_df=order_timestamps,
features=[
"vol_features:realized_vol_5min",
"vol_features:realized_vol_1d",
"flow_features:order_imbalance_30s",
"macro_features:vix_close",
],
).to_df()
# Online (Live): Redis-Lookup mit ~2 ms p99
online_features = store.get_online_features(
entity_rows=[{"symbol": "MSFT"}],
features=[
"vol_features:realized_vol_5min",
"flow_features:order_imbalance_30s",
],
).to_dict()
Beide Aufrufe nutzen dieselbe Feature-Definition aus dem Registry. Wenn die
Berechnung von realized_vol_5min sich ändert, fliegt sie als neue
Version durch beide Pipelines.
Time-Travel Joins: warum Backtests sonst lügen.
Das größte Bug-Risiko im Quant-Backtest ist Lookahead-Bias: ein Feature in der Trainings-Tabelle, das zur Order-Zeit noch nicht verfügbar war. Klassisches Beispiel: Closing-Price-Feature in einer Intraday-Strategie — der Wert existiert erst nach Marktschluss, im Backtest aber ist er für 14:00 schon da.
Feature Stores lösen das mit Point-in-Time-Joins. Jeder Feature-Wert
hat einen event_timestamp (Zeitpunkt des realen Beobachtens) und einen
created_timestamp (Zeitpunkt, zu dem er materialisiert wurde). Beim
Join gegen eine Order-Tabelle holt der Store nur Werte, deren
event_timestamp ≤ order_timestamp ist — und respektiert
Datenverfügbarkeits-Latenzen (etwa: VIX-Tagesschluss erst um 16:15 verfügbar).
from feast import FeatureView, Field
from feast.types import Float32
from datetime import timedelta
vol_features_fv = FeatureView(
name="vol_features",
entities=[symbol_entity],
ttl=timedelta(days=7),
schema=[
Field(name="realized_vol_5min", dtype=Float32),
Field(name="realized_vol_1d", dtype=Float32),
],
source=vol_features_source,
# delivery_lag: Daten sind erst N Sekunden nach event_time real verfügbar
online=True,
)
Feature Drift Detection.
Features verschieben sich. Vola-Regimes ändern sich, Liquidität ändert sich, Cross-Asset-Korrelationen ändern sich. Wenn Ihr Modell auf Daten trainiert wurde, die heute nicht mehr representativ sind, sinkt die Predictive Power, ohne dass es im Trade-Log offensichtlich wäre.
Feature Stores ermöglichen systematische Drift-Detection, weil sie alle Feature-Werte historisch halten. Typische Metriken:
- Population Stability Index (PSI): vergleicht Verteilung des Features in Trainings-Periode vs. aktueller Produktion. PSI > 0,2 ist Warnsignal, > 0,4 ist Alarm.
- KL-Divergenz oder Jensen-Shannon-Distanz: ähnlich, glatter.
- Feature-Quantile-Tracking: einfach, robust. Wenn das 95. Perzentil von
order_imbalance_30ssich verdoppelt hat, gibt es ein Regime-Shift.
Drift-Checks laufen als Nightly-Job über den Offline-Store und schreiben in einen Monitoring-Channel. Feast-Erweiterungen wie great_expectations-Integration oder Tecton's eingebautes Monitoring erleichtern das.
Eigene Lösung oder Managed Service?
Die ehrliche Antwort hängt von der Team-Größe und vom Strategie-Reuse ab. Eine grobe Heuristik aus meiner Beratungspraxis:
- 1–3 Strategien, ein Quant: kein Feature Store. Parquet-Dateien plus saubere Pandas-Pipelines reichen. Komplexität kostet mehr als sie spart.
- 5–10 Strategien, geteilte Features: Feast self-hosted mit Parquet/Postgres-Offline und Redis-Online. Aufwand: 1–2 Wochen Setup, danach Pflege im Promille-Bereich.
- 10–30 Strategien, mehrere Quants: Feast Cloud, Tecton oder Vertex AI Features. Access-Control, Monitoring und Streaming werden relevant.
- Größer / regulierte Umgebung: Hopsworks oder eigene Lösung mit dem hauseigenen Compliance-Stack.
Was ich nicht empfehle: einen Feature Store „auf Vorrat" einführen, bevor mehrere Strategien existieren, die wirklich dieselben Features teilen. Vorher ist es Over-Engineering.
Konkretes Setup: Feast + TimescaleDB + Redis.
Mein Standard-Setup für Quant-Mandanten mit 5–15 Strategien:
# Architektur
- Offline Store: TimescaleDB (PostgreSQL + Time-Series-Extension)
- Online Store: Redis (cluster, in-memory)
- Registry: PostgreSQL
- Compute: Python-Pipelines (Airflow oder Dagster)
- Stream-Layer: Kafka oder Redpanda, falls Intraday-Features
# Tägliche Materialisierung
0 5 * * * feast materialize-incremental $(date -I)
# Verzeichnis-Struktur
features/
entities.py # symbol, exchange, strategy_id
vol_features.py # realized vol, GARCH, vola-of-vola
flow_features.py # OFI, depth-imbalance, volume-burst
macro_features.py # VIX, MOVE, DXY, term-structure
feast_repo.yaml # Feast-Repo-Konfiguration
tests/
test_no_lookahead.py
test_schema.py
TimescaleDB ist hier der Schlüssel: native Time-Series-Indizes, Compression-Policies, Continuous-Aggregates. Backtests, die früher 20 Minuten gebraucht haben, laufen darauf in 30 Sekunden. Redis hält die letzten paar Stunden warm, p99-Lookup-Latenz zuverlässig unter 5 ms.
Meine Praxis.
Bei einem Mandanten letztes Jahr: 7 Strategien, alle mit überlappenden Vola- und Flow-Features, jede in ihrem eigenen Notebook neu berechnet, jedes Mal leicht anders. Konsequenz: in einem Live-Trade wurde eine 5-Min-Vola berechnet mit 5 statt 6 Bar-Lookback, Strategie verlor 0,4 % am Tag, niemand wusste warum. Drei Tage Suche.
Nach dem Feast-Setup: alle Strategien teilen dieselben Feature-Definitionen, jede Änderung läuft durch Code-Review, jede Version ist im Registry nachvollziehbar. Backtests sind reproduzierbar, weil die Feature-Werte historisch eingefroren sind. Aufwand für den Wechsel: 9 Tage. Ich behaupte: ab etwa 10 ernsthaft betriebenen Strategien ist ein Feature Store keine Option, sondern Hygiene.
Für kleinere Setups bleibt der Pragmatismus: ein gut strukturiertes
features/-Verzeichnis mit getesteten Funktionen, Parquet-Cache und
Schema-Tests. Aber die Schwelle, ab der ein Feature Store schwarze Zahlen schreibt,
kommt schneller, als man denkt.
Sie skalieren Ihre Quant-Pipeline und merken, dass Daten-Logistik der Engpass wird? Erstgespräch buchen — wir entwerfen ein Feature-Store-Setup, das zur Team-Größe passt.