← Zurück zu den Artikeln
August 1, 2026
5 min read

Causal Forests für heterogene Behandlungseffekte im Trading

Causal Forests für heterogene Behandlungseffekte im Trading
#causal-inference
#causal-forest
#heterogeneous-effects
#econometrics
#treatment

Jedes prädiktive Modell in diesem Blog schätzt dasselbe Objekt: einen bedingten Mittelwert μ(x)=E[YX=x]\mu(\mathbf{x}) = \mathbb{E}[Y \mid \mathbf{X} = \mathbf{x}]. Feature Engineering, Gradient Boosting, konforme Intervalle, Walk-Forward-Validierung — alles dient einer einzigen Schätzgröße. Dieser Artikel handelt von einer anderen Schätzgröße und der Machinery, die sich ändert, wenn Sie sie austauschen.

Das Objekt ist der bedingte durchschnittliche Behandlungseffekt:

τ(x)=E[Yi(1)Yi(0)Xi=x]\tau(\mathbf{x}) = \mathbb{E}[Y_i(1) - Y_i(0) \mid \mathbf{X}_i = \mathbf{x}]

die Differenz zwischen zwei potenziellen Ergebnissen für dieselbe Einheit — von denen Sie eines niemals beobachten. Sie können nicht darauf regressieren, denn es ist nicht in Ihren Daten. Causal Forests (Athey und Imbens 2016; Wager und Athey 2018) schätzen ihn nichtparametrisch und bemerkenswerterweise liefern sie ein gültiges Konfidenzintervall darum.

Drei Dinge machen dies möglich, und keines davon existiert in einem Standard Random Forest: ein Splitting-Kriterium, das die Varianz der Behandlungseffekte maximiert statt den Vorhersagefehler zu minimieren, eine Ehrlichkeits-Bedingung, die verbietet, dieselben Beobachtungen zu wählen, um einen Split zu bestimmen und den Effekt darin zu schätzen, und eine Neuinterpretation des Waldes als adaptiver Kernel, der Blatt-Koinzidenz in Schätzgewichte verwandelt. Diese drei Dinge zusammen mit dem Kalibrierungstest, der Ihnen sagt, ob die gefundene Heterogenität Signal ist, sind der Inhalt dieses Artikels.

Von Durchschnitts- zu heterogenen Effekten

Ein flacher durchschnittlicher Behandlungseffekt verbirgt die positiven und negativen Taschen, die eine heterogene Behandlungseffekt-Fläche aufdeckt

Der durchschnittliche Behandlungseffekt

Das Setup: eine binäre Behandlung Wi{0,1}W_i \in \{0, 1\} (ein Ereignis trat auf oder nicht), ein Ergebnis YiY_i (eine Rendite), Kovariaten Xi\mathbf{X}_i. Der Durchschnittliche Behandlungseffekt ist

τATE=E[Yi(1)Yi(0)]\tau_{\text{ATE}} = \mathbb{E}[Y_i(1) - Y_i(0)]

die durchschnittliche Auswirkung über alle Einheiten. Für Trading ist dies fast nutzlos — Sie handeln nicht den Durchschnitt. Wenn ein Ereignis die Hälfte des Universums nach oben und die andere Hälfte nach unten drückt, ist der ATE null und die Chance maximal.

Der bedingte durchschnittliche Behandlungseffekt

Der CATE τ(x)\tau(\mathbf{x}) konditioniert auf Merkmale. Gegeben eine Münze mit einer bestimmten Marktkapitalisierung, realisierter Volatilität, Funding-Historie und Orderbuch-Tiefe: Was ist die erwartete Renditewirkung von diesem Ereignis auf diesem Asset? Der CATE ist eine Funktion über den Kovariatenraum, und diese Funktion ohne Annahme ihrer Form zu schätzen, ist das, was Causal Forests tun.

Warum nicht einfach lineare Interaktionsmodelle verwenden?

Die Lehrbuch-Alternative ist eine gesättigte Regression:

Yi=α+βWi+γWiXi+δXi+ϵiY_i = \alpha + \beta W_i + \gamma W_i \cdot \mathbf{X}_i + \delta \mathbf{X}_i + \epsilon_i

