Double Machine Learning: Einen Kausalen Parameter Schätzen, Statt Renditen Vorhusagen
Jeder Modellierungsartikel in diesem Blog stellt bislang die gleiche Art von Frage: Gegeben Features, sage eine Zahl voraus, dann validiere, dass die Vorhersage außerhalb der Stichprobe überlebt. Spread-Modelle sagen Spread voraus. Füll-Modelle sagen Füllwahrscheinlichkeit voraus. Der gesamte Validierungsapparat — purgiertes Walk-Forward, deflatierter Sharpe, Look-Ahead-Taxonomie — existiert, um zu prüfen, ob eine Vorhersage echt ist.
Dieser Artikel stellt eine andere Art von Frage, und es ist das eine Maschine, die der Blog noch nie hatte: Schätze einen einzelnen skalaren Parameter mit kausaler Interpretation und hänge einen Standardfehler daran, der die Tatsache überlebt, dass ein flexibles ML-Modell verwendet wurde, um dorthin zu gelangen.
Das ist keine rhetorische Unterscheidung. "Warteposition sagt Füllwahrscheinlichkeit voraus" ist trivial wahr und operativ nutzlos — natürlich tut es das, beide werden von Tiefe und Volatilität angetrieben. "Eine Position im Warteschlange weiter vorwärts zu rücken verursacht eine Änderung von in der Füllwahrscheinlichkeit bei festem Marktzustand" ist eine Zahl, die Sie in eine Order-Placement-Politik einfügen können. Das erste ist eine Regression-Anpassung. Das zweite erfordert einen Schätzer, der nicht im Standard-ML-Toolkit existiert, da Regularisierung und Overfitting in einer flexiblen ersten Stufe genau den Koeffizienten beeinflussen, der Ihnen wichtig ist.
Double Machine Learning (Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins, 2018) ist der Schätzer, der das behebt. Jeder quantitative Trader hat es gehört: Korrelation ist keine Kausalität. DML ist der Teil, der nach diesem Satz kommt.
Warum Naive Regression Scheitert

Formulieren Sie die Frage im eigenen Territorium des Blogs. Wir wollen den kausalen Effekt der Warteposition auf die Füllwahrscheinlichkeit:
- : ob die ruhende Limit-Order bei Beobachtung innerhalb des Horizonts gefüllt wurde.
- : Warteposition bei Platzierung (normalisiert durch Levelgröße).
- : die Konfundierer — realisierte Volatilität, quotierte Spread, Tiefe-Ungleichgewicht, Levelgröße, Tageszeit, Regime-Label. Dies sind die Marktzustands-Variablen, die der Blog bereits in Spread-Modellierung mit Machine Learning berechnet.
Der kausale Parameter ist in
wobei die (möglicherweise komplexe, nichtlineare) Beziehung zwischen Marktzustand und Füllergebnis erfasst.
Die Behandlung ist nicht zufällig zugewiesen. Sie sind nah an der Front der Warteschlange weil das Level dünn war, oder weil Sie während einer ruhigen Phase platziert haben, oder weil das Orderbuch zu Ihren Gunsten unausgewogen war. Die gleichen Bedingungen treiben unabhängig davon, ob Sie gefüllt werden. Das ist die Konfundierung.
Ansatz 1: Konfundierer ignorieren. Regressiere allein auf . Die Schätzung absorbiert den Effekt jedes Konfundierers, der mit beiden korreliert ist. Lehrbuch-omitted-variable-bias: dünne Levels geben Ihnen sowohl einen guten Warteschlangenplatz als auch eine hohe Füllrate, also übertreiben Sie den Wert des Platzes selbst.
Ansatz 2: Lineare Regression mit Kontrollen. Regressiere auf und . Dies funktioniert nur, wenn wirklich linear ist. Buchdynamik ist es nicht — die Füll/Volatilitäts-Beziehung hat Schwellen, das Tiefe-Ungleichgewicht wechselt je nach Regime das Vorzeichen. Fehlspezifikation von führt Bias wieder ein.
Ansatz 3: ML-Vorhersage. Passen Sie ein Gradient-Boosted-Modell an an. Sie erhalten gute Out-of-Sample-Diskriminierung und keinerlei kausale Interpretation. Das Modell erfasst jedes vorhersagende Muster, kausal oder nicht; Regularisierung schrumpft den Beitrag der Behandlung auf Arten, die biasen; und es gibt keinen Standardfehler, dem Sie vertrauen können.
Dies ist die Kernspannung. ML ist gut in Vorhersage, aber naive Anwendung auf einen kausalen Parameter erzeugt verzerrte, nicht-normaler, unzuverlässige Schätzungen.
Das Partiell Lineare Modell

