Fortgeschrittener KI-Trading-Leitfaden: Die vollständige Referenz zu ML-Bibliotheken, Modellen & Frameworks für Quants
Eine Übersicht auf Praktiker-Niveau über das Open-Source- und Hugging-Face-Ökosystem für systematisches Trading — Gradient Boosting, tiefe Zeitreihen-Architekturen, Zero-Shot-Foundation-Models, Financial NLP, Reinforcement Learning, López de Prados Validierungs-Toolkit, Backtesting-Engines und MLOps — jeweils mit Architektur-Anmerkungen, Lizenzen, Benchmarks und Code.
5-Tage-Gratis-Testphase
Keine Karte erforderlich
Unbegrenzte Trades
Sofortige Ausführung
👋
Neu im KI-/ML-Trading? Diese Seite setzt Vertrautheit mit ML und Python voraus und überspringt die Grundlagen. Wenn Sie lieber mit der allgemeinverständlichen Version beginnen möchten — was Meta-Labeling ist, wie die Pipeline zusammenpasst, wie sich die Ausführung mit PickMyTrade automatisieren lässt — lesen Sie zuerst den Einsteiger-Leitfaden zum KI-Trading und kommen Sie dann hierher zurück.
01
Klassisches / tabellarisches ML — die Arbeitspferde
Gradient-Boosted Decision Trees (GBDTs) — nicht tiefe neuronale Netze — sind die Standard-Modellfamilie für jede tabellarische Klassifikations-/Regressionsaufgabe in dieser Pipeline: Meta-Labeling, Regime-Features, Faktor-Scoring. Ein vielzitierter Vergleich von 2024 über 100–300+ tabellarische Benchmarks stellte fest, dass GBDTs Deep Learning auf tabellarischen Daten mit deutlich weniger Tuning erreichen oder übertreffen (arXiv:2402.03970). Tabellarische Finanzdaten sind genau das Regime, in dem dies am stärksten gilt: niedriges Signal-Rausch-Verhältnis, gemischte stetige/kategoriale/spärliche Features, ausgeprägte Nichtstationarität und kleine effektive Stichprobengrößen — Bedingungen, unter denen die Flexibilität tiefer Netze meist Varianz statt Signal einbringt.
Warum GBDTs bei tabellarischen Finanzdaten dominieren
Bias-Varianz-Trade-off. Bei einigen Tausend effektiven (nach Eindeutigkeit gewichteten) Zeilen und einem schwachen, verrauschten Signal geht der niedrige Bias eines Netzes mit hoher Kapazität mit einem Varianzkosten einher, die Sie sich nicht leisten können. Flache Bäume mit starker Regularisierung (Blattanzahl, min-data-in-leaf, Bagging) liegen an einem deutlich besseren Punkt dieses Trade-offs.
Gemischte und spärliche Features nativ. Bäume splitten anhand roher Feature-Werte — kein Skalieren, keine Imputationsstrategie, keine Embedding-Tabelle für selten befüllte Kategoriale (Sektor, Börse, Verfallsnähe-Flag). Der Aufwand im Feature Engineering fließt ins Signal, nicht in Preprocessing-Klempnerei.
Monotonie-Constraints kodieren finanzielle Priors direkt. LightGBM/XGBoost/CatBoost unterstützen alle monotone_constraints: z. B. erzwingen, dass P(win) mit der Trendstärke nicht fällt und mit der realisierten Volatilität nicht steigt. Das regularisiert hin zu domänensinnvollen Modellen und ist in einem Standard-MLP nicht verfügbar oder weit umständlicher.
Fehlende Werte und Nichtstationarität. Bäume leiten fehlende Werte nativ weiter (keine leakage-anfällige Imputation, die auf dem gesamten Datensatz gefittet wird), und flache, häufig neu trainierte Bäume passen sich an Regimewechsel schneller an als ein großes Netz, das viele Epochen braucht, um veraltete Muster zu verlernen.
Library
License
Maturity / stars*
Categorical handling
Speed
Best fit here
LightGBM
MIT
Mature · moved microsoft/LightGBM → lightgbm-org/LightGBM Mar 2026, still MIT
Native (histogram-based, leaf-wise growth)
Fastest of the three on CPU, large-N
Default meta-label / primary classifier
XGBoost
Apache-2.0
Mature, dmlc-maintained, huge ecosystem
Needs one-hot or target-encoding (or enable_categorical)
Slightly slower than LightGBM on CPU histogram mode
When you have many high-cardinality categoricals (symbol, sector, exchange)
scikit-learn
BSD-3-Clause
Foundational, ~19+ years
Via ColumnTransformer/OneHotEncoder
N/A — utility layer
CV splitters, metrics, pipelines, calibration, GMM — the glue, not the model
*Star-Zahlen sind Richtwerte, geprüft Mitte 2026 — als „Größenordnung" zu verstehen, nicht als exakte Werte.
LightGBM
MIT
Mechanismus: Histogramm-basiertes Gradient Boosting mit blattweisem (best-first) Baumwachstum statt ebenenweise — konvergiert schneller und meist zu geringerem Loss als ebenenweises Wachstum bei gegebenem Blatt-Budget, um den Preis einer höheren Neigung zum Overfitting bei kleinen Daten (steuerbar über num_leaves/min_data_in_leaf).
Wann einsetzen: Standardwahl für den Meta-Label-Filter und jede tabellarische Klassifikation/Regression in diesem Stack — schnellstes CPU-Training, natives Routing fehlender Werte, native Monotonie-Constraints. Wann nicht: bei sehr kleinen Stichproben (< ~500 Zeilen), wo blattweises Wachstum schnell overfittet; dort ist ebenenweises XGBoost oder eine einfache logistische Regression vorzuziehen.
Python · LightGBM-Meta-Label-Training auf Triple-Barrier-Labels
import lightgbm as lgb
from sklearn.model_selection import train_test_split
# X: one row per primary-strategy signal date. Columns e.g.
# log_ret_5d, log_ret_20d, realized_vol_20d, atr_14, frac_diff_price,
# ema_slope, rsi_14, bb_pctb, obv_z, dist_200ma
# y: triple-barrier label from mlfinpy -> 1 = profit barrier hit first, 0 = stop/time first
# w: sample weight from mlfinpy uniqueness/time-decay (NEVER plain 1s -- labels overlap)
X, y, w = features_df[feature_cols], labels_df["tb_label"], labels_df["sample_weight"]
X_train, X_val, y_train, y_val, w_train, w_val = train_test_split(
X, y, w, test_size=0.2, shuffle=False # never shuffle time series
)
params = {
"objective": "binary", "metric": "auc",
"num_leaves": 31, "learning_rate": 0.03,
"feature_fraction": 0.7, "bagging_fraction": 0.7, "bagging_freq": 5,
"min_data_in_leaf": 50,
# financial priors: e.g. [trend, vol, ...] -> win-prob non-decreasing in trend,
# non-increasing in realized vol, unconstrained (0) elsewhere
"monotone_constraints": [1, 0, -1, 0, 0, 1, 0, 0, 0, -1],
"verbosity": -1,
}
train_set = lgb.Dataset(X_train, label=y_train, weight=w_train)
val_set = lgb.Dataset(X_val, label=y_val, weight=w_val, reference=train_set)
model = lgb.train(params, train_set, num_boost_round=2000,
valid_sets=[val_set], callbacks=[lgb.early_stopping(100)])
meta_label_proba = model.predict(X_new) # P(this signal hits the profit barrier first)
XGBoost
Apache-2.0
Mechanismus: ebenenweise (tiefenweise) geboostete Bäume mit einer regularisierten Zielfunktion (L1/L2 auf Blattgewichten), die direkt in das Split-Finding-Kriterium eingebacken ist, plus ein gut optimierter Histogramm-/Quantil-Sketch-Split-Algorithmus für große Daten.
Wann einsetzen: als zweites, anders verzerrtes Modell für das Ensembling mit LightGBM (ebenen- vs. blattweises Wachstum dekorreliert Fehler nützlich); GPU-Training, wenn Sie der CPU entwachsen. Wann nicht: wenn Sie erstklassige native Behandlung kategorialer Features ohne Preprocessing brauchen — dort ist CatBoost besser.
Mechanismus: Ordered Boosting (ein permutationsgetriebenes Verfahren, das das Target-Leakage vermeidet, unter dem klassisches greedy Target-Encoding leidet) plus native geordnete Target-Statistiken für kategoriale Features — kein manueller Encoding-Schritt und weniger anfällig für Prediction Shift als naives Target-Encoding.
Wann einsetzen: Querschnitts-Modelle über Aktienkörbe mit vielen kategorialen Features (Sektor, Branche, Börse, Index-Zugehörigkeits-Flags), bei denen Sie sonst Target-Encoding von Hand bauen müssten. Wann nicht: bei engen CPU-Trainingszeit-Budgets — CatBoost ist im Fitting typischerweise das langsamste der drei, wenngleich schnell beim Scoren.
Rolle hier: keine konkurrierende Modellfamilie, sondern das Bindegewebe — Pipeline für leakage-sicheres In-Fold-Preprocessing, GroupKFold/eigene purged Splitter, GaussianMixture als leichtgewichtige Regime-Baseline, CalibratedClassifierCV, um GBDT-Scores in ehrliche Wahrscheinlichkeiten zu verwandeln, bevor Sie Positionen darauf dimensionieren (rohe GBDT-Ausgaben sind gut geranked, aber schlecht kalibriert).
Kalibrieren, bevor Sie dimensionieren
Die predict_proba-Ausgabe eines GBDT ist ein gutes Ranking-Signal, aber meist keine gut kalibrierte Wahrscheinlichkeit ab Werk — GBDTs neigen dazu, Vorhersagen Richtung 0/1 zu drücken. Wenn Ihr Positions-Sizer „Confidence" direkt verarbeitet (fractional-Kelly, meta-label-skalierte Größe), umhüllen Sie das Modell mit sklearn.calibration.CalibratedClassifierCV (isotonisch oder Platt), gefittet innerhalb des CV-Folds, sonst wird Ihre Dimensionierung systematisch überkonfident sein.
02
Deep-Learning-Zeitreihen-Architekturen
Dies sind die von Grund auf trainierten neuronalen Architekturen, die Sie selbst trainieren würden (typischerweise über neuralforecast, Apache-2.0, das sie alle implementiert), im Gegensatz zu den vortrainierten Foundation-Models in §3. Jede von ihnen wurde auf M4/M3/electricity/traffic/ETT in die Welt gebenchmarkt — keine wurde gegen Finanz-Renditereihen entworfen, und das ehrliche Urteil je Architektur spiegelt das wider.
Architecture
Year / venue
Core idea
Problem vs. plain LSTM
Financial-data verdict
LSTM / GRU
1997 / 2014
Gated recurrent units carry a cell state across time steps to fight vanishing gradients.
— (baseline)
Still a reasonable baseline for sequence classification (e.g. regime state); rarely beats GBDT on tabular-framed return prediction and is slower to train/tune.
TCN
Bai et al. 2018
Stacked causal, dilated 1-D convolutions (WaveNet-style) give an exponentially growing receptive field with fully parallel training.
Parallelizable (no sequential recurrence) and avoids vanishing/exploding gradients over long lookbacks.
Solid, fast baseline in neuralforecast; no documented financial edge over GBDT, but useful when you specifically need a long causal receptive field cheaply.
N-BEATS
Oreshkin et al. 2020 (ICLR)
Pure fully-connected stacks with backward/forward residual "basis expansion" blocks; interpretable trend/seasonality decomposition, no recurrence or attention.
Much simpler and more parallel than RNN/attention stacks; beat the M4-competition winner by ~3% and a statistical benchmark by ~11%.
Benchmarks are M3/M4/tourism — non-financial. Useful as a fast, interpretable univariate baseline; not evidence of edge on returns.
N-HiTS
Challu et al. 2023 (AAAI)
Extends N-BEATS with hierarchical interpolation and multi-rate input sampling so different blocks specialize in different frequency bands.
Cuts long-horizon compute and reportedly beats Transformer baselines by >25% on long-horizon benchmarks.
Same caveat as N-BEATS — a strong long-horizon forecaster on benchmark data, unproven on financial returns specifically.
Temporal Fusion Transformer (TFT)
Lim et al. 2021 (Int. J. Forecasting)
LSTM encoder for local processing + interpretable multi-head self-attention for long-range dependencies + a variable-selection gating network that also yields feature-importance-like interpretability.
Natively handles static covariates, known-future inputs (e.g. expiry date), and produces quantile forecasts with built-in interpretability — none of which vanilla LSTM offers.
The most finance-plausible of the deep architectures because of native covariate support; still no peer-reviewed evidence of consistent OOS financial-return edge over GBDT meta-labeling.
Informer
Zhou et al. 2021 (AAAI, best paper)
ProbSparse self-attention selects only the top-scoring queries, cutting attention cost from O(L²) to O(L log L) for very long sequences.
Makes long-sequence (thousands of steps) transformer forecasting computationally tractable.
Designed for long-horizon benchmark forecasting, not noisy short-memory financial returns; see the DLinear caveat below.
Autoformer
Wu et al. 2021 (NeurIPS)
Replaces standard attention with an auto-correlation mechanism plus built-in series decomposition (trend/seasonal) between blocks.
Captures periodicity more directly than dot-product attention; more robust on strongly seasonal series.
Financial returns have weak/no reliable seasonality at daily/swing frequency — decomposition assumption is a weaker fit than on electricity/traffic data.
FEDformer
Zhou et al. 2022 (ICML)
Performs attention in the frequency domain (via Fourier/wavelet transforms) with a mixture-of-experts decomposition for trend.
Frequency-domain attention scales sub-quadratically and captures global periodic structure.
Same seasonality-dependence caveat as Autoformer; frequency-domain priors are a mismatch for near-random-walk return series.
PatchTST
Nie et al. 2023 (ICLR)
Splits each series into subseries "patches" as transformer tokens (like ViT for time series) and treats each channel independently, sharing one transformer backbone across all channels.
Patch tokenization retains local semantics and cuts attention cost quadratically vs. point-wise tokens; channel-independence avoids spurious cross-channel overfitting. Reported ~21% MSE reduction over prior transformer SOTA on long-horizon benchmarks.
The architectural basis for several foundation models below (see §3); channel-independence is a genuinely useful inductive bias, but the MSE gains are on ETT/weather/traffic, not equities.
iTransformer
Liu et al. 2024 (ICLR spotlight)
"Inverts" the standard transformer: each variate's whole time series becomes one token, and attention runs across variates instead of across time steps, with a per-series FFN handling temporal encoding.
Captures multivariate correlations directly via attention without modifying core transformer components; generalizes to unseen variate counts.
Notably, in a 2026 financial-return benchmark (arXiv:2606.27100, see §3), iTransformer beat the pretrained foundation models on META — a rare case of a from-scratch architecture outperforming zero-shot foundation models on a specific liquid single-name equity.
Der DLinear-Vorbehalt — lesen, bevor Sie zu irgendeinem Transformer greifen
Zeng et al., „Are Transformers Effective for Time Series Forecasting?" (AAAI-23 Oral; Code: cure-lab/LTSF-Linear) zeigten, dass eine einzige lineare Schicht mit Trend-/Saison-Zerlegung (DLinear) Informer, Autoformer und FEDformer auf nahezu jedem gängigen Langhorizont-Benchmark schlug, mit dem Argument, dass deren berichtete Zugewinne größtenteils aus der nicht-autoregressiven Direct-Multistep-Trainingsstrategie stammten, nicht aus Attention selbst. Die Folgeanalyse von Hugging Face relativierte dies etwas (parameter-gematchte Transformer schneiden besser ab), aber die praktische Lektion bleibt: Benchmarken Sie jede tiefe Architektur stets gegen eine lineare/ARIMA-Baseline (Nixtla statsforecast, §11), bevor Sie einem komplexitätsgetriebenen Genauigkeitsgewinn trauen. Das gilt doppelt bei Finanzdaten, wo Rauschen das Signal weit stärker dominiert als bei Strom- oder Verkehrsdaten.
03
Zeitreihen-Foundation-Models auf Hugging Face
Vortrainierte, Zero-Shot-Zeitreihen-Forecaster sind real und nützlich — für Volatilität, nicht für die Kursrichtung. Eine Studie vom Juni 2026, eigens gebaut, um genau dies zu testen, „Pretrained Time-Series Foundation Models for Financial Return Forecasting" (Noguer i Alonso & Pereira Franklin, AI Finance Institute), benchmarkte TimeGPT, TimesFM-2.5, Moirai-2.0, Chronos und Chronos-2 gegen von Grund auf trainierte NBEATS/NHITS/PatchTST/iTransformer/KAN auf fünf liquiden US-Aktien (AAPL, AMZN, GOOG, JPM, META) mit einem Rolling-Origin-Protokoll gegen eine Random-Walk-Benchmark. Das Ergebnis: über zehn Asset-/Task-Kombinationen zeigten nur zwei eine statistisch signifikante Outperformance gegenüber dem Random Walk — Chronos bei AMZN und Moirai-2.0 bei GOOG — und die Autoren stellen unmissverständlich fest, dass „die Zugewinne gegenüber der Random-Walk-Benchmark klein und spärlich sind", und schließen, dass TSFMs „nützliche praktische Priors sind, die die Kosten der Modellentwicklung senken", aber ausdrücklich „keine universellen Maschinen zur statistisch verlässlichen Alpha-Generierung". Behandeln Sie jedes Modell weiter unten entsprechend: exzellente, auf CPU lauffähige Maschinen für Volatilitäts-/Vol-Forecast-Inputs in eine Sizing-Schicht; schwach bis Random-Walk für die Kursrichtung.
Model
Org
Architecture family
Params
Context
License
Chronos / Chronos-Bolt
Amazon Science
T5-style encoder-decoder over quantized/tokenized values (Chronos) or direct patch-based multi-step regression heads (Bolt)
Masked-encoder transformer with "any-variate" attention (flattens multiple series into one token sequence so it natively handles arbitrary channel counts and covariates)
Small/Base/Large (14M–311M)
Flexible, any positive length
CC BY-NC-4.0
Lag-Llama
ServiceNow / Morgan Stanley / Mila et al.
LLaMA-style decoder-only transformer fed engineered lag features (not raw tokenized values) as its "vocabulary"
~2.45M (deliberately tiny)
Recommended 32–1024 pts, tunable
Apache-2.0
MOMENT
Auton Lab, CMU
Transformer trained multi-task (forecast + classify + detect anomalies + impute) on the "Time-series Pile" corpus
Small/Base/Large (~40M–341M)
Task-dependent
MIT
IBM Granite-TimeSeries (PatchTSMixer / PatchTST / TTM)
IBM Research
PatchTSMixer = all-MLP mixer over patches (no attention); PatchTST variant = patch-transformer; TTM = "Tiny Time Mixer," a very small pretrained mixer
Architektur: Das ursprüngliche Chronos tokenisiert skalierte, quantisierte Zeitreihenwerte in ein festes Vokabular und führt sie durch einen Standard-T5-Encoder-Decoder — d. h. es behandelt Forecasting als Sprachmodellierung über ein diskretisiertes numerisches Alphabet. Chronos-Bolt ersetzt das autoregressive Token-für-Token-Decoding durch direkte Multi-Step-Patch-Regression, berichtet als bis zu ~250× schneller und ~20× speichereffizienter bei vergleichbarer oder besserer Genauigkeit (gemessen über WQL/MASE auf 27 Benchmark-Datensätzen), trainiert auf in der Größenordnung ~100 Mrd. Zeitreihen-Beobachtungen.
Fazit: beste Allround-Wahl für einen reinen CPU-Volatilitäts-Forecast-Input — Apache-2.0, schnell, Zero-Shot und das einzige Modell im 2606.27100-Benchmark, das Signifikanz erreichte (bei AMZN). Dennoch: ein signifikantes Ergebnis von zehn Versuchen ist kein Beleg für einen wiederholbaren direktionalen Edge.
Python · Zero-Shot-Volatilitätsprognose mit Chronos-Bolt
pip install chronos-forecasting torch
import torch
from chronos import BaseChronosPipeline
pipeline = BaseChronosPipeline.from_pretrained(
"amazon/chronos-bolt-base", # T5-style encoder-decoder, 205M params, Apache-2.0
device_map="cpu", # CPU is fine for daily-bar, small-batch inference
torch_dtype=torch.bfloat16,
)
# Feed REALIZED VOLATILITY, not raw price -- this is a vol forecaster, not an oracle
context = torch.tensor(realized_vol_20d.values[-512:])
quantiles, mean = pipeline.predict_quantiles(
context=context,
prediction_length=10, # 10-day-ahead vol forecast
quantile_levels=[0.1, 0.5, 0.9],
)
vol_forecast_median = quantiles[0, :, 1] # feed straight into GARCH/vol-target sizing (see §10)
Google TimesFM
Apache-2.0 · 200M/500M
Model Card:huggingface.co/google/timesfm-2.0-500m-pytorch (ICML 2024). Architektur: reiner Decoder-Transformer, trainiert, um Eingabe-Patches fester Länge (32 Punkte) zu konsumieren und längere Ausgabe-Patches (128 Punkte) direkt zu emittieren — näher am Next-Token-Ziel eines Sprachmodells als Chronos' Ansatz tokenisierter Werte, jedoch auf stetigen Patch-Embeddings statt einem diskretisierten Vokabular operierend.
Fazit: erreichte zusammen mit Moirai-2.0 den stärksten Durchschnittsrang über den Fünf-Aktien-Benchmark (führend bei AAPL/JPM/GOOG/AMZN) — aber gemäß der eigenen Einordnung des Papers gilt: ein starker Rang ≠ ein signifikanter Vorteil; keiner der Erfolge von TimesFM übersprang die Signifikanzschwelle des Random Walk. Gut, gut gepflegt, Apache-2.0, geeignet für Volatilität; kein grünes Licht für die Preisrichtung.
Model Card:huggingface.co/Salesforce/moirai-1.0-R-large. Architektur: Masked-Encoder-Transformer mit "Any-Variate Attention" — statt eines festen Embeddings pro Kanal flacht er eine beliebige Anzahl von Variablen (Zielgrößen + dynamische/statische Kovariaten) zu einer einzigen Token-Sequenz ab, sodass ein einzelnes vortrainiertes Modell nativ jede multivariate Prognoseaufgabe ohne datensatzspezifisches Nachtrainieren bewältigt. Moirai-MoE ersetzt das dichte FFN durch eine Mixture-of-Experts-Schicht für bessere Spezialisierung bei vergleichbaren Inferenzkosten.
Lizenz-Blocker — lesen, bevor Sie dies in einem Live-System einsetzen
Die Gewichte von Moirai und Moirai-MoE werden unter CC BY-NC 4.0 — ausschließlich nicht-kommerziell veröffentlicht. Ihre Nutzung (selbst nur zur Inferenz) innerhalb eines Systems, das Ihr eigenes Handelskapital verwaltet, ist wohl als kommerzielle Nutzung zu werten und wird von dieser Lizenz nicht abgedeckt, ohne eine separate Vereinbarung mit Salesforce. Chronos, TimesFM, Lag-Llama und MOMENT stehen unter Apache-2.0/MIT und unterliegen keiner derartigen Beschränkung — bevorzugen Sie diese für alles, was Live-Kapital berührt. Moirai eignet sich ausschließlich für persönliche Forschung/Backtesting.
Fazit: Moirai-2.0 lieferte das andere signifikante Ergebnis des Benchmarks (GOOG) und teilte sich mit TimesFM den stärksten Durchschnittsrang — technisch interessant, aber die Lizenzierung schließt es unabhängig davon aus einer Live-Pipeline aus.
Lag-Llama
Apache-2.0 · ~2.45M
Model Card:huggingface.co/time-series-foundation-models/Lag-Llama. Architektur: ein Decoder-only-Transformer im LLaMA-Stil, doch statt Rohwerte oder Patches zu verarbeiten, ist jedes Eingabe-Token ein Vektor aus klassischen Lag-Features (Werte bei t-1, t-2, t-7, t-30, ...) plus Datums-/Zeit-Kovariaten — d. h. es setzt einen Transformer auf eine feature-engineered Repräsentation, die an klassische autoregressive Modellierung erinnert, bewusst winzig gehalten (~2,45 Mio. Parameter) gegenüber den übrigen Einträgen hier.
Fazit: nicht unmittelbar Teil des 2606.27100-Benchmarks, aber architektonisch die "transparenteste" autoregressive Baseline der Gruppe — eine sinnvolle Zweitmeinung für die Volatilitätsprognose, wenn Sie etwas Kleineres/Schnelleres als Chronos-Bolt/TimesFM wünschen und weiterhin sauber unter Apache-2.0 bleiben wollen.
MOMENT
MIT · ~341M
Model Card:huggingface.co/AutonLab/MOMENT-1-large (ICML 2024; Auton Lab, Carnegie Mellon). Architektur: ein einzelnes Transformer-Backbone, multi-task vortrainiert über Prognose, Klassifikation, Anomalieerkennung und Imputation auf dem kuratierten "Time-series Pile", was es zum universellsten Modell dieser Gruppe macht statt zu einem Prognose-Spezialisten.
Wann einzusetzen: seine Köpfe für Anomalieerkennung und Imputation sind für eine Trading-Pipeline wohl differenzierter als sein Prognose-Kopf — z. B. das Markieren anomaler Intraday-Bars in einem Datenqualitäts-Gate oder das Imputieren von Lücken in einem Alt-Data-Feed — statt als eigentlicher Volatilitätsprognostiker. Lizenz: MIT, keine Beschränkung.
IBM Granite-TimeSeries
Apache-2.0
Model Card:huggingface.co/ibm-granite/granite-timeseries-patchtsmixer (siehe auch ibm-granite/granite-timeseries-patchtst und die "Tiny Time Mixer"-TTM-Reihe). Architektur: PatchTSMixer ersetzt Attention vollständig durch einen MLP-Mixer über Patches — überhaupt keine quadratischen Attention-Kosten — und berichtet 2–3× geringeren Speicher-/Laufzeitbedarf als Patch-Transformer bei vergleichbarer oder besserer Genauigkeit auf öffentlichen Long-Horizon-Benchmarks (z. B. 0,37 MSE bei der 96-Schritt-Prognose auf ETTh1).
Wann einzusetzen: die mit Abstand günstigste Option im Betrieb hier (es existieren TTM-Varianten mit unter 5 Mio. Parametern) — gut geeignet, wenn Sie eine leichtgewichtige, CPU-triviale Vol-Prognose-Komponente wünschen und die Zero-Shot-Generalität von Chronos/TimesFM nicht benötigen. Lizenz: Apache-2.0.
Die Ein-Satz-Policy für diesen gesamten Abschnitt
Nutzen Sie hier jedes Apache-2.0/MIT-Modell als Volatilitäts-/Kovariaten-Input für die deterministische Sizing-Schicht in §10; verwenden Sie keines davon — einschließlich der signifikanten Chronos-/Moirai-Ergebnisse — als eigenständiges Einstiegssignal. Die Autoren des 2606.27100-Benchmarks selbst bezeichnen den Effekt als "klein und spärlich", und iTransformer (eine von Grund auf trainierte Architektur, §2) schlug bei META jedes Foundation-Model, was unterstreicht, dass Vortraining bei Finanzreihen kein universeller Vorteil ist.
04
Financial NLP & LLMs
Finanz-Sentiment/NLP gehört in die Risikoschicht (ein Veto-/Regime-Feature), nicht in die Alpha-Schicht — laut der Quellenforschung aus §0 ist der eigenständige Vorteil aus Nachrichten-Sentiment weitgehend ein Look-Ahead-Artefakt, das Out-of-Sample verschwindet. Hier sind die drei Modelle, die man tatsächlich kennen sollte.
FinBERT (ProsusAI)
Apache-2.0 · ~110M
Model Card:huggingface.co/ProsusAI/finbert (~7,5 Mio. Downloads/Monat zum Zeitpunkt der Recherche). Architektur: BERT-base (12 Schichten, 768 Hidden, 110M Parameter), zusätzlich auf einem großen Finanzkorpus (Reuters TRC2) vortrainiert und anschließend für 3-Klassen-Sentiment auf der Financial PhraseBank feingetunt. Benchmark: 86 % Genauigkeit auf der vollständigen Financial PhraseBank (97 % auf der Teilmenge mit hoher Annotator-Übereinstimmung), rund 8 Punkte über einfachem BERT (arXiv:1908.10063).
Wann einzusetzen: EOD-Schlagzeilen-Scoring als Earnings-Blackout-/Bearish-Regime-Veto-Feature. Wann nicht: als eigenständiges Alpha-Signal oder bei Schlagzeilen mit 1-Tages-Horizont, die abgegriffen wurden und bei denen institutionelle Feeds den Kurs bereits bewegt haben.
Python · FinBERT-Sentiment-Inferenz
pip install transformers torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tok = AutoTokenizer.from_pretrained("ProsusAI/finbert")
model = AutoModelForSequenceClassification.from_pretrained("ProsusAI/finbert")
model.eval()
headlines = ["Company X beats earnings estimates, raises guidance",
"Regulators open investigation into Company X"]
with torch.no_grad():
inputs = tok(headlines, return_tensors="pt", padding=True, truncation=True)
probs = torch.softmax(model(**inputs).logits, dim=-1)
# label order per config.id2label: 0=positive, 1=negative, 2=neutral
labels = ["positive", "negative", "neutral"]
scores = [dict(zip(labels, p.tolist())) for p in probs]
# aggregate to a daily sentiment score; use ONLY as a veto/regime feature, not alpha
FinGPT
MIT (code)
Repo:github.com/AI4Finance-Foundation/FinGPT. Architektur: kein von Grund auf trainiertes Modell — ein LoRA-(Low-Rank Adaptation-)Fine-Tuning-Rezept, angewandt auf offene Basis-LLMs (LLaMA2-7B/13B für FinGPT v3.2/v3.3, ChatGLM2-6B für v3.1). LoRA friert die Basisgewichte ein und trainiert stattdessen kleine Low-Rank-Adapter-Matrizen, wodurch die trainierbaren Parameter von ~6,17 Mrd. auf ~3,67 Mio. sinken — praktikabel für das Fine-Tuning auf einer einzigen Consumer-GPU.
Anwendungsfälle: Finanz-Sentiment-Analyse, Q&A im Stil eines Robo-Advisors und Prognoseexperimente mit LLM-erzeugten Signalen (auch die Grundlage des "LLM-engineered signals"-Tracks des FinRL Contest). Lizenz-Nuance: der FinGPT-Trainings-/Inferenzcode steht unter MIT, doch die zugrunde liegenden LLaMA-Basisgewichte unterliegen Metas eigenen separaten Community-Lizenzbedingungen — prüfen Sie diese unabhängig, bevor Sie einen feingetunten Checkpoint kommerziell einsetzen.
FinBERT-tone
Apache-2.0 · ~110M
Model Card:huggingface.co/yiyanghkust/finbert-tone (Huang, Wang & Yang, Contemporary Accounting Research 2022). Architektur: ebenfalls BERT-base (12 Schichten / 768 Hidden / 12 Heads), aber auf einer anderen Korpus-Linie trainiert — vortrainiert auf 10-K-/10-Q-/Earnings-Call-Texten und anschließend auf 10.000 manuell annotierten Sätzen aus Analystenberichten feingetunt, was ihm trotz des ähnlichen Namens ein etwas anderes Ton-Klassifikationsverhalten verleiht als ProsusAIs FinBERT.
Wann einzusetzen: eine zweite, anders trainierte Sentiment-Meinung für das Ensembling mit FinBERT speziell bei Texten aus Analystenberichten oder Earnings Calls (statt bei allgemeinen Nachrichtenschlagzeilen).
05
Reinforcement Learning für den Handel
RL ist der am meisten gehypte und am wenigsten verlässliche Posten auf dieser gesamten Seite für eine zentrale Trading-Engine. Das Tooling ist wirklich gut; das ehrliche Fazit, gestützt durch den eigenen Benchmark-Wettbewerb der RL-Community, lautet, es auf enge, streng validierte Teilprobleme (z. B. Ausführungs-Timing) zu beschränken, statt es als primäre oder portfolioweite Engine einzusetzen.
Dynamic market-environment and dataset layer for FinRL (hundreds of market simulators)
Active, smaller community (~1–2k★)
Stable-Baselines3
MIT
Reliable, well-tested implementations of the underlying RL algorithms (PPO, SAC, DQN, A2C, TD3, DDPG, HER) that FinRL wraps
Actively maintained, the de facto standard PyTorch RL library
TensorTrade
Apache-2.0
RL trading-environment framework (Gym-style)
Maintenance stalled — a community fork, TensorTrade-NG, was created explicitly because the original "needed a lot of refactoring, was outdated, and looked not really maintained." Treat as unmaintained for planning purposes.
Die vier Algorithmus-Familien (je eine Zeile)
PPO (Proximal Policy Optimization) — on-policy, diskrete oder kontinuierliche Aktionen; beschneidet den Policy-Update-Schritt, um nahe an der alten Policy zu bleiben, und tauscht etwas Stichprobeneffizienz gegen Trainingsstabilität. Die standardmäßige erste Wahl in den meisten FinRL-Beispielen.
SAC (Soft Actor-Critic) — off-policy, ausschließlich kontinuierliche Aktionen; Maximum-Entropy-Ziel (belohnt Exploration explizit) mit einem Replay-Buffer, im Allgemeinen stichprobeneffizienter als PPO, aber empfindlicher gegenüber Hyperparametern.
DQN (Deep Q-Network) — off-policy, ausschließlich diskrete Aktionen; lernt eine Aktionswertfunktion über einen Replay-Buffer und ein Target-Netzwerk. Benötigt einen diskretisierten Aktionsraum (z. B. buy/hold/sell), was schlecht zu kontinuierlichem Position-Sizing passt.
A2C (Advantage Actor-Critic) — on-policy, diskret oder kontinuierlich; ein einfacherer, synchroner Verwandter von A3C, in FinRLs eigenen Benchmarks im Allgemeinen der schwächste der vier bei Finanzaufgaben.
Warum RL für den Handel konkret fragil ist — nicht bloß "schwierig"
Nicht-stationäre Reward-Landschaft: die Wertfunktion eines RL-Agenten wird gegen ein bestimmtes historisches Regime gelernt; wenn sich das Regime verschiebt (wie es Finanzmärkte ständig tun), optimiert die gelernte Policy auf eine Reward-Oberfläche, die nicht mehr existiert — anders als bei einem neu trainierten GBDT-Meta-Labeler gibt es für ein Policy-Netzwerk keine einfache "Refit auf dem jüngsten Fenster"-Lösung, ohne katastrophales Vergessen zu riskieren. Stichprobenineffizienz: Deep RL benötigt typischerweise Millionen von Umgebungsinteraktionen zur Konvergenz; Sie haben genau eine nicht wiederholbare Historie des Marktes, sodass "mehr Daten" entweder Simulation bedeutet (die Ihre eigenen Annahmen als Ground Truth kodiert) oder Jahre zusätzlicher Echtzeit-Wartezeit. Reward-Hacking bei Backtests: ein Agent, der den kumulierten simulierten PnL optimiert, wird bereitwillig lernen, Eigenheiten des Simulators auszunutzen (unrealistische Fill-Annahmen, null Markteinfluss, exakte Rundung der Backtest-Engine) statt eines echten Marktvorteils — genau der Fehlermodus, den das FinRL-Contests-Paper (arXiv:2504.02281) dokumentiert: eingereichte Agenten mit hoher Wahrscheinlichkeit für Backtest-Overfitting werden von den Organisatoren des Wettbewerbs selbst explizit auf einem Signifikanzniveau von 10 % abgelehnt — die Menschen, die das RL-Trading-Ökosystem aufbauen, halten die meisten eingereichten RL-Trading-Agenten standardmäßig für statistisch nicht von overfittetem Rauschen unterscheidbar.
Praktischer Anwendungsrahmen, falls Sie RL überhaupt einsetzen: ein enges Teilproblem mit einem naturgemäß MDP-förmigen Reward (z. B. Order-Ausführungs-Timing innerhalb einer festen Parent-Order, VWAP-Tracking), evaluiert mit derselben PBO-/DSR-Disziplin wie alles andere in §14 — niemals als primäre Entry-/Exit-/Sizing-Engine.
06
Vollständige Quant-ML-Pipelines — Microsoft Qlib
Qlib kommt einer schlüsselfertigen KI-Quant-Forschungsplattform im Open Source am nächsten — eine Datenschicht, eine Feature-Engineering-DSL, ein Model Zoo und ein Walk-Forward-Backtest-/Portfolioanalyse-Harness, über YAML-Workflow-Configs miteinander verdrahtet. MIT-lizenziert (microsoft/qlib), Zehntausende GitHub-Stars, MIT seit dem Open-Sourcing im September 2020, aktiv veröffentlicht (v0.9.7, August 2025) und nun mit Microsofts RD-Agent für automatisierte Forschungsschleifen-Experimente gekoppelt.
Alpha158 vs. Alpha360 — die zwei integrierten Feature-Sets
Raw normalized OHLCV history flattened over a 60-day lookback (6 fields × 60 days = 360 columns), essentially no feature engineering
Feature relationships
Low spatial/temporal structure between columns — a classic tabular feature matrix
Strong spatial-temporal structure — designed for models that learn their own representation from raw sequences
Best-paired models
LightGBM, XGBoost, CatBoost, linear/MLP models
GRU, LSTM, Transformer-family, ALSTM, GATs — sequence models that benefit from raw structure
Workflow-/Config-System und integrierter Model Zoo
Qlib-Experimente werden typischerweise durch eine einzige YAML-Datei gesteuert, die von der qrun-CLI konsumiert wird und den Data Handler (Alpha158/360 oder benutzerdefiniert), das Modell, den Datensatz-Split, die Portfoliostrategie und die Backtest-Parameter deklariert — dies macht das Austauschen von LightGBM gegen einen GRU oder einen TFT-Wrapper zu einer einzeiligen Config-Änderung statt zu einer Neuimplementierung. Der integrierte Model Zoo umfasst klassische und Deep-Ansätze: LGBModel (LightGBM), XGBModel, CatBoostModel, MLP, GRU/LSTM/ALSTM (rekurrent), Transformer, TFT-Wrapper, TabNet, HIST, IGMTF sowie mehrere Graph-/Attention-Forschungsmodelle (GATs, KRNN, Localformer) — alle über dasselbe Workflow-Harness trainiert und evaluiert, mit einem gemeinsamen Walk-Forward-Backtest-/IC-Analyse-Report.
YAML · minimale Qlib-Workflow-Config (LightGBM auf Alpha158)
qlib_init:
provider_uri: "~/.qlib/qlib_data/custom_nse" # see note below on pointing Qlib at NSE data
region: in # generic region tag; India isn't a stock Qlib region out of the box
market: &market custom_nse_500
benchmark: &benchmark NIFTY500
data_handler_config: &data_handler_config
start_time: 2010-01-01
end_time: 2025-12-31
fit_start_time: 2010-01-01
fit_end_time: 2019-12-31
instruments: *market
task:
model:
class: LGBModel
module_path: qlib.contrib.model.gbdt
kwargs:
loss: binary
num_leaves: 31
learning_rate: 0.03
monotone_constraints: [1, 0, -1, 0]
dataset:
class: DatasetH
module_path: qlib.data.dataset
kwargs:
handler:
class: Alpha158
module_path: qlib.contrib.data.handler
kwargs: *data_handler_config
segments:
train: [2010-01-01, 2019-12-31]
valid: [2020-01-01, 2021-12-31]
test: [2022-01-01, 2025-12-31]
# run with: qrun this_config.yaml
Qlib auf benutzerdefinierte (z. B. NSE-)Daten ausrichten
Qlib liefert US- und China-Datenprovider von Haus aus mit; NSE/BSE erfordert, dass Sie Ihren eigenen binären Datenspeicher mit scripts/dump_bin.py aufbauen und ihn mit Point-in-Time-OHLCV-Parquet-/CSV-Dateien speisen, die Sie bereits zusammengestellt haben (gemäß der Disziplin eines survivorship-bias-freien Datenplans). Sie benötigen außerdem einen benutzerdefinierten Handelskalender (NSE-Feiertage unterscheiden sich von NYSE/China) und müssen Ihre Instrument-Universe-Datei registrieren — Qlibs Datenschicht ist nach der Konvertierung formatunabhängig, sodass Alpha158/360 und der gesamte Model Zoo nach Abschluss des Dump-Schritts unverändert auf NSE-Daten funktionieren.
07
Financial-ML-Methoden von López de Prado — mlfinpy & skfolio
López de Prados Toolkit aus Advances in Financial Machine Learning bedeutete früher eine kostenpflichtige mlfinlab-Lizenz — das ist nicht mehr der Fall. Zwei kostenlose, permissiv lizenzierte Pakete decken nun Triple-Barrier-Labeling, Meta-Labeling, fraktionale Differenzierung, Sample-Uniqueness-Gewichtung, CPCV und HRP ab.
Package
License
Covers
mlfinpy
MIT
Triple-barrier labeling, meta-labeling, fractional differentiation, sample-weight/uniqueness utilities — a modern Pythonic re-implementation of the AFML code snippets
skfolio
BSD-3-Clause
scikit-learn-compatible portfolio optimization and model selection: CombinatorialPurgedCV out of the box, plus HRP, HERC, risk-budgeting, CVaR/CDaR optimization
mlfinlab (paid)
Commercial
The original, packaged, paid version — only worth it if you specifically want Hudson & Thames' maintained extras beyond what the two free packages cover
Python · mlfinpy Triple-Barrier-Labeling
pip install mlfinpy
from mlfinpy.labeling import get_events, add_vertical_barrier, get_bins
from mlfinpy.util import get_daily_vol
# causal, EWMA-based daily volatility -- uses data strictly up to t, no leakage
daily_vol = get_daily_vol(close=prices, lookback=50)
vertical_barriers = add_vertical_barrier(
t_events=signal_dates, close=prices, num_days=10 # time-limit barrier
)
triple_barrier_events = get_events(
close=prices,
t_events=signal_dates, # your primary (Pine) strategy's signal dates
pt_sl=[2.0, 1.5], # profit-take / stop-loss as multiples of daily_vol
target=daily_vol,
min_ret=0.0005,
num_threads=4,
vertical_barrier_times=vertical_barriers,
)
labels = get_bins(triple_barrier_events, prices)
# labels['bin'] -> 1 = profit barrier hit first, 0 = stop/time barrier hit first
# labels['ret'] -> realized return at the barrier that was hit
# labels['t1'] -> the barrier-touch timestamp (needed for purging downstream)
Python · skfolio CombinatorialPurgedCV für das Meta-Label-Modell
pip install skfolio
from skfolio.model_selection import CombinatorialPurgedCV, cross_val_predict
from sklearn.pipeline import Pipeline
import lightgbm as lgb
meta_label_pipeline = Pipeline([
("model", lgb.LGBMClassifier(num_leaves=31, learning_rate=0.03,
min_child_samples=50)),
])
# n_folds=10, n_test_folds=2 -> C(10,2) = 45 combinatorial train/test paths
# purged_size / embargo_size sized to the max holding horizon (t1 - t0), NOT a flat 1%
cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2,
purged_size=10, embargo_size=10)
# returns an empirical DISTRIBUTION of out-of-sample paths, not one score --
# use it to compute PBO and the Deflated Sharpe Ratio, not a single train/test split
oos_paths = cross_val_predict(estimator=meta_label_pipeline, X=X, y=y,
cv=cv, sample_weight=w)
Was jede Technik Ihnen bringt
Fraktionale Differenzierung (mlfinpy.features.frac_diff / Fixed-Width-FFD-Variante) — findet die minimale Differenzierungsordnung d (oft 0,2–0,5), die einen ADF-Stationaritätstest besteht und dabei eine Korrelation >0,9 zur Level-Reihe beibehält, was einen stationären Input liefert, der Gedächtnis bewahrt — strikt besser für Baum-/lineare Modelle als Rohrenditen (kein Gedächtnis) oder Rohpreise (nicht-stationär).
Sample-Uniqueness-Gewichtung — Triple-Barrier-Labels überlappen sich zeitlich (eine 10-tägige Halteperiode bedeutet, dass benachbarte Signale Label-Fenster teilen), was die IID-Annahme verletzt, auf die sich die meiste ML-Theorie stützt. Gewichten Sie jede Stichprobe nach ihrer durchschnittlichen Uniqueness (Kehrwert der Anzahl gleichzeitiger Labels) zuzüglich Time-Decay, sonst ist Ihre effektive Stichprobengröße nur ein Bruchteil Ihrer Zeilenanzahl und jeder nachgelagerte Signifikanztest ist überzeichnet.
Combinatorial Purged CV (CPCV) — erzeugt viele Train-/Test-Pfad-Kombinationen (nicht einen einzigen Walk-Forward-Pfad), purged Trainingszeilen, deren Label-Fenster den Test-Fold überlappt, und verhängt ein Embargo als Puffer nach jedem Test-Fold. Erzeugt eine vollständige Verteilung der Out-of-Sample-Sharpe-Ratios (als Input für PBO und DSR) statt einer einzelnen Punktschätzung — deshalb ist es strukturell verlässlicher als einfaches Walk-Forward.
HRP (Hierarchical Risk Parity) (skfolio.optimization.HierarchicalRiskParity) — allokiert über hierarchisches Clustering der Korrelationsmatrix, statt eine verrauschte Kovarianzmatrix zu invertieren (wie es die Mean-Variance-Optimierung tut), was es weit robuster gegenüber Schätzfehlern bei einem Korb korrelierter Aktien macht.
08
Regime-Erkennung — hmmlearn & ruptures
Dies ist der Abschnitt, in dem der mit Abstand häufigste stille Leakage-Bug beim Retail-Regime-Gating steckt — und in dem es nützlicher ist, das falsche Muster neben dem richtigen zu zeigen, als es in Prosa zu beschreiben.
Library
License
Maturity
Role
hmmlearn
BSD
Mature, scikit-learn-style API, ~3k★
Gaussian/GMM/Categorical HMMs for a discrete calm/stormy regime state
ruptures
BSD-2-Clause
Mature, academic (ENS Paris-Saclay/CNRS)
Offline changepoint detection — PELT (exact, linear-cost, unknown number of changes), binary segmentation (BinSeg, greedy/approximate), and sliding-window methods
Der stille Look-Ahead-Bug Nr. 1: Full-Sample-geglättetes HMM-Decoding
Die standardmäßige, einfachste Art, hmmlearn aufzurufen — GaussianHMM auf Ihrer gesamten Historie zu fitten und dann .predict() für Regime-Labels aufzurufen — verwendet im Hintergrund Viterbi-/geglättetes Decoding. Das Regime-Label zum Zeitpunkt t wird unter Verwendung der gesamten Sequenz gewählt, einschließlich allem, was nach t kommt. Das Gate "weiß" faktisch, dass eine Krise bevorsteht, bevor sie eintritt. Jede beeindruckende veröffentlichte HMM-Drawdown-Reduktionszahl (56 %→24 % max DD usw.), die dies nicht explizit kontrolliert, ist sehr wahrscheinlich auf diese Weise zustande gekommen. Unten: das undichte Muster und das kausale, Walk-Forward-, gefilterte-Posterior-Muster, das tatsächlich einsatzfähig ist.
Python · FALSCH — leaky, über die gesamte Stichprobe geglättetes Decoding (nicht in Produktion einsetzen)
from hmmlearn.hmm import GaussianHMM
model = GaussianHMM(n_components=2, covariance_type="diag", n_iter=1000)
model.fit(X_full) # fit on the ENTIRE history -- future leaks into the fit
regimes = model.predict(X_full) # Viterbi = globally-smoothed decode over the whole path
# regimes[t] used information from t+1 ... T. This is look-ahead bias.
# Any backtest of a regime gate built this way is invalid and will not reproduce live.
Python · KORREKT — kausales, Walk-forward-Regime-Gate auf Basis der gefilterten Posterior
from hmmlearn.hmm import GaussianHMM
import numpy as np
regime_at_t = np.full(len(X), np.nan)
model, refit_every, min_train = None, 63, 500 # e.g. refit quarterly
for t in range(min_train, len(X)):
if model is None or t % refit_every == 0:
model = GaussianHMM(n_components=2, covariance_type="diag", n_iter=200)
model.fit(X[:t]) # ONLY data strictly before t
# forward-algorithm FILTERED posterior using data up to and including t --
# no smoothing, no future information, no re-fit on data that includes t's label use
posteriors = model.predict_proba(X[:t + 1])
regime_at_t[t] = posteriors[-1].argmax() # today's regime, knowable today
# regime_at_t is safe to merge into the feature frame for both backtest and live use.
# Expect a MUCH smaller, laggier drawdown benefit than the full-sample-smoothed version --
# that gap IS the size of the leakage bug you just closed.
ruptures ist das ergänzende Werkzeug, wenn du Changepoints statt eines persistenten Regime-Zustands suchst — etwa um einen Volatilitätsregime-Bruch in einer EWMA-Reihe zu markieren und damit einen HMM-Refit auszulösen, oder als alternativen Regime-Grenzdetektor zur Gegenprüfung der HMM-Übergänge. Pelt (exakte Suche mit linearer Laufzeit, unbekannte Anzahl an Bruchpunkten, benötigt einen Penalty-Parameter) ist der Standard; Binseg tauscht Exaktheit gegen Geschwindigkeit bei längeren Reihen; fensterbasierte Verfahren sind am günstigsten, aber bei subtilen Brüchen am wenigsten präzise. Wie das HMM solltest du es für den Live-Einsatz in einem expandierenden/rollierenden Fenster ausführen — die Standard-API von ruptures ist ebenfalls standardmäßig ein Offline-Verfahren über die gesamte Reihe.
09
Backtesting- & Ausführungs-Engines
Keine einzelne Engine ist für jede Phase die richtige. Nutze eine vektorisierte Engine, um Tausende von Parameterkombinationen vorzusortieren, und validiere anschließend jeden Überlebenden erneut auf einer ereignisgesteuerten Engine mit realistischen Fills, bevor du Kapital riskierst — die beiden Phasen zu vermischen (einem Backtest der vektorisierten Engine als endgültige Antwort zu vertrauen) ist ein häufiger, teurer Fehler.
Engine
Speed
Fill realism
License
Maintenance
Best-fit use case
vectorbt (community)
Extremely fast (Numba-vectorized, thousands of configs at once)
Weak — vectorized fills, easy to fool yourself
Apache-2.0 + Commons Clause
Community edition maintenance-frozen; active dev moved to paid vectorbtPRO
Fast first-pass parameter sweep / triage only
backtrader
Moderate (pure Python, event-driven)
Moderate (configurable slippage/commission, but manual)
GPL-3.0
Stalled ~2021 — open PRs/issues unmerged for years
Legacy strategies only; don't start new work here
Zipline-reloaded
Moderate
Good (Quantopian-derived fill/slippage models)
Apache-2.0
Community-maintained fork (stefan-jansen), modest but real activity
Research backtests wanting the original Zipline/Quantopian API and pipeline model
NautilusTrader
Fast (Rust core)
High — same strategy code path for backtest and live
LGPL-3.0-or-later
Very active, ~24k★, production-grade
Final realistic-fill re-validation and the bridge to live — the one tool built for research-to-live parity
QuantConnect LEAN
Fast (C#/.NET core, Python API)
High — institutional-grade fill/slippage/margin models
Apache-2.0
Very active, ~19k★, backs a commercial cloud platform
Full-featured alternative to NautilusTrader, especially with QuantConnect's hosted data/cloud/live options
bt
Moderate
Moderate (higher-level "Algo" abstraction over vectorized fills)
MIT
Actively maintained (releases into 2026)
Fast, readable portfolio-level (multi-asset allocation) backtests, less suited to per-trade microstructure realism
backtesting.py
Fast (single-asset, vectorized-ish)
Basic (simple slippage/commission model)
AGPL-3.0
Active, small footprint, ~2.4k★
Quick single-asset prototyping only — AGPL is a real constraint if you build a hosted/SaaS product on it
Warum die Architektur von NautilusTrader tatsächlich zählt
Die meisten Fälle von „großartiger Backtest, enttäuschender Live-Betrieb“ sind keine Modellfehler — es sind Bugs durch Research/Production-Skew: Deine Backtest-Engine und dein Live-Ausführungscode sind zwei getrennte Codebasen, die still auseinanderdriften (hier eine Fill-Preis-Annahme, dort ein Off-by-one-Bug beim Bar-Timing), und nichts erzwingt ihre Konsistenz. Das Rust-Core-, ereignisgesteuerte Design von NautilusTrader führt denselben Strategiecode — dieselben Klassen, dieselben Event-Handler — im Backtest-, Paper- und Live-Modus aus; nur die Daten-/Ausführungsadapter ändern sich. Diese architektonische Entscheidung eliminiert eine ganze Klasse von Bugs konstruktiv statt durch Disziplin, und genau deshalb ist es das richtige Werkzeug für die Rolle der „finalen Re-Validierung mit realistischen Fills und Brücke zur Produktion“ und nicht bloß ein Nice-to-have.
Lizenzhinweis — LGPL-3.0, nicht GPL
NautilusTrader steht unter LGPL-3.0-or-later, nicht unter der strengeren GPL-3.0, die backtrader und freqtrade regelt. LGPL erlaubt das Linken/Nutzen der Bibliothek aus proprietärem Code, ohne deinen Strategiecode offenlegen zu müssen, solange Änderungen an NautilusTrader selbst (falls vorhanden) zurückgegeben werden — für ein Closed-Source-Handelssystem materiell weniger restriktiv als eine reine GPL-Abhängigkeit. Bestätige dennoch die aktuellen Lizenzbedingungen anhand des Repositorys, bevor du kommerziell deployst.
10
Portfoliokonstruktion & Risiko
Hier wird „Drawdown-Kontrolle“ tatsächlich umgesetzt — als deterministische Mathematik, die Volatilitätsprognosen und Meta-Label-Konfidenz verarbeitet, nicht als weitere Vorhersageaufgabe.
Library
License
Role
PyPortfolioOpt
MIT
Classical mean-variance / efficient frontier, Black-Litterman, shrinkage covariance estimators, and HRP — the most approachable API of the three
Riskfolio-Lib
BSD-3-Clause
Deeper risk-based allocation: HRP/HERC, ~24 risk measures including CVaR/CDaR/EVaR, risk-parity/risk-budgeting, built on CVXPY convex optimization
arch
NCSA
GARCH/EGARCH/GJR-GARCH/TARCH volatility-family models — the standard econometric volatility forecaster feeding vol-targeted sizing
pip install arch
from arch import arch_model
import numpy as np
returns_pct = 100 * log_returns.dropna() # arch expects % returns for numerical stability
# GJR-GARCH(1,1,1) with Student-t errors -- captures the leverage effect (vol reacts more to
# negative returns than positive ones), which plain GARCH(1,1) misses
am = arch_model(returns_pct, vol="GARCH", p=1, o=1, q=1, dist="t")
res = am.fit(disp="off", last_obs=train_end_date) # fit only on data up to the current date
fcast = res.forecast(horizon=10, reindex=False)
vol_forecast_daily = np.sqrt(fcast.variance.values[-1]) / 100 # back to decimal daily vol
target_vol_daily = 0.10 / (252 ** 0.5) # ~10% annualized portfolio vol target
position_scale = target_vol_daily / vol_forecast_daily[0]
position_size = base_size * min(position_scale, max_leverage_cap) # always cap leverage
PyPortfolioOpt
MIT
Wann einsetzen: schnelle HRP- oder Shrinkage-Kovarianz-Allokation über einen Korb hinweg, ohne einen vollständigen Stack für konvexe Optimierung hereinzuholen. Wann nicht: wenn du CVaR/CDaR-Zielfunktionen oder exotischere Risikomaße benötigst — das ist die Aufgabe von Riskfolio-Lib.
Python · HRP-Allokation
from pypfopt import HRPOpt
hrp = HRPOpt(returns=daily_returns_df) # NOT prices -- pass returns
weights = hrp.optimize() # hierarchical-clustering-based, no covariance inversion
Riskfolio-Lib
BSD-3
Wann einsetzen: immer dann, wenn die Zielfunktion explizit tail-risk-bewusst ist (CVaR/CDaR) statt varianzbasiert — besser passend zu einem Mandat auf „geringsten Drawdown“ als Mean-Variance.
Python · CVaR-optimales Portfolio
import riskfolio as rp
port = rp.Portfolio(returns=daily_returns_df)
port.assets_stats(method_mu="hist", method_cov="hist")
weights = port.optimization(model="Classic", rm="CVaR", obj="MinRisk", rf=0, l=0)
11
Feature-Engineering & Prognose-Utilities
Bevor du irgendeinem GBDT- oder Foundation-Model-Ergebnis vertraust, benchmarke es gegen die langweilige Baseline. Diese beiden Bibliotheken decken die automatisierte Feature-Extraktion und die klassischen Prognose-Baselines ab, die du niemals überspringen solltest.
Library
License
Role
tsfresh
MIT
Automated extraction of hundreds of statistical/signal-processing time-series features, with a built-in hypothesis-testing-based relevance filter (the "FRESH" algorithm) to control false-discovery rate on the feature explosion
Nixtla statsforecast
Apache-2.0
Fast classical/econometric baselines — AutoARIMA, AutoETS, AutoCES, Theta — the mandatory benchmark before believing any ML "edge"
Nixtla mlforecast
Apache-2.0
Machine-learning forecasting at scale (pandas/polars/Spark/Dask/Ray backends) with the same lag-feature-engineering plumbing regardless of backend
Nixtla neuralforecast
Apache-2.0
30+ neural architectures under one API — every model in §2 (NBEATS, NHITS, TFT, Informer, Autoformer, FEDformer, PatchTST, iTransformer, TimeLLM, ...) available without hand-rolling each paper's code
pip install tsfresh
from tsfresh import extract_relevant_features
# long-format df: columns [id, time, value]; y indexed by id (e.g. triple-barrier label)
features = extract_relevant_features(
long_format_df, y=labels_by_id, column_id="id", column_sort="time",
fdr_level=0.01, # false-discovery-rate control -- do NOT skip this on financial data
)
# re-run the relevance filter INSIDE each CV fold in production, never on the full dataset
Python · obligatorische Baseline, bevor du dem „Edge“ eines Modells vertraust
pip install statsforecast
from statsforecast import StatsForecast
from statsforecast.models import AutoARIMA, AutoETS
sf = StatsForecast(models=[AutoARIMA(), AutoETS()], freq="D", n_jobs=-1)
sf.fit(train_df)
baseline_forecast = sf.predict(h=10)
# your GBDT / foundation-model forecast must beat THIS, net of cost, or there is no edge
12
MLOps für ein Live-Handelssystem
MLOps-Tooling geht hier nicht um Skalierung — es geht um Ehrlichkeit. Die mit Abstand tragendste MLOps-Funktion in diesem gesamten Stack ist die Disziplin bei der Trial-Anzahl für die Deflated Sharpe Ratio: jede Backtest-Konfiguration, die du jemals ausprobierst, für immer protokolliert, damit die Korrektur für multiples Testen gegen deine echte Trial-Anzahl berechnet wird und nicht gegen die schmeichelhafte Teilmenge, an die du dich erinnerst.
Tool
License
Role
When to adopt
MLflow
Apache-2.0
Experiment tracking (params/metrics/artifacts) + model registry with stage transitions
Early — every single backtest run, from day one, feeds the DSR trial count
Once a strategy is running on a schedule against live data
NannyML
Apache-2.0
Label-free live performance estimation — CBPE for classifiers, DLE for regressors — estimates real-world accuracy before ground-truth labels are even available
Once paper/live trading is running and labels arrive with a lag (exactly the triple-barrier situation)
Prefect
Apache-2.0
Pythonic pipeline orchestration: scheduling, retries, caching, event-driven triggers for the nightly ingest→feature→predict→size→alert DAG
Once a plain cron script becomes unwieldy — not needed for an MVP
Dagster
Apache-2.0
Alternative orchestrator with stronger data-asset lineage/typing — heavier but better observability at scale
If you outgrow Prefect's simplicity and want asset-level lineage across many pipelines
Python · MLflow-Logging, das die DSR-Trial-Count-Disziplin tatsächlich erzwingt
pip install mlflow
import mlflow
with mlflow.start_run(run_name="lgbm_meta_label_v37"):
mlflow.log_params(params) # every hyperparameter tried
mlflow.log_param("cv_scheme", "CombinatorialPurgedCV(10,2)")
mlflow.log_param("feature_set_hash", feature_set_hash) # so re-used feature sets don't double count
mlflow.log_metric("oos_sharpe_median", oos_sharpe_median) # across the CPCV path distribution
mlflow.log_metric("pbo", pbo_value)
mlflow.log_metric("trial_number_in_family", trial_counter) # THIS feeds the Deflated Sharpe N
mlflow.lightgbm.log_model(model, "model")
# Query the full run history to compute N for the Deflated Sharpe Ratio -- include prior
# Pine-Script optimization trials too (see §14), not just the ML runs.
Warum das nicht verhandelbar ist, kein Nice-to-have
Die Deflated Sharpe Ratio benötigt eine ehrliche Zählung jeder Konfiguration, die du jemals gegen diese Daten ausprobiert hast — nicht nur des finalen Modells. Ohne ein System of Record wird die Trial-Anzahl aus dem Gedächtnis rekonstruiert, und zwar genau in dem Moment, in dem du am stärksten motiviert bist, sie zu niedrig anzusetzen. MLflow (oder ein Äquivalent) macht aus „wie viele Dinge habe ich tatsächlich ausprobiert“ statt einer selbst berichteten Schätzung eine abfragbare Tatsache.
13
Daten & alternative Datensätze auf Hugging Face
Über die Modell-Hubs hinaus führt der Datasets Hub von Hugging Face eine wachsende Sammlung finanzrelevanter Datensätze, die sich für Prototyping und Sentiment-Arbeit lohnen — behandle sie allesamt als Prototyping-/Backup-Quellen, nicht als survivorship-bias-freie Produktionsdaten (siehe die Data-Plan-Disziplin im zugrunde liegenden Research-Report).
Labeled Twitter/X financial and crypto sentiment — useful for fine-tuning or validating a FinBERT-style veto filter
huggingface.co/datasets?search=finance
Hub search
The Hub's finance-tagged dataset list changes frequently — always re-search rather than trusting a static list; verify licensing per-dataset before any commercial use
Numerai — ein anderes Spiel, keine Datenquelle für dein eigenes System
Numerai versteht man am besten als Marktplatz für Modellierungs-Skill, nicht als Datensatz, den du in deine eigene Pipeline einbindest. Das Kern-Turnier liefert kostenlose, vorab aufbereitete, obfuskierte Features — PCA-transformiert, z-standardisiert und zeitlich segmentiert, sodass du erstklassige Finanzdaten modellieren kannst, ohne jemals zu wissen, welche Aktien oder Daten du betrachtest (jede wöchentliche „Era“ hat IDs, die sich per Design nicht über Eras hinweg zuordnen lassen). Numerai Signals ist das komplementäre Produkt: Du reichst Vorhersagen auf deinem eigenen Universum/deinen eigenen Features ein und zielst auf Signale ab, die orthogonal zu dem sind, was Numerais bestehender Modell-Stack bereits erfasst. Alle eingereichten Modelle speisen ein stake-gewichtetes Meta-Modell, das wiederum Numerais eigenen Hedgefonds steuert. Rahme es als Optionalität zur Monetarisierung von Modellierungs-Skill ein — bewertet anhand mehrjähriger, drawdown-inklusiver Performance, nicht als schneller Weg zu Einkommen — und als interessantes benachbartes Ökosystem statt als Komponente der Pipeline in §14.
14
Referenzarchitektur — vollständige Pipeline
Wie ein fortgeschrittener Nutzer jede der obigen Bibliotheken durchgängig zu einer Pipeline verdrahtet. Datenaufnahme → Qlib/tsfresh-Features → fraktionale Differenzierung (mlfinpy) → LightGBM-Meta-Label-Modell, validiert mit verschachtelter Combinatorial Purged CV (skfolio) → kausales hmmlearn-Regime-Gate → GARCH-basierte (arch) vol-getargetete Positionsgrößenbestimmung → NautilusTrader-Backtest → MLflow-Logging → PickMyTrade-Webhook zur Ausführung.
Jeder Pfeil ist eine Datenübergabe zwischen einer unabhängig austauschbaren Bibliothek — keine Phase hängt von einer bestimmten Wahl in einer anderen ab.
Python · Skelett der End-to-End-Referenzpipeline
"""
Reference pipeline skeleton: data ingestion -> PickMyTrade execution.
Every preprocessing step is fit INSIDE the CPCV training fold only -- never on
the full dataset. Illustrative structure; wire in your own data store / config.
"""
import numpy as np
import pandas as pd
import lightgbm as lgb
import mlflow
import requests
from hmmlearn.hmm import GaussianHMM
from arch import arch_model
from mlfinpy.labeling import get_events, add_vertical_barrier, get_bins
from mlfinpy.util import get_daily_vol
from mlfinpy.features import frac_diff_ffd
from skfolio.model_selection import CombinatorialPurgedCV, cross_val_predict
from sklearn.pipeline import Pipeline
from qlib.contrib.data.handler import Alpha158
from tsfresh import extract_relevant_features
from nautilus_trader.backtest.engine import BacktestEngine
from nautilus_trader.trading.strategy import Strategy
# 1. DATA INGESTION -- point-in-time, survivorship-bias-free universe only
def load_point_in_time_universe(as_of_date, min_adv_usd=2_500_000):
"""Never filter by TODAY's liquidity -- that imports survivorship bias."""
raw = data_store.query_asof(as_of_date=as_of_date) # Parquet/DuckDB store
return raw[raw["adv_20d_asof"] > min_adv_usd]
# 2. FEATURES -- Qlib Alpha158 for technicals, tsfresh + mlfinpy for the rest
def build_features(prices: pd.DataFrame) -> pd.DataFrame:
alpha158 = Alpha158(instruments=prices["symbol"].unique().tolist(),
start_time=prices.index.min(), end_time=prices.index.max())
tech_features = alpha158.fetch()
tsfresh_features = extract_relevant_features(
prices.reset_index(), y=None, column_id="symbol", column_sort="date", fdr_level=0.01,
)
d = find_min_ffd_order(prices["close"], adf_pvalue=0.05, min_corr=0.9) # search d in [0.1, 1.0]
frac_diff_price = frac_diff_ffd(prices["close"], d=d, threshold=1e-4) # stationary, RETAINS memory
return tech_features.join(tsfresh_features, how="inner").assign(frac_diff_price=frac_diff_price)
# 3. LABELS -- causal EWMA vol -> ATR-scaled triple barrier (mlfinpy)
def label_events(prices: pd.Series, signal_dates: pd.DatetimeIndex) -> pd.DataFrame:
daily_vol = get_daily_vol(close=prices, lookback=50)
vertical_barriers = add_vertical_barrier(t_events=signal_dates, close=prices, num_days=10)
events = get_events(close=prices, t_events=signal_dates, pt_sl=[2.0, 1.5], target=daily_vol,
min_ret=0.0005, num_threads=4, vertical_barrier_times=vertical_barriers)
return get_bins(events, prices) # -> bin (0/1), ret, t1 (needed for purging)
# 4. META-LABEL MODEL -- LightGBM inside nested Combinatorial Purged CV
def train_meta_label_model(X: pd.DataFrame, y: pd.Series, w: pd.Series, trial_counter: int):
pipeline = Pipeline([("model", lgb.LGBMClassifier(
num_leaves=31, learning_rate=0.03, min_child_samples=50,
monotone_constraints=MONO_CONSTRAINTS))])
cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2, purged_size=10, embargo_size=10)
oos_paths = cross_val_predict(estimator=pipeline, X=X, y=y, cv=cv, sample_weight=w)
pbo = compute_pbo(oos_paths)
dsr = compute_deflated_sharpe(oos_paths, n_trials=get_trial_count_from_mlflow() + trial_counter)
if pbo > 0.50 or dsr.p_value > 0.05:
raise ValueError(f"Model rejected: PBO={pbo:.2f}, DSR p={dsr.p_value:.3f}")
final_model = pipeline.fit(X, y, model__sample_weight=w)
return final_model, pbo, dsr
# 5. REGIME GATE -- causal, walk-forward, FILTERED (never smoothed) HMM posterior
def causal_regime_state(vol_return_features: np.ndarray, t: int, model_cache: dict,
refit_every: int = 63, min_train: int = 500) -> int:
if t < min_train:
return 1 # default "calm" until enough history exists
if t % refit_every == 0 or "model" not in model_cache:
hmm = GaussianHMM(n_components=2, covariance_type="diag", n_iter=200)
hmm.fit(vol_return_features[:t]) # only data strictly before t
model_cache["model"] = hmm
posteriors = model_cache["model"].predict_proba(vol_return_features[: t + 1])
return int(posteriors[-1].argmax()) # filtered state at t, no look-ahead
# 6. VOL-TARGETED SIZING -- GJR-GARCH forecast -> fractional-Kelly-scaled size
def size_position(returns_pct: pd.Series, meta_label_confidence: float, regime_state: int,
target_vol_annual: float = 0.10, kelly_fraction: float = 0.5,
max_leverage: float = 1.5) -> float:
if regime_state == 0: # 0 = "stormy" -- stand aside
return 0.0
res = arch_model(returns_pct, vol="GARCH", p=1, o=1, q=1, dist="t").fit(disp="off")
vol_fc = np.sqrt(res.forecast(horizon=1, reindex=False).variance.values[-1, 0]) / 100
vol_scale = (target_vol_annual / (252 ** 0.5)) / vol_fc
kelly_scale = kelly_fraction * max(2 * meta_label_confidence - 1, 0) # confidence -> edge proxy
return float(np.clip(vol_scale * kelly_scale, 0, max_leverage))
# 7. BACKTEST -- NautilusTrader (same strategy class runs backtest AND live)
class MetaLabelStrategy(Strategy):
def __init__(self, model, hmm_cache, config):
super().__init__(config)
self.model, self.hmm_cache = model, hmm_cache
def on_bar(self, bar):
feats = self.build_live_features(bar) # same code path as build_features()
confidence = self.model.predict_proba(feats)[:, 1][0]
regime = causal_regime_state(self.vol_history, self.clock.timestamp_ns, self.hmm_cache)
size = size_position(self.returns_pct_history, confidence, regime)
if confidence > 0.55 and size > 0:
self.submit_bracket_order(side="BUY", size=size, sl_atr_mult=1.5, tp_atr_mult=2.0)
def run_backtest(historical_bars, final_model, strat_config):
engine = BacktestEngine()
engine.add_data(historical_bars)
engine.add_strategy(MetaLabelStrategy(model=final_model, hmm_cache={}, config=strat_config))
return engine.run() # the SAME strategy object later promotes to paper/live -- adapters swap only
# 8. MLFLOW LOGGING -- every trial, forever (feeds the Deflated Sharpe trial count)
def log_run(params, pbo, dsr, backtest_results, final_model, trial_counter):
with mlflow.start_run(run_name=f"pipeline_v{trial_counter}"):
mlflow.log_params(params)
mlflow.log_metric("pbo", pbo)
mlflow.log_metric("dsr_p_value", dsr.p_value)
mlflow.log_metric("backtest_sharpe", backtest_results.sharpe_ratio)
mlflow.log_metric("backtest_max_dd", backtest_results.max_drawdown)
mlflow.log_metric("trial_number_in_family", trial_counter)
mlflow.lightgbm.log_model(final_model, "meta_label_model")
# 9. EXECUTION -- PickMyTrade webhook JSON (paper first, then tiny live)
def send_to_pickmytrade(symbol, side, qty, sl_price, tp_price, webhook_url, secret):
payload = {
"secret": secret, "symbol": symbol, "action": side, # "buy" / "sell"
"quantity": qty, "stopLoss": sl_price, "takeProfit": tp_price, "orderType": "market",
}
resp = requests.post(webhook_url, json=payload, timeout=5)
resp.raise_for_status()
return resp.json()
Jeder Pfeil ist per Design ein Austauschpunkt
Beachte, dass keine Phase fest an eine bestimmte Wahl aus früheren Abschnitten gekoppelt ist: Tausche LightGBM gegen CatBoost, Qlibs Alpha158 gegen ein handgebautes Feature-Set, NautilusTrader gegen QuantConnect LEAN oder PickMyTrade gegen eine andere Ausführungsbrücke — und nichts anderes in der Pipeline muss sich ändern. Diese Entkopplung ist es, die die Entscheidungsmatrix in §15 weiter unten handlungsleitend statt vorschreibend macht.
14.5
Claude Fable als Pair-Engineer für diesen Stack
Claude Fable ist Anthropics Frontier-Modell (Modell-ID claude-fable-5), verfügbar über die Claude-App und Claude Code. Bei einem derart tiefen Stack liegt sein Wert nicht in „schreib mir einen Trading-Bot“ — sondern in der unglamourösen, fehleranfälligen Mitte: die CPCV-Fold-Arithmetik korrekt hinzubekommen, eine kausale (nicht leaky) HMM-Decoding-Schleife im ersten Anlauf zu schreiben, einen Qlib-Data-Handler für einen Markt zu verdrahten, den es nicht von Haus aus mitbringt, und eine mehrstufige Pipeline durchgängig auf das eine Leak zu lesen, das sonst erst Monate später als Live-/Backtest-Diskrepanz zutage träte.
Wo es sich am spezifischen Stack dieser Seite bezahlt macht:
CPCV-Fold-Logik — Purge-/Embargo-Größen aus deinem Label-Horizont und dem langsamsten Feature-Lookback (§7) ableiten, statt sie zu raten und aus einem aufgeblähten Backtest-Sharpe zu erfahren.
Kausale Regime-Inferenz — die Walk-forward-Schleife auf Basis der gefilterten Posterior schreiben statt des leaky decode()/Viterbi-Aufrufs über die gesamte Stichprobe, wie er als „falsches“ Beispiel in §8 gezeigt wird.
Qlib-Konfiguration — Alpha158/Alpha360-Workflow-YAML für einen Data-Handler generieren und anpassen, für eine Region, die Qlib nicht mitbringt, wie das NSE-Beispiel in §6.
Pipeline-weites Leakage-Review — das §14-Skelett Phase für Phase auf einen Fit-außerhalb-des-Folds-Bug lesen, bevor es jemals Kapital berührt.
Pine Script → Python-Konvertierung — die Entry-Logik einer TradingView-Strategie in die Primärsignal-Funktion portieren, die das Meta-Labeling-Modell speist.
Ausführungs-Glue — den in §14.6 behandelten Webhook-Payload-/Idempotency-Key-Code entwerfen sowie das MLflow-Logging, das deine Deflated-Sharpe-Trial-Anzahl ehrlich hält (§12).
Sofort anpassbare Prompts für jeden dieser Punkte — spezifisch für den Stack dieser Seite, keine generischen „bau mir einen Bot“-Anfragen:
Prompt 1 · CPCV-Purge-/Embargo-Review
Review this skfolio CombinatorialPurgedCV setup [paste code]: 10 folds, 2 test folds, on triple-barrier-labeled
signals where barriers can resolve up to 10 trading days after the signal (get_events num_days=10). Check whether
purged_size and embargo_size are large enough to cover that full label-resolution window plus my slowest feature's
lookback. Flag any fold where a training sample's resolution window overlaps a test sample's, explain the leak, and
give me corrected purge/embargo values with the reasoning shown.
Prompt 2 · Kausales HMM-Regime-Gate, nicht leaky
Here is my hmmlearn regime-detection code [paste code]. Confirm it only calls predict_proba on data up to and
including index t when producing the label used AT time t, and that it never calls hmm.decode() or reads a Viterbi
path computed over the full series. If it's using the full-sample smoothed posterior, rewrite it as a walk-forward
loop that refits every N bars on strictly past data and returns the filtered (not smoothed) posterior at each step,
matching the causal pattern, not the leaky one.
Prompt 3 · Qlib Alpha158 auf einem nicht standardmäßigen Markt
I want Microsoft Qlib's Alpha158 handler running on NSE (India) equities, not one of Qlib's built-in regions.
Here's my current workflow YAML [paste config]. Write a custom data handler/provider that points Alpha158's feature
computation at my own point-in-time OHLCV store instead of Qlib's default region data, keeping the Alpha158 feature
set intact. Explain specifically what breaks -- calendar, instrument universe, trading-day alignment -- if I just
change the region tag without supplying compatible replacements.
Prompt 4 · Leakage-Audit der gesamten Pipeline
Here is my end-to-end pipeline: data ingestion, feature engineering, triple-barrier labeling, LightGBM meta-label
training inside CombinatorialPurgedCV, HMM regime gate, GARCH-based sizing, and NautilusTrader backtest [paste code].
Walk it stage by stage and flag every point where a transform -- scaler, feature selector, frac-diff order search, HMM
fit -- is fit on data outside the current CV training fold, or a feature could see information unavailable at signal
time. Rank findings by how much each would inflate the backtest Sharpe if left uncorrected.
Prompt 5 · Pine Script → Primärsignal-Funktion
Here is my TradingView Pine Script strategy [paste script]. Convert its entry logic into a Python function that
takes a pandas DataFrame of OHLCV bars and returns a boolean signal series, matching the Pine version bar-for-bar on
identical historical data. This becomes the primary-model signal feeding my meta-labeling filter, so flag anything --
security() calls with lookahead, use of the current bar's close before it closes -- that would make the two versions
diverge.
Prompt 6 · Webhook-Payload + Idempotency-Key
Write a Python function that takes a meta-label confidence score, ATR-based stop/target multiples, and a
position size from my vol-targeted sizing calc, and builds the JSON payload for a PickMyTrade webhook POST -- symbol,
side, quantity, stopLoss, takeProfit. Add a deterministic idempotency key (hash of symbol + signal timestamp + bar
index) as a payload field, and wrap the POST in retry-with-backoff logic that treats a timeout as "unknown, reconcile
before retrying" rather than blindly resubmitting.
Fable entwirft, du mergst
Keiner der obigen Prompts ersetzt es, das Diff selbst zu lesen. Claude Fable ist schnell bei den mechanischen Teilen — CV-Fold-Arithmetik, Boilerplate-Retry-Logik, das Konvertieren von Pine zu pandas — aber die Purge-/Embargo-Größen, die PBO/DSR-Ablehnungsschwellen und die Entscheidung, Kapital über einen bestimmten Webhook zu leiten, bleiben jedes Mal Ihre Verantwortung zur Freigabe, bevor irgendetwas ein Paper- oder Live-Konto berührt.
14.6
Execution-Bridge — build vs. buy für den letzten Sprung
Dieselbe Build-vs-Buy-Entscheidung, die jedes Systems-Team trifft, angewendet auf den letzten Sprung der §14-Pipeline: Fließen Ihre knappen Engineering-Stunden in die Order-Routing-Verrohrung oder in die Modellschichten, die tatsächlich Ihre eigenen sind? Dieser Abschnitt macht den Fall dafür, die Live-Ausführung als eingekaufte Abhängigkeit mit schmaler Schnittstelle zu behandeln — und zeigt, wie diese Schnittstelle von der Seite der Pipeline aus aussieht.
1 · Order-Routing-Verrohrung hat einen großen Schadensradius für stille Bugs
Retry-Logik, Broker-Session-Reauthentifizierung, Teilausführungs-Abgleich, OCO-Bracket-Zustandsmaschinen, Webhook-Deduplizierung — jedes ist für sich genommen ein gut verstandenes Problem, und jedes ist genau die Art von Code, bei der ein Bug keine Exception wirft. Er dupliziert stillschweigend eine Order, lässt einen Stop fallen oder hinterlässt eine Zustandsmaschine im falschen Knoten. Ein abgestürzter Listener, der über Nacht eine offene Futures-Position hält, ist kein Stacktrace; es ist ein Anruf beim Desk Ihres Brokers.
2 · Ein stiller Ausführungs-Bug ist ein G&V-Ereignis, keine abgefangene Exception
Die Fehler Ihres Modells zeigen sich als niedrigere Sharpe über Tausende von Trades — verrauscht, aber begrenzt und diagnostizierbar. Ein Fehler in der Ausführungsschicht zeigt sich als ein spezifischer fehlender Stop oder eine doppelte Ausführung, realisiert in Dollar, meist genau in dem einen Moment, in dem die Volatilität hochschnellt und Sie das Terminal nicht beobachten. Unit-Tests fangen die Bugs, für die Sie einen Test zu schreiben gedacht haben; sie fangen selten ein Session-Token, das mitten am Tag abläuft, oder einen Webhook, der während eines Netzwerk-Aussetzers zweimal zugestellt wird.
3 · Die Stunden, die es wert sind, aufgewendet zu werden, sind die, die nur Sie aufwenden können
Retry/Backoff, OCO-Zustandsmaschinen und broker-spezifische Order-Übersetzung sind für jeden Trader, der zu Rithmic oder IB routet, dasselbe Problem — genau deshalb sind sie kommoditisiert. Ihr Meta-Labeling-Modell, Ihr Regime-Gate und Ihre CPCV-Validierung sind nirgendwo sonst gelöst; sie sind die einzige Schicht, in der eine zusätzliche Stunde Ihre Sharpe tatsächlich bewegen kann. Eine Stunde, die Sie einen selbstgebauten Order-Router gegen Randfälle härten, gegen die jemand anderes bereits gehärtet hat, ist eine Stunde, die dort nicht aufgewendet wurde.
4 · Trennung der Zuständigkeiten ist ein Zuverlässigkeitsmuster, keine Annehmlichkeit
Eine schmale, dumme HTTP-Schnittstelle — ein POST, eine Payload-Form — zwischen Strategie und Broker bedeutet, dass Ihr Forschungscode so experimentell sein kann, wie Sie wollen, ohne jemals ein Live-Session-Token zu halten. Wenn die Infrastruktur des Ausführungs-Anbieters einen Vorfall hat, ist das dessen On-Call-Rotation, kein 2-Uhr-nachts-Pager-Alarm für Sie und kein Bug in Ihrem Modell. Es ist derselbe Grund, warum Plattform-Teams Anwendungscode keine rohen Sockets zu einer Datenbank öffnen lassen.
Wo dies in der §14-Pipeline einzuordnen ist
Die Referenz-Pipeline endet bei "MLflow-Logging → PickMyTrade-Webhook zur Ausführung", weil das die natürliche Vertrauensgrenze ist. Ihr Modell gibt ein Signal aus → ein TradingView-Alert wird ausgelöst, oder — da ein fortgeschrittenes Setup TradingView vollständig überspringen kann — Ihr eigener Python-Dienst konstruiert das JSON und POSTet es direkt an den Webhook-Endpunkt von PickMyTrade → PickMyTrade übernimmt die OCO-Bracket-Platzierung, die broker-spezifische Order-Übersetzung, das Multi-Account-Fan-out und die Reconnect-/Retry-Schleife gegen das Venue, zu dem Sie auch immer routen. Diese Arbeitsteilung bedeutet, dass Ihr Dienst nur bis zu "einen idempotenten HTTP-POST senden" zuverlässig sein muss — er muss nie eine zustandsbehaftete, mehrwöchige Verbindung zur Session-API eines Brokers aufrechterhalten, Auth-Tokens nach Zeitplan erneuern oder den Order-Zustand nach einer Netzwerkpartition abgleichen. Diese gesamte Problemkategorie wandert von Ihrem Tisch.
JSON · illustrative Webhook-Payload-Form (generisch — Feldnamen gegen die aktuelle Anbieter-Dokumentation prüfen)
Bewusst generisch — kein verifiziertes PickMyTrade-Schema (siehe den funktionierenden send_to_pickmytrade()-Aufruf in §14 für die Feldnamen, die in der Referenz-Pipeline dieser Seite bereits verwendet werden). quantity kommt direkt aus der vol-getargeteten Sizing-Berechnung aus §11/§14; stopLoss/takeProfit sind Einstieg ± ATR × die Barrier-Multiplikatoren, die bereits im Triple-Barrier-Labeling (§7) validiert wurden; idempotencyKey — im minimalen §14-Beispiel nicht vorhanden — ist das, was aus einer At-least-once-Webhook-Zustellung eine effektiv-einmalige Order macht.
Die Fehlermodi, für die es sich lohnt, von vornherein zu designen
Webhook-Zustellung ist At-least-once, nicht Exactly-once — ein nach einem Timeout wiederholter POST kann sonst eine Order duplizieren; ein Idempotenzschlüssel macht Retries sicher. Broker-API-Rate-Limits und Auth-Token-Refresh-Zyklen sind broker-spezifische Details (Rithmic-Session-Tokens, IB-Gateway-Reconnects, Tradovate-OAuth-Refresh), auf die eine geteilte Ausführungsschicht über die Konten anderer Nutzer bereits Tausende Male gestoßen ist. Order-Zustandsabgleich nach einer Netzwerkpartition — wurde diese Bracket-Order tatsächlich platziert, oder brach die Verbindung vor dem Ack ab? — bedeutet, den Order-Zustand des Brokers abzufragen und ihn bei jedem Reconnect gegen das zu vergleichen, was Sie glauben gesendet zu haben. Und unter alledem: Ihr Forschungscode hat null SLA-Anforderungen — ein abgestürzter Kernel kostet Sie einen erneuten Durchlauf — während Ihr Ausführungscode eine Zuverlässigkeit nahe der Fünf-Neunen-Verfügbarkeit benötigt, denn "der Listener war vier Minuten lang ausgefallen" ist in seinen Konsequenzen nicht zu unterscheiden von "der Stop-Loss existierte nicht".
Halten Sie den Schadensradius der Forschungsumgebung bei null
Ihr Backtest-, Retrain- und MLflow-getrackter Experimentcode (§12) sollte keinen Codepfad haben, der eine Live-Order platzieren kann — kein Feature-Flag, kein dry_run=False-Default, der darauf wartet, versehentlich umgestellt zu werden. Jede Live-Order über eine einzige externe, schmale HTTP-Grenze zu leiten, erzwingt diese Trennung strukturell: Die einzige Möglichkeit, wie Forschungscode einen Live-Trade platzieren könnte, besteht darin, bewusst genau denselben Webhook-POST zu konstruieren, den Ihre Live-Strategie macht. Es ist derselbe Grund, warum CI-Runner keine Produktions-Datenbank-Anmeldedaten erhalten — hier kostet es ein Abonnement statt einer zweiten On-Call-Rotation.
Kommoditisierte Infrastruktur, konsumiert über API
Behandeln Sie die Ausführung so, wie Sie bereits Compute behandeln: Sie racken keine eigenen Server, um eine GPU zu bekommen, und es steckt auch kein Alpha darin, Ihren eigenen Order-Router zu racken. PickMyTrade ist Infrastruktur, die Sie aufrufen, keine Komponente Ihres Edges — das Modell, das Regime-Gate und die Validierung sind die Teile dieses Stacks, die es zu verteidigen lohnt.
15
Entscheidungsmatrix — welches Werkzeug für welche Aufgabe
Eine einzige Nachschlagetabelle für "Ich muss… → nutze dies → weil…".
I need to…
Use
Why
Filter trade quality (meta-label)
LightGBM + mlfinpy triple-barrier
Highest-ROI, lowest-risk ML addition; GBDT dominates tabular financial data
Statistical drift tests (KS, PSI, Wasserstein) across features and predictions
Estimate live performance before labels arrive
NannyML (CBPE/DLE)
Label-free — critical since triple-barrier outcomes only resolve after the barrier is hit
Use financial sentiment as a risk veto
FinBERT (ProsusAI)
Apache-2.0, CPU, sub-second — defensive filter, not an alpha engine
Cheaply fine-tune an LLM on financial text
FinGPT (LoRA on LLaMA)
~3.67M trainable params vs. 6.17B full fine-tune — fits on one consumer GPU
Orchestrate the nightly pipeline
Prefect (Dagster at scale)
Scheduling/retries/caching once a cron script becomes unwieldy — not needed pre-MVP
Avoid a non-commercial license trap
Prefer Chronos / TimesFM / Lag-Llama / MOMENT over Moirai
Moirai is CC BY-NC-4.0 — not usable in a system that manages your own capital
Find structural breaks / changepoints
ruptures (PELT)
Linear-cost exact search, no assumed number of breakpoints
Use RL without it blowing up your backtest
Stable-Baselines3 (PPO) on a narrow sub-problem, PBO-tested
FinRL's own contests reject overfit agents at 10% significance — confine RL accordingly
Execute live orders
PickMyTrade webhook
Execution is a solved, hardened problem — your edge lives in the model layers, not order plumbing
Draft / review pipeline code quickly
Claude Fable (claude-fable-5)
Pair-engineer for CPCV fold math, causal HMM decoding, and leakage review — see §14.5; every merge is still a human decision
Bridge a model signal to a live broker order
PickMyTrade (webhook execution bridge)
One idempotent POST replaces weeks of broker auth, retry, and OCO state-machine engineering — see §14.6
16
Lizenz-Anhang
Jedes auf dieser Seite behandelte Werkzeug und Modell, mit seiner Lizenz und einer klaren Kennzeichnung. Sicher = permissiv, keine nennenswerte Einschränkung für kommerzielle/Live-Trading-Nutzung. Vorsicht = nutzbar, aber lesen Sie die Bedingungen (Copyleft-Verpflichtungen, Source-available-aber-eingeschränkte Klauseln oder eher ein Wartungsstatus-Bedenken als ein lizenzrechtliches). Eingeschränkt = ein echter Blocker für ein uneingeschränktes kommerzielles/Live-System ohne gesonderte Vereinbarung.
Covers §2's from-scratch DL architectures via one API
Nixtla TimeGPT
Proprietary / paid API
Caution
Closed, vendor lock-in; prefer open Chronos/TimesFM instead
Amazon Chronos / Chronos-Bolt
Apache-2.0
Safe
—
Google TimesFM
Apache-2.0
Safe
—
Salesforce Moirai / Moirai-MoE
CC BY-NC-4.0
Restricted
Non-commercial only — do not use in a system managing your own capital without a separate license
Lag-Llama
Apache-2.0
Safe
—
MOMENT
MIT
Safe
—
IBM Granite-TimeSeries (PatchTSMixer/PatchTST/TTM)
Apache-2.0
Safe
—
FinBERT (ProsusAI)
Apache-2.0
Safe
—
FinBERT-tone
Apache-2.0
Safe
—
FinGPT (code)
MIT
Caution
Code is MIT, but fine-tuned checkpoints inherit the base LLaMA weights' separate Meta community license — check that independently
FinRL / FinRL-Meta
MIT
Safe
—
Stable-Baselines3
MIT
Safe
—
TensorTrade
Apache-2.0
Caution
License is permissive, but maintenance has stalled enough that a community fork (TensorTrade-NG) exists specifically to address it — plan accordingly
Microsoft Qlib
MIT
Safe
—
mlfinpy
MIT
Safe
—
skfolio
BSD-3-Clause
Safe
—
mlfinlab (paid)
Commercial
Caution
Paid license required — the two free packages above already cover the essentials
hmmlearn
BSD
Safe
—
ruptures
BSD-2-Clause
Safe
—
vectorbt (community)
Apache-2.0 + Commons Clause
Caution
Commons Clause blocks selling a product/service whose value derives primarily from the software itself; fine for internal use, and maintenance-frozen
backtrader
GPL-3.0
Restricted
Strong copyleft; also stalled since ~2021 — avoid for new work on both grounds
Zipline-reloaded
Apache-2.0
Safe
—
NautilusTrader
LGPL-3.0-or-later
Caution
Permits linking from closed-source strategy code; modifications to NautilusTrader itself must be shared back — verify current terms before commercial deployment
QuantConnect LEAN
Apache-2.0
Safe
—
bt
MIT
Safe
—
backtesting.py
AGPL-3.0
Restricted
Network-use copyleft — a real constraint if you build a hosted/SaaS product on it; fine for private, non-distributed use
freqtrade
GPL-3.0
Restricted
Crypto-only bot; strong copyleft restricts closed-source commercial derivatives — flagged since it's a common trap
PyPortfolioOpt
MIT
Safe
—
Riskfolio-Lib
BSD-3-Clause
Safe
—
arch
NCSA
Safe
Permissive, commercial-OK
tsfresh
MIT
Safe
—
MLflow
Apache-2.0
Safe
—
Evidently AI
Apache-2.0
Safe
—
NannyML
Apache-2.0
Safe
—
Prefect
Apache-2.0
Safe
—
Dagster
Apache-2.0
Safe
—
PickMyTrade
Proprietary / paid SaaS
Caution
Execution API, not an installable library — no open-source or self-hosted option; a subscription gates access (see §14.6), a vendor-dependency call rather than an OSS-license one
Dies ist keine Rechtsberatung
Lizenzen und ihre Auslegung können sich ändern, und die Grenzen der "kommerziellen Nutzung" (insbesondere bei CC BY-NC und AGPL) sind wirklich einzelfallabhängig. Behandeln Sie diese Tabelle als Ausgangskarte für die Due Diligence, nicht als Ersatz dafür, den aktuellen Lizenztext selbst zu lesen — oder die Meinung eines Anwalts einzuholen — vor jedem Deployment, das echtes Kapital berührt oder an andere verteilt wird.
Wichtiger finanzieller Haftungsausschluss
Nur zu Bildungszwecken. Alle Inhalte auf dieser Seite werden zu allgemeinen Bildungs- und Informationszwecken bereitgestellt und stellen weder eine Anlage-, Finanz-, Rechts- oder Steuerberatung noch eine Empfehlung oder Aufforderung zum Kauf oder Verkauf eines Wertpapiers, Futures-Kontrakts oder anderen Finanzinstruments dar.
Erhebliches Verlustrisiko. Der Handel mit Futures, Derivaten und anderen gehebelten Produkten ist mit einem erheblichen Verlustrisiko verbunden und nicht für alle Anleger geeignet. Sie können mehr als Ihre ursprüngliche Investition verlieren. Für den Handel sollte ausschließlich Risikokapital eingesetzt werden — Geld, dessen Verlust Sie sich leisten können, ohne dass es Ihre Lebensführung beeinträchtigt.
Vergangene Wertentwicklung ist kein Indikator für künftige Ergebnisse. Hypothetische und rückgetestete Performance-Ergebnisse unterliegen inhärenten Beschränkungen: Sie werden mit dem Vorteil der Rückschau erstellt, sind mit keinem finanziellen Risiko verbunden und können nicht alle Faktoren berücksichtigen — einschließlich der Fähigkeit, Verluste zu verkraften —, die den tatsächlichen Handel beeinflussen. Jede auf dieser Seite zitierte Benchmark-Zahl und jede Star-/Download-Zahl spiegelt eine Momentaufnahme wider, die während der Recherche Mitte 2026 erfasst wurde, und kann sich bis zu dem Zeitpunkt, an dem Sie dies lesen, geändert haben — prüfen Sie aktuelle Zahlen anhand der Primärquelle (GitHub-Repository, Hugging-Face-Model-Card oder zitiertes Paper), bevor Sie sich darauf verlassen.
Keine Garantien. Nichts auf dieser Seite garantiert Gewinn oder Schutz vor Verlust. Machine-Learning-Modelle — einschließlich der in §3 besprochenen Zeitreihen-Foundation-Modelle — können falsch liegen, Marktbedingungen ändern sich, und automatisierte Systeme können fehlerhaft funktionieren.
Kein registrierter Berater. Der Autor und Herausgeber dieser Seite ist kein registrierter Anlageberater, Broker-Dealer, Commodity Trading Advisor (CTA) oder Finanzplaner. Bevor Sie eine finanzielle Entscheidung treffen, konsultieren Sie einen zugelassenen Finanzberater, der Ihre individuellen Umstände beurteilen kann.
Keine Rechtsberatung zur Lizenzierung. Der Lizenz-Anhang in §16 wird der Einfachheit halber bereitgestellt und spiegelt eine nach bestem Wissen erfolgte Auslegung öffentlich verfügbarer Lizenzdateien zum Zeitpunkt der Recherche wider; er stellt keine Rechtsberatung dar. Bestätigen Sie die aktuellen Lizenzbedingungen direkt bei jedem Projekt vor jeder kommerziellen oder produktiven Nutzung.
Über die genannten Werkzeuge. PickMyTrade ist ein Drittanbieter-Werkzeug zur Ausführungsautomatisierung, das Alerts an Broker weiterleitet; es bietet keine Handelsberatung, Signale oder Strategien. Alle genannten Bibliotheken, Modelle und Frameworks (Hugging Face, Amazon, Google, Salesforce, IBM, Microsoft, Meta/LLaMA, AI4Finance Foundation und jedes referenzierte Open-Source-Projekt) sind Eigentum ihrer jeweiligen Inhaber; diese Seite ist unabhängiger Bildungsinhalt und wird von keinem von ihnen unterstützt oder ist mit keinem von ihnen verbunden. Sachliche Details (Lizenzen, Star-Zahlen, Benchmark-Werte) wurden zum Zeitpunkt der Recherche offiziellen Repositories, Model-Cards und zitierten Papern entnommen und können sich ändern — überprüfen Sie stets die Primärquelle.
Automatisieren Sie den letzten Sprung mit PickMyTrade
Ihr Edge lebt in den Modell-, Regime-Gate- und Validierungsschichten. Lassen Sie PickMyTrade die Ausführungs-Verrohrung übernehmen — ein idempotenter Webhook zu über 60 Brokern und Prop-Firmen, mit angehängten Bracket-Orders.