wobei γ\gamma die Interaktion trägt. Dies nimmt an, dass die Interaktion linear ist. Das ist selten der Fall: Die Empfindlichkeit gegenüber einem Funding-Flip ist konvex im Hebel, nicht linear; die Tiefe interagiert multiplikativ mit der Marktkapitalisierung; das Volatilitätsregime bestimmt alles andere. Causal Forests treffen keine dieser Annahmen — sie partitionieren den Kovariatenraum adaptiv und lassen die Heterogenitätsstruktur aus den Daten fallen.

Causal Forests: Der Algorithmus

Disjunkte Stichproben bauen Baumstrukturen und schätzen Effekte in gefrorenen Blättern, bevor viele honest Bäume zu einem Causal Forest verschmelzen

Ein Causal Forest ist ein Random Forest, der um die Behandlungseffekt-Schätzgröße herum neu aufgebaut ist. Jeder Baum ist ein Kausalbaum, der den Kovariatenraum partitioniert, um die Heterogenität der Behandlungseffekte zu maximieren.

Kausalbäume

An jedem inneren Knoten wählt der Algorithmus eine Split-Variable jj und einen Split-Punkt ss. Der entscheidende Unterschied zu einem Regressionsbaum: Das Kriterium maximiert die Varianz des geschätzten Behandlungseffekts über die Kinder statt den quadratischen Vorhersagefehler zu minimieren.

Für einen Knoten mit Daten (Yi,Wi,Xi)inode(Y_i, W_i, \mathbf{X}_i)_{i \in \text{node}} ist die Effektschätzung auf Knotenebene die Differenz der Gruppenmittelwerte:

τ^node=YˉtreatedYˉcontrol\hat{\tau}_{\text{node}} = \bar{Y}_{\text{treated}} - \bar{Y}_{\text{control}}

und der Split-Score ist

Δ(split)=nLτ^L2+nRτ^R2nτ^parent2\Delta(\text{split}) = n_L \cdot \hat{\tau}_L^2 + n_R \cdot \hat{\tau}_R^2 - n \cdot \hat{\tau}_{\text{parent}}^2

mit nL,nR,nn_L, n_R, n den Stichprobengrößen im linken Kind, rechten Kind und Elternknoten. Dies ist genau die Zwischen-Gruppen-Varianz der Behandlungseffekte: Ein Split ist gut, wenn die beiden Kinder über den Effekt unterschiedlicher Meinung sind, nicht wenn sie das Ergebnis gut vorhersagen. Eine Kovariate, die YY stark vorhersagt, aber orthogonal dazu ist, wie WW wirkt, wird niemals ausgewählt.

Ehrliche Schätzung

Die entscheidende Innovation ist Ehrlichkeit. Die Daten, die die Baumstruktur bestimmen, müssen disjunkt zu den Daten sein, die Blatteffekte schätzen:

  1. Teilen Sie die Daten in Isplit\mathcal{I}_{\text{split}} und Iest\mathcal{I}_{\text{est}}
  2. Bauen Sie den Baum unter Verwendung nur von Isplit\mathcal{I}_{\text{split}}, um Split-Variablen und -Punkte zu wählen
  3. Schätzen Sie Blatteffekte unter Verwendung nur von Iest\mathcal{I}_{\text{est}}, indem Sie diese Beobachtungen in den bereits festgelegten Baum fallen lassen

Ohne dies betrügt der Baum: Er schnitzt Blätter, deren extreme Effekte Rauschen in genau derselben Stichprobe sind, die verwendet wurde, um sie zu finden, und berichtet dann dieses Rauschen als Schätzung. Dies ist derselbe adaptive-selection-Fehler, den die Wahrscheinlichkeit von Backtest-Overfitting auf Strategieebene misst, nur dass er hier innerhalb des Schätzers verteidigt wird statt事后 diagnostiziert zu werden. Ehrlichkeit erwirbt asymptotische Unverzerrtheit:

E[τ^(x)Xi=x]=τ(x)+o(1)\mathbb{E}[\hat{\tau}(\mathbf{x}) \mid \mathbf{X}_i = \mathbf{x}] = \tau(\mathbf{x}) + o(1)