DML operates within a structural framework. Das Arbeitstier ist die partiell lineare Regression (PLR):
- ist der kausale Parameter von Interesse.
- ist eine Störfunktion — der Teil des Ergebnisses, der durch Marktzustand erklärt wird.
- ist eine weitere Störfunktion — die bedingte Erwartung der Behandlung gegeben Marktzustand (die "Propensity" in einem Continuous-Treatment-Setting).
- und sind strukturelle Residuen.
Die grundlegende Einsicht: ist niederdimensional, aber und können beliebig komplex sein. Wir wollen ML für die Störfunktionen verwenden und dennoch gültige Inferenz auf dem Skalar liefern.
Warum "Doppelt"?
Zwei ML-Modelle, nicht eines:
- Ergebnismodell: — sage das Ergebnis allein aus Marktzustand voraus.
- Behandlungsmodell: — sage die Behandlung allein aus Marktzustand voraus.
Bilde Residuen
und schätze durch Regression von auf :
Das ist Frisch-Waugh-Lovell auf Steroiden: Partial-out die Konfundierer mit ML statt linearer Projektion, dann lies den Behandlungseffekt aus der residualen Variation ab.
Neyman-Orthogonalität: Warum Es Funktioniert
Der naive Partial-Out-Ansatz (schätze , subtrahiere, regrediere) scheitert, da ML-Schätzfehler in direkt in übergehen. Der DML-Score ist so konstruiert, dass er Neyman-orthogonal ist — unempfindlich gegenüber kleinen Störungen in den Störfunktionen.
Der orthogonale Score für PLR:
wobei . Die Orthogonalitätsbedingung ist
Intuitiv verwendet der Score nur die Variation in und , die unabhängig von ist, und Fehler in einer Störfunktion werden durch die andere ausgeglichen. Wenn die Behandlung leicht überschätzt, ist etwas zu klein, aber der entsprechende Fehler in durch Fehlschätzung von drückt in eine kompensierende Richtung. Der Bias wird zweiter Ordnung — das Produkt zweier Fehler erster Stufe — statt erster Ordnung.
Formal, wenn beide Störschätzer mit Rate konvergieren (mild; die meisten vernünftigen ML-Methoden erfüllen das), dann
also konvergiert mit parametrischer Rate und ist asymptotisch normal.
Cross-Fitting: Warum Es Hier Pflicht Ist
Orthogonalität allein reicht nicht. Wenn die Störmodelle auf denselben Zeilen angepasst werden, die zur Schätzung von verwendet werden, verunreinigt Overfitting der ersten Stufe die zweite Stufe — und der spezifische Schaden ist worth precisely zu nennen, da er nicht der Schaden ist, an den Sie gewöhnt sind. Anderswo zeigt Overfitting als aufgeblasener Validierungsscore: Sie bemerken es, Sie diskontieren es, Sie gehen weiter. Hier zeigt es als verschobene Punktschätzung für , mit einem Konfidenzintervall, das immer noch schmal ist und immer noch auf der falschen Zahl zentriert. Es gibt keinen Score, der verdächtig wäre. Der Schätzer lügt einfach ruhig.
Cross-Fitting bricht die Abhängigkeit: Die Stör-Vorhersagen jeder Beobachtung kommen aus einem Modell, das ohne sie trainiert wurde, und wird aus den gepoolten Held-out-Residuen geschätzt. Die Mechanik ist gewöhnliche K-Fold-Maschinerie, abgedeckt in Spread-Modellierung mit Machine Learning; was unten wichtig ist, ist, welche Folds Sie ihm geben.
Der DML-Algorithmus Schritt für Schritt
Eingabe: Daten , ML-Methoden und , Folds .
Schritt 1 — Partitionierung: Teile in disjunkte Folds.
Schritt 2 —Cross-Fit Störmodelle: Für , trainiere und auf dem Komplement von Fold , dann berechne und für .
Schritt 3 — Schätzung:
Schritt 4 — Inferenz:
mit Intervallen .
Das Konfidenzintervall ist gültig für genau eine Frage
Dies ist der Vorbehalt, der entscheidet, ob ein DML-Ergebnis etwas wert ist, und hier fallen die meisten angewandten Verwendungen der Methode stillschweigend auseinander.
Die obige Asymptotische Normalität ist eine Aussage über eine vorab spezifizierte Behandlung, eine vorab spezifizierte Konfundierer-Menge, einen vorab spezifizierten Score. Fixieren Sie diese im Voraus, führen Sie den Schätzer einmal, und das Intervall bedeutet, was es sagt. Probieren Sie drei Behandlungen, oder vier Konfundierer-Mengen, oder tauschen Sie Lerner, bis der p-Wert besser aussieht, und Sie betreiben nicht mehr Inferenz — Sie führen eine Suche, und der gemeldete p-Wert ist der p-Wert eines Maximums, nicht eines Zugs.
Der Blog hat bereits gemessen, was das tut. In der deflated Sharpe ratio Studie erzeugen Suchen über pure Rauschen mit null echtem Edge eine naive False-Discovery-Rate von 1.000 — der unadjustierte Test feuert jedes einzelne Mal — während der median naive p-Wert des Gewinners in der Nähe von 0.0007 liegt. Nichts an Neyman-Orthogonalität schützt Sie davor. Orthogonalität behebt den Bias aus Störschätzung; sie sagt nichts über den Bias aus Spezifikationssuche. Ein DML-p-Wert von 1e-05, erhalten nachdem sechs Spezifikationen versucht wurden, verdient genau dieselbe Bonferroni/Holm/BHY-Behandlung wie jeder andere Gewinner, der aus einem Raster gezogen wurde, mit auf die Anzahl der Spezifikationen gesetzt, die Sie tatsächlich ausgeführt haben.
Dies hat direkte praktische Konsequenzen für die Komfort-Merkmale der Tools. DoubleMLData akzeptiert eine Liste in d_cols gibt gerne drei Behandlungseffekte in einer Zusammenfassungstabelle zurück:
dml_data_multi = dml.DoubleMLData(
df, y_col='filled', d_cols=['queue_pos', 'toxicity', 'spread_at_post'],
x_cols=confounder_cols,
)
Drei Zeilen, drei p-Werte und ein Multiples-Testing-Problem, das die Zusammenfassungstabelle nicht erwähnt. Wenn Sie alle drei lesen, passen Sie alle drei an. Wenn nur einer die vorab registrierte Frage war, sagen Sie das, und behandeln Sie die anderen beiden explizit als explorativ.
Cross-Fitting auf Zeitreihen: Purge, Embargo, Custom Folds

Standard-DML geht von i.i.d.-Beobachtungen aus. Buchdaten sind es nicht, und der Versagensmodus ist der, den der Blog bereits ausführlich dokumentiert hat: benachbarte Zeilen teilen überlappende Forward-Fenster, also lecken ein gewöhnliches TimeSeriesSplit die Antwort immer noch über die Fold-Grenze. Siehe Spread-Modellierung mit Machine Learning für die purged, embargoed Walk-Forward-Implementierung und den Grund, warum eine Lücke von mindestens horizon Zeilen erforderlich ist, und die Look-Ahead-Bias-Taxonomie für den vollständigen Katalog von Leaks und ihren gemessenen Größen.
Der wirklich DML-spezifische Teil ist, wie Sie purged Folds an den Schätzer übergeben, da set_sample_splitting einen Vertrag hat, der Leute stolpern lässt:
import numpy as np
import doubleml as dml
def purged_folds(n: int, n_splits: int, horizon: int):
"""Expandierende-Window-Folds mit einer Purge/Embargo-Lücke von `horizon` Zeilen.
Gleiche Konstruktion wie das purged Walk-Forward CV im Spread-Modellierungs-
artikel: die Lücke entfernt die Überlappung zwischen dem Forward-Fenster
einer Trainingszeile und einer Validierungszeile.
"""
fold_size = n // (n_splits + 1)
for k in range(1, n_splits + 1):
train_end = fold_size * k
val_start = train_end + horizon
val_end = val_start + fold_size
if val_end > n:
break
yield np.arange(0, train_end - horizon), np.arange(val_start, val_end)
folds = list(purged_folds(len(df), n_splits=5, horizon=HORIZON))
dml_plr = dml.DoubleMLPLR(dml_data, ml_l=ml_l, ml_m=ml_m)
dml_plr.set_sample_splitting([folds])
dml_plr.fit()
Zwei Dinge, von denen Sie wissen sollten, keineswegs offensichtlich aus den Bibliotheks-Doks:
- Purged Walk-Forward-Folds decken nicht jede Zeile ab. Die Purge-Lücken und der anfängliche Trainingsblock sind niemals Test-Fold von jemandem, also wird aus streng weniger als Residuen geschätzt. Das ist korrektes Verhalten, kein Bug, aber es bedeutet, dass das effektive in der Varianzformel die Anzahl der gepoolten Test-Zeilen ist — überprüfen Sie es, statt anzunehmen.
n_repWiederholungen sind hier nicht kostenlos. Mit zufälligem K-Fold ist die Wiederholung von Cross-Fitting und Mittelung eine billige Varianzreduktion. Mit einem deterministischen zeitlich geordneten Split gibt es nur ein Splitting, alson_repkauft nichts und verbirgt nichts; Stabilität muss stattdessen aus dem erneuten Laufen auf verschiedenen Datenfenstern kommen.
Für Panel-Strukturen (viele Symbole im selben Zeitraum) unterstützt DoubleML cluster-robuste Standardfehler — Cluster auf Symbol, nicht auf Zeit, und siehe Multi-Symbol-Validierung für die Position des Blogs, wann ein cross-instrument Ergebnis tatsächlich etabliert ist.
Der Gemessene Fall: Warteposition und Füllwahrscheinlichkeit