Der Preis ist die Stichprobeneffizienz — die Hälfte Ihrer Daten baut eine Struktur, die dann nicht verwendet werden kann, um sie zu füllen.

Von Bäumen zu Wäldern

Ein Causal Forest aggregiert BB Kausalbäume, jeder auf einer zufälligen Teil-Stichprobe der Größe s<ns < n mit einer zufälligen Kovariaten-Teilmenge bei jedem Split:

τ^(x)=1Bb=1Bτ^b(x)\hat{\tau}(\mathbf{x}) = \frac{1}{B}\sum_{b=1}^{B} \hat{\tau}_b(\mathbf{x})

Die nützlichere Art, dies zu schreiben, ist als gewichteter Durchschnitt der Ergebnisse:

τ^(x)=i=1nαi(x)Yi\hat{\tau}(\mathbf{x}) = \sum_{i=1}^{n} \alpha_i(\mathbf{x}) \cdot Y_i

mit adaptiven Gewichten, die durch die Häufigkeit bestimmt werden, mit der Beobachtung ii im selben Blatt wie x\mathbf{x} landet:

αi(x)=1Bb=1B1(XiLb(x))Lb(x)\alpha_i(\mathbf{x}) = \frac{1}{B}\sum_{b=1}^{B} \frac{\mathbb{1}(\mathbf{X}_i \in L_b(\mathbf{x}))}{|L_b(\mathbf{x})|}

wobei Lb(x)L_b(\mathbf{x}) das Blatt ist, das x\mathbf{x} in Baum bb enthält. Dies ist die generalized-random-forest-Sicht (Athey, Tibshirani und Wager 2019): Ein Causal Forest ist ein lokal adaptiver Kernel-Schätzer. Er lernt seine eigene Vorstellung von "ähnlich", definiert durch die Kovariaten, die tatsächlich für Effektheterogenität wichtig sind, statt durch euklidische Distanz in einem Raum, in dem Sie die Skalierung manuell wählen mussten.

Asymptotische Theorie

Unter Regularitätsbedingungen (Wager und Athey 2018) ist der Schätzer konsistent, τ^(x)pτ(x)\hat{\tau}(\mathbf{x}) \xrightarrow{p} \tau(\mathbf{x}), und asymptotisch normal:

τ^(x)τ(x)σ^(x)dN(0,1)\frac{\hat{\tau}(\mathbf{x}) - \tau(\mathbf{x})}{\hat{\sigma}(\mathbf{x})} \xrightarrow{d} \mathcal{N}(0, 1)

was punktweise Intervalle τ^(x)±zα/2σ^(x)\hat{\tau}(\mathbf{x}) \pm z_{\alpha/2} \cdot \hat{\sigma}(\mathbf{x}) liefert. Die Varianz σ^2(x)\hat{\sigma}^2(\mathbf{x}) stammt aus dem infinitesimalen Jackknife (oder Bootstrap-of-little-bags), berechnet aus derselben Teil-Stichprobenstruktur, die der Wald bereits gebaut hat — keine äußere Bootstrap-Schleife.

Es lohnt sich, präzise zu sein, was diese Garantie ist und was nicht. Sie ist asymptotisch und punktweise und gilt für den CATE. Die konfidenz-Intervalle, die anderswo in diesem Blog verwendet werden, sind endliche Stichprobe und verteilungsfrei, aber marginal und decken ein Ergebnis ab. Andere Schätzgröße, andere Garantie; sie sind keine Ersatz.

Die Double-Machine-Learning-Verbindung

Wenn die Behandlung nicht zufällig zugewiesen ist, wird der Causal Forest auf residualisierte Daten gefittet: Ein Ergebnismodell m^(X)=E[YX]\hat{m}(\mathbf{X}) = \mathbb{E}[Y \mid \mathbf{X}] und ein Propensitätsmodell e^(X)=E[WX]\hat{e}(\mathbf{X}) = \mathbb{E}[W \mid \mathbf{X}] werden durch Cross-Fitting geschätzt, und der Wald läuft auf Y~=Ym^\tilde{Y} = Y - \hat{m} gegen W~=We^\tilde{W} = W - \hat{e}. Neyman-Orthogonalität ist das, was dies sicher macht: Der Fehler der Nuisance-Schätzung geht nur als Produkt ein, sodass m^\hat{m} und e^\hat{e} jeweils mit n1/4n^{-1/4} konvergieren können und τ^\hat{\tau} immer noch mit n1/2n^{-1/2} konvergiert.

Dieses Framework — Residualisierung, Cross-Fitting, das Orthogonalitätsargument, Auswirkungen auf Stichprobengröße — ist Gegenstand seines eigenen Artikels, Double Machine Learning für kausale Trading-Signale. Lesen Sie ihn zuerst; alles unten nimmt ihn an und behandelt nur, was sich ändert, wenn die Schätzgröße τ(x)\tau(\mathbf{x}) statt τ\tau ist.

Trading-Anwendung: Ereigniswirkungs-Heterogenität

Ein Markt-Ereignis erzeugt positive, neutrale und negative kontrafaktische Reaktionen über Assets mit verschiedenen Kovariaten

Setup

Die natürliche Domäne für diesen Blog ist das Perpetual-Futures-Coin-Universum, in dem Ereignisse häufig, zeitgestempelt und ohne Vendor-Feed beobachtbar sind.

  • Einheiten: Coin-Ereignis-Beobachtungen über das handelbare Perp-Universum
  • Behandlung: Wi=1W_i = 1, wenn das Ereignis für Coin ii ausgelöst wurde — ein Funding-Rate-Vorzeichen-Flip, ein Spot-Listing oder eine Liquidations-Kaskade, die die superkritische Schwelle überschreitet, die in Liquidations-Kaskaden als Trading-Signal beschrieben ist — und Wi=0W_i = 0 für passende Nicht-Ereignis-Fenster
  • Ergebnis: YiY_i = die abnormale Rendite über das Ereignisfenster, nicht die rohe Rendite. Fit ein Marktmodell auf ein Schätzfenster vor dem Ereignis, dann nehmen Sie die kumulative abnormale Rendite. Die genaue Spezifikation — Schätzfenster, Marktmodell-Regression, CAR-Konstruktion und ihre t-Statistik — ist im Event-Study-Abschnitt von LLM-Alpha-Mining aus Earnings-Calls ausgearbeitet; verwenden Sie sie unverändert. Dieser Schritt ist nicht optional: Ein rohes Close-to-Close-Ergebnis lässt die marktweite Bewegung in τ^\hat{\tau} eindringen, und da die Marktbewegung allen behandelten Einheiten gemeinsam ist, sieht sie genau wie ein Behandlungseffekt aus
  • Kovariaten Xi\mathbf{X}_i: Marktkapitalisierung, realisierte Volatilität, Funding-Historie, Orderbuch-Tiefe, Open-Interest-to-Cap-Ratio
  • Störfaktoren Wi\mathbf{W}_i: Regime-Variablen, die sowohl Ereigniswahrscheinlichkeit als auch Renditen verschieben

Das Trading-Signal

Die CATE-Fläche bildet sich genau wie jede kalibrierte Unsicherheitsschätzung auf einen Positions-Sizer ab: Größe nach τ^|\hat{\tau}| relativ zur Intervallbreite, und nicht handeln, wenn das Intervall null überspannt. Diese Entscheidungsregel — umgekehrte Breiten-Sizing, das Edge-Verhältnis e=τ^/we = |\hat{\tau}|/w, der No-Trade-Filter, die kostenbewusste Variante und das Argument, warum Sie dies nicht in einen Kelly-Bruch multiplizieren sollten — ist in Conformal Prediction für risikobewusstes Position Sizing abgeleitet. Verwenden Sie es mit τ^\hat{\tau} anstelle von μ^\hat{\mu} und dem Causal-Forest-Intervall anstelle des konformen Intervalls. Balancieren Sie die Long- und Short-Beine und das Buch ist von Konstruktion markneutral.

Python-Implementierung mit EconML

import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
from econml.dml import CausalForestDML