Dies ist die eine kausale Frage im Artikel, bei der das Projekt bereits die Daten hat, und sie sollte ausgeführt werden, nicht nur gestellt. Wartepositionsanalyse deckt bereits Positionsschätzung, FIFO-Mechanik, Drain-Raten und Zeit-zu-Füll auf echten Buchdaten; Füll-Simulation deckt Füllwahrscheinlichkeitsmodellierung und die Kalibrierungsschleife gegen Live-Füllungen. Beide produzieren ein vorhersagendes Modell von Füllungen. DML verwandelt dieselben Eingaben in eine kausale Schätzung.
Die Spezifikation, vorab registriert vor dem Betrachten der Schätzung:
- Ergebnis : gefüllt innerhalb
HORIZONSnapshots (binär). - Behandlung : normalisierte Warteposition bei Platzierung.
- Konfundierer : realisierte 1s-Volatilität, quotierte Spread in bps, Tiefe-Ungleichgewicht, Levelgröße bei Post, Distanz von Mid in Ticks, Tageszeit-Kodierung, Regime-Label.
from sklearn.ensemble import GradientBoostingRegressor
import doubleml as dml
confounder_cols = [
'rv_1s', 'spread_bps', 'depth_imbalance', 'level_size',
'dist_from_mid_ticks', 'tod_sin', 'tod_cos', 'regime',
]
dml_data = dml.DoubleMLData(
df, y_col='filled', d_cols='queue_pos_norm', x_cols=confounder_cols,
)
ml_l = GradientBoostingRegressor(n_estimators=300, max_depth=5)
ml_m = GradientBoostingRegressor(n_estimators=300, max_depth=5)
dml_plr = dml.DoubleMLPLR(dml_data, ml_l=ml_l, ml_m=ml_m, score='partialling out')
dml_plr.set_sample_splitting([folds])
dml_plr.fit()
print(dml_plr.summary)
dml_plr.sensitivity_analysis()
print(dml_plr.sensitivity_summary)
Das zu berichtende Ergebnis ist ein Vier-Spalten-Vergleich, nicht ein einzelner Koeffizient: die naive OLS-Schätzung von auf allein, die Linearkontroll-Schätzung von auf und , die DML-Schätzung mit ihrem Standardfehler, und der Robustness-Wert aus der Sensitivitätsanalyse — wie stark ein unbeobachteter Konfundierer sein müsste, um den Effekt zu zunichte zu machen. Die Lücke zwischen den naiven und DML-Spalten ist die Größe des echten Interesses: sie ist, wie viel des scheinbaren Werts der Warteposition Marktzustand in Verkleidung war.
Ein Null- oder negativer hier ist ein veröffentlichbarer Ergebnis und passt besser zu diesem Blog als ein sauberes Positives. Wenn der kausale Effekt der Warteposition zusammenbricht, sobald Volatilität und Levelgröße teilweise herausgerechnet werden, ist das ein direkter Befund über Order-Placement-Politik: Der Platz ist nicht das, was die Füllung verdient, die Bedingungen, unter denen Sie den Platz erhalten haben, sind es.
Kausale Faktoranalyse
Der Standardansatz zum Faktor-Investing ist assoziativ: Sortieren nach einer Kennzeichnung, Long-Short-Portfolios bilden, beobachten, dass Renditen unterschiedlich sind. DML ermöglicht einen anderen Test — Schätzung des direkten kausalen Effekts einer Kennzeichnung auf Renditen, herausrechnen der konfundierenden Effekte der anderen Kennzeichnungen. Wenn der Effekt unter DML verschwindet, ist der Faktor nicht unabhängig kausal; er ist ein Proxy.
Dies ist eine zweite, unabhängige Form von Faktor-Skepsis, und es ist wert, explizit zu sein, wie sie sich auf die bezieht, die der Blog bereits veröffentlicht. Der deflated Sharpe ratio greift den Faktor-Zoo von der Selection-Seite an: Mit genügend Versuchen kann ein Faktor allein deshalb signifikant aussehen, weil Sie oft genug geschaut haben. DML greift ihn von der Konfundierung-Seite an: Ein Faktor kann auf einem einzigen ehrlichen Test signifikant aussehen und immer noch ein Proxy für etwas anderes in der konditionierenden Menge sein. Ein Faktor muss beide überleben, um interessant zu sein, und die beiden Versagensmodi sind unabhängig — einen zu bestehen sagt nichts über den anderen.
Was DML Nicht Kann
-
Es erfordert, dass die Konfundierer beobachtet werden. Wenn eine unbeobachtete Variable sowohl Behandlung als auch Ergebnis antreibt, ist DML verzerrt, und keine ML-Sophistication behebt ein Identifikationsproblem. Sensitivitätsanalyse grenzt das Risiko ein; sie entfernt es nicht.
-
Es schätzt einen durchschnittlichen Effekt. Wenn sich der Effekt der Warteposition stark über Regimes unterscheidet, ist die Punktschätzung der Durchschnitt über das Regime-Mix Ihrer Stichprobe. Für Heterogenität verwenden Sie das Interactive Regression Model (
DoubleMLIRM) oder einen kausalen Wald. -
Es geht von einem strukturellen Modell aus. Die partiell lineare Spezifikation erfordert, dass die Behandlung auf eine bestimmte Weise in die Ergebnisgleichung eingeht. Wenn der wahre Prozess grundlegend anders ist, ist DML selbstsicher falsch.
-
Es entdeckt keine kausale Struktur. DML schätzt den Effekt einer vorab spezifizierten Behandlung. Es sagt Ihnen nicht, welche Variablen Ursachen sind.
-
Es befreit Sie nicht von Multiples Testing. Den Punkt oben zu wiederholen, weil er am häufigsten übersprungen wird: Orthogonalität de-biased Störschätzung, nicht Spezifikationssuche.
Praktische Hinweise
Stichprobengröße. DML benötigt, dass die Störmodelle mit konvergieren, was in der Praxis bedeutet, dass genügend Zeilen für die ML-Modelle vorhanden sind, um und überhaupt zu approximieren. Anstatt runden Zahlenschwellen zu vertrauen, etablieren Sie Eignung empirisch auf die Weise, wie Multi-Symbol-Validierung es tut — prüfen Sie, ob die Schätzung über Instrumente und Unterperioden standhält, und behandeln Sie Instabilität als das Signal, das es ist.
Lerner-Wahl. Die DML-spezifische Tatsache ist schmal aber nützlich: Bei -Konvergenz beeinflusst der Lerner die Effizienz von (Intervallbreite), nicht seine Konsistenz. Welche Lerner sich lohnen, auf tabellarischen Marktdaten zu erreichen, und warum Gradient Boosting der Standard ist, ist bereits in Spread-Modellierung mit Machine Learning abgedeckt. Wenn sich materiell über Lerner bewegt, ist das kein Menü zur Auswahl — es ist Beweis, dass die Störfunktionen schlecht geschätzt sind, und per dem Abschnitt oben, den freundlichsten zu wählen, verwandelt die Übung in eine Suche.
Fazit
DML gibt dem Blog etwas, das es nicht hatte: eine Möglichkeit, eine Markt-Mikrostruktur-Behauptung als kausalen Parameter mit verteidigbarem Standardfehler zu formulieren, statt als Vorhersage mit gutem Validierungsscore.
Die drei lasttragenden Ideen sind:
- Orthogonalisieren Sie den Score, damit Fehler erster Stufe zur zweiten Ordnung kompensieren.
- Cross-Fit Sie, mit purged und embargoed Folds auf Zeitreihendaten, damit Overfitting erster Stufe nicht verschieben kann.
- Spezifizieren Sie im Voraus, damit das Intervall, das Sie berichten, das Intervall ist, das Sie tatsächlich verdient haben.
Der Schätzer ist der einfache Teil. Die harten Teile sind unverändert: zu entscheiden, welche Konfundierer wichtig sind, zu argumentieren, dass die Identifikationsannahmen halten, und dem Drang zu widerstehen, die Spezifikation noch einmal zu laufen.
Referenzen
Die Abstammung von DML ist kurz und wert eine Zeile: Es ist Robinsons (1988) partiell lineares Modell mit ML, das die Kern-Schätzer ersetzt, Erreichen des semiparametrischen Effizienz-Bounds, mit einer Orthogonalitätsbedingung, die auf Neymans C()-Test zurückgeht und einen nahen Vetter in der Targeted-Learning (TMLE)-Literatur hat. Chernozhukov et al.'s Beitrag war zu zeigen, dass dies mit beliebigen ML-Lernern operationalisiert werden kann, wobei -konsistente, asymptotisch normale Inferenz beibehalten wird.
- Chernozhukov, V., Chetverikov, D., Demirer, M., Duflo, E., Hansen, C., Newey, W., & Robins, J. (2018). Double/Debiased Machine Learning for Treatment and Structural Parameters. The Econometrics Journal, 21(1), C1-C68.
- Robinson, P. M. (1988). Root-N-Consistent Semiparametric Regression. Econometrica, 56(4), 931-954.
- Bach, P., Chernozhukov, V., Kurz, M. S., & Spindler, M. (2022). DoubleML — An Object-Oriented Implementation of Double Machine Learning in Python. Journal of Machine Learning Research, 23(53), 1-6.
- Facure, M. (2022). Causal Inference for the Brave and True. Chapter 22: Debiased/Orthogonal Machine Learning.
- Cahan, E., Bai, J., & Ng, S. (2024). Causal Factor Investing. Quantitative Finance.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.