def fit_causal_forest(Y, T, X, W, n_estimators=1000):
    """
    CausalForestDML: residualize against (X, W), then fit a causal
    forest on the residuals.

    Y: abnormal returns over the event window (CAR, market-model adjusted)
    T: event indicator
    X: effect modifiers -- only these drive heterogeneity
    W: confounders -- enter the nuisance models only
    """
    cf = CausalForestDML(
        model_y=GradientBoostingRegressor(
            n_estimators=200, max_depth=5, learning_rate=0.05
        ),
        model_t=GradientBoostingClassifier(
            n_estimators=200, max_depth=5, learning_rate=0.05
        ),
        n_estimators=n_estimators,
        min_samples_leaf=20,
        max_depth=None,
        criterion="het",          # heterogeneity-based splitting
        honest=True,              # honest estimation
        inference=True,           # infinitesimal-jackknife intervals
        cv=5,                     # cross-fitting folds for DML
        random_state=42,
    )
    cf.fit(Y=Y, T=T, X=X, W=W)
    return cf


def summarize_cate(cf, X, feature_names):
    """Distribution of the CATE and what drives its heterogeneity."""
    tau_hat = cf.effect(X)
    tau_lo, tau_hi = cf.effect_interval(X, alpha=0.05)

    print(f"Mean CATE:      {tau_hat.mean():.4f}")
    print(f"Std CATE:       {tau_hat.std():.4f}")
    print(f"Range:          [{tau_hat.min():.4f}, {tau_hat.max():.4f}]")
    print(f"% CI excl. 0:   {((tau_lo > 0) | (tau_hi < 0)).mean():.1%}")

    for idx in np.argsort(cf.feature_importances_)[::-1]:
        print(f"  {feature_names[idx]:>20s}: {cf.feature_importances_[idx]:.4f}")

    return tau_hat, tau_lo, tau_hi

Interpretation der CATE-Fläche

Marginal-Effekt-Plots zeigen, wie sich der Behandlungseffekt entlang einer Kovariate bewegt, während der Rest bei seinem Median gehalten wird:

def plot_cate_by_feature(cf, X, feature_idx, n_points=50):
    x_grid = np.linspace(X[:, feature_idx].min(),
                         X[:, feature_idx].max(), n_points)
    X_eval = np.tile(np.median(X, axis=0), (n_points, 1))
    X_eval[:, feature_idx] = x_grid

    tau = cf.effect(X_eval)
    tau_lo, tau_hi = cf.effect_interval(X_eval, alpha=0.05)
    return x_grid, tau, tau_lo, tau_hi

Lesen Sie diese als Beschreibungen der gefitteten Fläche, nicht als kausale Dosis-Wirkungs-Kurven — das Halten der anderen Kovariaten auf ihrem Median kann Sie in eine Region des Kovariatenraums ohne Support platzieren.

Wichtige Annahmen und Diagnostik

Overlap, Balance, Hidden-Confounding und Placebo-Checks prüfen den Weg zu einem verteidigungsfähigen kausalen Schätzer

Verletzen Sie diese und Sie erhalten selbstbewusste, präzise, falsche Effekte.

1. Unconfoundedness (Selection on Observables)

Y(0),Y(1)WX,WY(0), Y(1) \perp W \mid \mathbf{X}, \mathbf{W}

Die Behandlungszuweisung muss unabhängig von potenziellen Ergebnissen gegeben beobachteter Kovariaten sein. Für ein mechanisch definiertes Ereignis ist dies verteidigungsfähig; für ein Ereignis, das selbst eine Marktreaktion ist — eine Listing-Ankündigung, das Auslösen der eigenen Liquidation Engine einer Börse — ist es nicht, weil derselbe unbeobachtete Fluss, der das Ereignis ausgelöst hat, auch die Rendite bewegt.

Testen Sie es mit der Rosenbaum-Empfindlichkeitsanalyse: Wenn ein unbeobachtetes UU die Behandlungschancen um bis zu einem Faktor Γ\Gamma verschieben kann,

P(W=1X,U)P(W=0X,U)ΓP(W=1X)P(W=0X)\frac{P(W=1 \mid \mathbf{X}, U)}{P(W=0 \mid \mathbf{X}, U)} \leq \Gamma \cdot \frac{P(W=1 \mid \mathbf{X})}{P(W=0 \mid \mathbf{X})}

wie groß muss Γ\Gamma sein, bevor der geschätzte Effekt das Vorzeichen wechselt? Ein Design, das bei Γ=1.1\Gamma = 1.1 bricht, ist kein Befund.

2. Overlap (Positivität)

0<P(W=1X=x)<1x0 < P(W = 1 \mid \mathbf{X} = \mathbf{x}) < 1 \quad \forall \mathbf{x}

Jede Einheit braucht eine positive Wahrscheinlichkeit, in beiden Armen zu erscheinen. Überprüfen Sie die Propensity-Scores und trimmen Sie:

propensity = cf.models_t[0][0].predict_proba(np.hstack([X, W]))[:, 1]
print(f"Propensity range: [{propensity.min():.3f}, {propensity.max():.3f}]")
valid = (propensity > 0.05) & (propensity < 0.95)
print(f"Retained after trimming: {valid.mean():.1%}")

Trimmen ist nicht kostenlos — es definiert die Bevölkerung neu, die Ihr τ^\hat{\tau} beschreibt. Berichten Sie, welcher Anteil überlebt hat.

3. SUTVA (Stable Unit Treatment Value Assumption)

Yi=Yi(Wi)(no interference between units)Y_i = Y_i(W_i) \quad \text{(no interference between units)}

Die Behandlung einer Einheit darf das Ergebnis einer anderen nicht beeinflussen. In Krypto ist dies die schwächste der drei: Eine Liquidations-Kaskade in einem Perp propagiert durch geteilte Kollateral und Market-Maker-Inventor in jedes korrelierte Paar, was definitionsgemäß Interferenz ist. Das Clustern von Standardfehlern nach Korrelationsgruppe adressiert dies teilweise; nichts tut es vollständig.

Jenseits binärer Behandlungen

Causal Forests erstrecken sich auf kontinuierliche Behandlungen durch dieselbe DML-Machinery — Schätzung, wie das Ausmaß eines Schocks, nicht nur sein Auftreten, Assets unterschiedlich bewegt:

Yi=τ(Xi)Ti+g(Xi,Wi)+ϵiY_i = \tau(\mathbf{X}_i) \cdot T_i + g(\mathbf{X}_i, \mathbf{W}_i) + \epsilon_i

wobei TiT_i zum Beispiel die Größe der Funding-Rate-Änderung in Basispunkten ist. Nun ist τ(x)\tau(\mathbf{x}) ein Effekt pro Basispunkt.

cf_continuous = CausalForestDML(
    model_y=GradientBoostingRegressor(n_estimators=200),
    model_t=GradientBoostingRegressor(n_estimators=200),  # regression, not classifier
    discrete_treatment=False,
    n_estimators=1000,
    honest=True,
    inference=True,
)
cf_continuous.fit(Y=car, T=funding_change_bps, X=asset_features, W=controls)
effects_25bp = cf_continuous.effect(X_test, T0=0, T1=25)

Praktische Überlegungen

Ist die Heterogenität echt?

Dies ist die Frage, die Causal Forests beantworten und nichts anderes in diesem Blog tut, und sie verdient einen echten Test statt einer Daumenregel. Ehrlichkeit schützt vor spuriosen Splits innerhalb des Schätzers; Out-of-Sample-Evaluation über zurückgehaltene Ereignisse (nicht zurückgehaltene Assets) ist Standard und in Walk-Forward-Optimierung und deflated Sharpe und Multiple Testing abgedeckt. Keines sagt Ihnen, ob τ^(x)\hat{\tau}(\mathbf{x}) überhaupt mit x\mathbf{x} variiert.

Der Best Linear Predictor-Test tut dies. Regressieren Sie das residualisierte Ergebnis auf die residualisierte Behandlung und ihre Interaktion mit dem demittelten CATE-Schätzer:

Yim^(Xi)=α0(Wie^(Xi))+α1(Wie^(Xi))(τ^(Xi)τˉ)+ϵiY_i - \hat{m}(\mathbf{X}_i) = \alpha_0 (W_i - \hat{e}(\mathbf{X}_i)) + \alpha_1 (W_i - \hat{e}(\mathbf{X}_i))(\hat{\tau}(\mathbf{X}_i) - \bar{\tau}) + \epsilon_i

Die beiden Koeffizienten beantworten zwei verschiedene Fragen. α0\alpha_0 ist der durchschnittliche Effekt: Gibt es hier überhaupt etwas? α1\alpha_1 ist die Kalibrierungssteigung Ihrer eigenen Vorhersagen: Wenn Ihr Wald sagt, dass der Effekt größer ist, ist er tatsächlich größer? Unter der Nullhypothese keine Heterogenität α1=0\alpha_1 = 0. Unter perfekter Kalibrierung α1=1\alpha_1 = 1. Ein α1\alpha_1 signifikant über null aber weit unter eins bedeutet, der Wald hat eine echte Ordnung gefunden, aber ihre Streuung übertrieben — Sie können das Ranking handeln, nicht die Größen.

EconMLs RScorer liefert eine begleitende Modellauswahl-Punktzahl:

from econml.score import RScorer

scorer = RScorer(
    model_y=GradientBoostingRegressor(n_estimators=100),
    model_t=GradientBoostingClassifier(n_estimators=100),
    discrete_treatment=True,
    cv=5,
)
scorer.fit(Y_val, T_val, X=X_val, W=W_val)
print(f"R-score: {scorer.score(cf):.4f}")

Fit den Scorer auf einem Validation-Split, den der Wald nie gesehen hat, und verwenden Sie ihn dann, um Kandidaten-CATE-Modelle gegeneinander und gegen ein konstantes-Effekt-Baseline zu vergleichen. Ein Wald, der das konstante Effekt-Modell auf R-Score nicht schlagen kann, hat keine handelbare Heterogenität gefunden, egal was seine In-Sample-Importances sagen.

Stichprobengröße

Causal Forests benötigen mehr Daten als ein Ergebnismodell, weil die Schätzgröße eine Differenz ist und beide Arme in jedem Blatt besetzt sein müssen. Die generelle Daten-vs-Parameter-Disziplin — wie viele Out-of-Sample-Punkte pro freiem Parameter und die Bonferroni-Korrektur, sobald Sie Konfigurationen vergleichen — ist im Abschnitt Datenanforderungen von Walk-Forward-Optimierung. Die causal-forest-spezifische Antwort ist empirisch, keine Daumenregel: Fit den Wald auf verschachtelten Teil-Stichproben und zeichnen Sie die mediane Intervallbreite gegen nn; die verwendbare Stichprobengröße ist dort, wo die Breite unter die Effektgrößen fällt, die Sie handeln wollen.

Walk-Forward, mit zwei Besonderheiten

Das Evaluierungsprotokoll ist gewöhnliches anchored walk-forward — Refit auf allen Ereignissen bis tt, Handeln von Ereignis t+1t+1 — und die vollständige Behandlung, einschließlich Purging, Embargo, der Walk-Forward-Effizienz-Ratio und die Degradationsrate, ist in Walk-Forward-Optimierung. Zwei Dinge sind spezifisch für diesen Schätzer.

Erstens überlappen Ereignisfenster. Wenn das Kovariatenfenster vor Ereignis t+1t+1 das Ergebnisfenster von Ereignis tt enthält, teilen sich die Folds Beobachtungen und das Out-of-Sample-Ergebnis ist kontaminiert. Entfernen Sie überlappende Fenster, bevor Sie eine einzige PnL-Zahl zählen; bei einer mechanisch häufigen Behandlung wie einem Funding-Flip kann dies einen beträchtlichen Anteil der Ereignisse entfernen.

Zweitens muss der honest Split bei jedem Refit neu gezogen werden. Das Tragen derselben Isplit\mathcal{I}_{\text{split}}/Iest\mathcal{I}_{\text{est}}-Partition über Fills führt genau die Strukturselection-Leckage wieder ein, gegen die Ehrlichkeit existiert, weil die neu hinzugefügten Ereignisse in einer Partition landen, die mit Wissen der alten gewählt wurde.

Dann laufen Sie ereignisbezogene Out-of-Sample-PnL durch die üblichen Gates — PBO und das deflated Sharpe-Verhältnis — bevor Sie irgendetwas glauben.

Kosten

Ein CATE-Signal wird wie jedes andere ereignisgesteuerte Signal bewertet: Ziehen Sie die erwartete halbe Spread von τ^|\hat{\tau}| vor dem No-Trade-Filter ab und sizing Sie in dünnen Büchern herunter. Die quantitativen Versionen — das Quadratwurzel-Impact-Gesetz und gefittete Kostenkurven in Slippage-Kostenmodellen, der kostenbewusste No-Trade-Filter in Conformal Prediction und die Ausführungsabrechnung in Implementation Shortfall und TCA — all das ändert sich nicht.

Das eine, was nicht übertragen wird: Die Haltbarkeit eines CATE-Signals ist durch das Ereignisfenster begrenzt, sodass die Kosten über eine feste kurze Haltedauer amortisiert werden statt über eine offene. Ein durchgehend gehaltenes Signal zahlt die Spread einmal und verdient, solange das Edge anhält; dieses zahlt sie bei jedem Ereignis. Ob das Edge das übersteht, ist eine empirische Frage über Ihr spezifisches Ereignis und Ihr spezifisches Universum, und es ist das erste, was Sie überprüfen müssen, denn es kann die Strategie töten, bevor die kausale Maschine wichtig wird.

Fazit

Causal Forests schätzen ein anderes Objekt als der Rest des Toolkits dieses Blogs. Nicht "was wird dieser Asset zurückgeben", sondern "wie viel hat dieses Ereignis diesen Asset bewegt, relativ zum Kontrafaktual, wo es nicht ausgelöst wurde". Die Machinery, dies schätzbar zu machen — Heterogenität-maximierende Splits, ehrliche Schätzung, die adaptive Kernel-Gewichtsdarstellung und infinitesimal-jackknife-Intervalle — hat kein Analog im gewöhnlichen überwachten Lernen, und die Annahmen, die es braucht (Unconfoundedness, Overlap, SUTVA), sind stark genug, dass sie getestet werden müssen, statt einfach behauptet zu werden.

Was dieser Artikel nicht hat, ist ein Ergebnis. Jede Zahl oben ist ein Platzhalter. Gegen den Standard, der durch das ehrliche Negative und deflated Sharpe gesetzt wird, ist eine Methode ohne gemessene CATE-Verteilung, einen BLP α1\alpha_1 mit einem p-Wert, ein Overlap-Diagnostikum und DSR/PBO-gegate Out-of-Sample-PnL ein Tutorial, kein Befund. Diese Zahlen sind das nächste Arbeit; ein negatives Ergebnis ist es wert, veröffentlicht zu werden.

Referenzen

  1. Athey, S., Imbens, G.W. "Recursive Partitioning for Heterogeneous Causal Effects." PNAS, 113(27), 7353-7360 (2016).
  2. Wager, S., Athey, S. "Estimation and Inference of Heterogeneous Treatment Effects using Random Forests." JASA, 113(523), 1228-1242 (2018). arXiv:1510.04342
  3. Athey, S., Tibshirani, J., Wager, S. "Generalized Random Forests." Annals of Statistics, 47(2), 1148-1178 (2019).
  4. Chernozhukov, V., et al. "Double/Debiased Machine Learning for Treatment and Structural Parameters." The Econometrics Journal, 21(1), C1-C68 (2018).
  5. Chernozhukov, V., Demirer, M., Duflo, E., Fernandez-Val, I. "Generic Machine Learning Inference on Heterogeneous Treatment Effects in Randomized Experiments." (2018). arXiv:1712.04802
  6. Battocchi, K., et al. "EconML: A Python Package for ML-Based Heterogeneous Treatment Effects Estimation." Microsoft Research (2019). GitHub
blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

Dem Markt einen Schritt voraus

Abonniere unseren Newsletter für exklusive KI-Trading-Einblicke, Marktanalysen und Plattform-Updates.

Wir respektieren deine Privatsphäre. Jederzeit abbestellbar.