← Torna agli articoli
August 1, 2026
5 min di lettura

Causal Forests per effetti di trattamento eterogenei nel trading

Causal Forests per effetti di trattamento eterogenei nel trading
#causal-inference
#causal-forest
#heterogeneous-effects
#econometrics
#treatment

Ogni modello predittivo in questo blog stima lo stesso oggetto: una media condizionale μ(x)=E[YX=x]\mu(\mathbf{x}) = \mathbb{E}[Y \mid \mathbf{X} = \mathbf{x}]. Feature engineering, gradient boosting, intervalli conformi, validazione walk-forward — tutto questo serve un singolo estimand. Questo articolo riguarda un estimand diverso e la macchina che cambia quando lo sostituisci.

L'oggetto è l'effetto medio di trattamento condizionato:

τ(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}]

la differenza tra due potenziali risultati per la stessa unità — uno dei quali non osserverai mai. Non puoi fare regressione su di esso, perché non è nei tuoi dati. I causal forests (Athey e Imbens 2016; Wager e Athey 2018) lo stimano in modo non parametrico e, notevolmente, ti danno un intervallo di confidenza valido attorno ad esso.

Tre cose rendono questo possibile e nessuna di esse esiste in una foresta casuale standard: un criterio di divisione che massimizza la varianza dell'effetto di trattamento invece di minimizzare l'errore di previsione, un vincolo di onestà che vieta di usare le stesse osservazioni per scegliere una divisione e stimare l'effetto al suo interno, e una rilettura della foresta come un kernel adattivo che trasforma la co-occorrenza delle foglie in pesi di stima. Queste tre cose, oltre al test di calibrazione che ti dice se l'eterogeneità che hai trovato è segnale, sono il contenuto di questo articolo.

Da effetti medi a effetti eterogenei

Un effetto di trattamento medio piatto nasconde le tasche positive e negative rivelate da una superficie di effetto di trattamento eterogeneo

L'effetto medio di trattamento

L'impostazione: un trattamento binario Wi{0,1}W_i \in \{0, 1\} (un evento si è verificato o no), un risultato YiY_i (un rendimento), covariate Xi\mathbf{X}_i. L'Effetto Medio di Trattamento è

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

l'impatto medio su tutte le unità. Per il trading questo è quasi inutile — non fai trading della media. Se un evento spinge metà dell'universo su e metà giù, l'ATE è zero e l'opportunità è massima.

L'effetto medio di trattamento condizionato

Il CATE $\tau(\mathbf{x})` condiziona sulle caratteristiche. Data una moneta con una specifica capitalizzazione di mercato, volatilità realizzata, storia di funding e profondità del libro, qual è l'impatto di rendimento atteso di questo evento su questo asset? Il CATE è una funzione sullo spazio delle covariate, e stimare quella funzione senza imporne la forma è ciò che fanno i causal forests.

Perché non usare solo modelli di interazione lineare?

L'alternativa del libro di testo è una regressione saturata:

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

dove γ\gamma porta l'interazione. Questo assume che l'interazione sia lineare. Raramente lo è: la sensibilità a un flip di funding è convessa nella leva, non lineare; la profondità interagisce moltiplicativamente con la capitalizzazione di mercato; il regime di volatilità controlla tutto il resto. I causal forests non impongono nulla di questo — partizionano lo spazio delle covariate in modo adattivo e lasciano che la struttura dell'eterogeneità emerga dai dati.

Causal Forests: L'algoritmo

Campioni disgiunti costruiscono la struttura dell'albero e stimano gli effetti in foglie congelate prima che molti alberi onesti si fondano in una causal forest

Una causal forest è una foresta casuale ricostruita attorno all'estimand dell'effetto di trattamento. Ogni albero è un albero causale che partiziona lo spazio delle covariate per massimizzare l'eterogeneità dell'effetto di trattamento.

Alberi causali

In ogni nodo interno, l'algoritmo sceglie una variabile di divisione jj e un punto di divisione ss. La differenza chiave da un albero di regressione: il criterio massimizza la varianza dell'effetto di trattamento stimato attraverso i figli invece di minimizzare l'errore di previsione al quadrato.

Per un nodo con dati (Yi,Wi,Xi)inode(Y_i, W_i, \mathbf{X}_i)_{i \in \text{node}}, la stima dell'effetto a livello di nodo è la differenza nelle medie di gruppo:

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

e il punteggio di divisione è

Δ(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

con nL,nR,nn_L, n_R, n le dimensioni del campione nel figlio sinistro, figlio destro e genitore. Questo è esattamente la varianza tra gruppi degli effetti di trattamento: una divisione è buona quando i due figli non sono d'accordo sull'effetto, non quando predicono bene il risultato. Una covariata che predice fortemente YY ma è ortogonale a come agisce WW non verrà mai selezionata.

Stima onesta

L'innovazione critica è l'onestà. I dati utilizzati per determinare la struttura dell'albero devono essere disgiunti dai dati utilizzati per stimare gli effetti delle foglie:

  1. Dividi i dati in Isplit\mathcal{I}_{\text{split}} e Iest\mathcal{I}_{\text{est}}
  2. Costruisci l'albero usando solo Isplit\mathcal{I}_{\text{split}} per scegliere variabili e punti di divisione
  3. Stima gli effetti delle foglie usando solo Iest\mathcal{I}_{\text{est}}, facendo cadere quelle osservazioni nell'albero già fissato

Senza questo, l'albero imbroglia: scolpisce foglie i cui effetti estremi sono rumore nello stesso campione usato per trovarle, poi riporta quel rumore come la stima. Questo è lo stesso fallimento di selezione adattiva che la probabilità di overfitting del backtest misura a livello di strategia, tranne che qui è difeso contro all'interno dello stimatore invece di essere diagnosticato dopo il fatto. L'onestà acquista non-distorsione asintotica:

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

Il prezzo è l'efficienza del campione — metà dei tuoi dati costruisce una struttura che poi non può essere usata per riempirla.

Da alberi a foreste

Una causal forest aggrega BB alberi causali, ciascuno su un sottocampione casuale di dimensione s<ns < n con un sottoinsieme casuale di covariate a ogni divisione:

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

Il modo più utile di scriverlo è come una media ponderata dei risultati:

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

con pesi adattivi imposti dalla frequenza con cui l'osservazione ii atterra nella stessa foglia di x\mathbf{x}:

α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})|}

dove Lb(x)L_b(\mathbf{x}) è la foglia contenente x\mathbf{x} nell'albero bb. Questa è la vista della foresta casuale generalizzata (Athey, Tibshirani e Wager 2019): una causal forest è uno stimatore kernel localmente adattivo. Impara la sua nozione di "simile", definita da quali covariate contano realmente per l'eterogeneità dell'effetto, invece che dalla distanza euclidea in uno spazio dove dovevi scegliere la scala manualmente.

Teoria asintotica

Sotto condizioni di regolarità (Wager e Athey 2018) lo stimatore è consistente, τ^(x)pτ(x)\hat{\tau}(\mathbf{x}) \xrightarrow{p} \tau(\mathbf{x}), e asintoticamente normale:

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

dando intervalli puntuali τ^(x)±zα/2σ^(x)\hat{\tau}(\mathbf{x}) \pm z_{\alpha/2} \cdot \hat{\sigma}(\mathbf{x}). La varianza σ^2(x)\hat{\sigma}^2(\mathbf{x}) proviene dal jackknife infinitesimale (o bootstrap-di-piccole-borse), calcolato dalla stessa struttura di sottocampione che la foresta ha già costruito — nessun loop bootstrap esterno.

Vale la pena essere precisi su cosa garantisce questa garanzia e cosa non garantisce. È asintotica e puntuale, e vale per il CATE. Gli intervalli di previsione conforme usati altrove in questo blog sono di campione finito e liberi dalla distribuzione, ma marginali, e coprono un risultato. Diverso estimand, diversa garanzia; non sono sostituti.

La connessione Double Machine Learning

Quando il trattamento non è assegnato casualmente, la causal forest è adattata su dati residualizzati: un modello di risultato m^(X)=E[YX]\hat{m}(\mathbf{X}) = \mathbb{E}[Y \mid \mathbf{X}] e un modello di propensione e^(X)=E[WX]\hat{e}(\mathbf{X}) = \mathbb{E}[W \mid \mathbf{X}] sono stimati mediante cross-fitting, e la foresta funziona su Y~=Ym^\tilde{Y} = Y - \hat{m} contro W~=We^\tilde{W} = W - \hat{e}. L'ortogonalità di Neyman è ciò che rende questo sicuro: l'errore di stima del disturbo entra solo come un prodotto, quindi m^\hat{m} e e^\hat{e} possono convergere ciascuno a n1/4n^{-1/4} e τ^\hat{\tau} converge ancora a n1/2n^{-1/2}.

Quel framework — residualizzazione, cross-fitting, l'argomento di ortogonalità, implicazioni sulla dimensione del campione — è oggetto del proprio articolo, Double Machine Learning per segnali di trading causali. Leggilo prima; tutto sotto assume questo e copre solo cosa cambia quando l'estimand è τ(x)invecedi\tau(\mathbf{x})` invece di \tau$.

Applicazione di trading: Eterogeneità dell'impatto degli eventi

Un evento di mercato produce risposti controfattuali positive, neutre e negative attraverso asset con diverse covariate

Impostazione

Il dominio naturale per questo blog è l'universo di monete perpetual-futures, dove gli eventi sono frequenti, con timestamp e osservabili senza un feed di fornitore.

  • Unità: osservazioni moneta-evento attraverso l'universo perp commerciabile
  • Trattamento: Wi=1W_i = 1 se l'evento si è verificato per la moneta ii — un flip di segno del tasso di funding, un listing spot, o una cascata di liquidazione che attraversa la soglia supercritica descritta in cascate di liquidazione come segnale di trading — e Wi=0W_i = 0 per finestre non evento corrispondenti
  • Risultato: YiY_i = il rendimento anormale sulla finestra dell'evento, non il rendimento grezzo. Adatta un modello di mercato su una finestra di stima precedente all'evento, poi prendi il rendimento anormale cumulativo. La specifica esatta — finestra di stima, regressione del modello di mercato, costruzione CAR e la sua statistica t — è elaborata nella sezione dello studio dell'evento di LLM alpha mining dalle earnings call; riutilizzalo verbatim. Questo passaggio non è opzionale: un risultato close-to-close grezzo permette al movimento di tutto il mercato di entrare in τ^\hat{\tau}, e dato che il movimento del mercato è comune a tutte le unità trattate sembra esattamente come un effetto di trattamento
  • Covariate Xi\mathbf{X}_i: capitalizzazione di mercato, volatilità realizzata, storia di funding, profondità del libro degli ordini, rapporto interesse-aperto-a-cap
  • Confounder Wi\mathbf{W}_i: variabili di regime che spostano sia la probabilità dell'evento che i rendimenti

Il segnale di trading

La superficie CATE si mappa su un position sizer esattamente come qualsiasi stima di incertezza calibrata: dimensiona per τ^|\hat{\tau}| relativo alla larghezza dell'intervallo, e non fare trading quando l'intervallo attraversa zero. Quella regola di decisione — sizing per larghezza inversa, il rapporto edge e=τ^/we = |\hat{\tau}|/w, il filtro no-trade, la variante consapevole dei costi, e l'argomento per cui non dovresti moltiplicarlo in una frazione di Kelly — è derivata in Previsione Conforme per Position Sizing Consapevole del Rischio. Riutilizzalo con τ^alpostodi\hat{\tau}` al posto di \hat{\mu}` e l'intervallo della causal forest al posto di quello conforme. Bilancia le gambe lunghe e corte e il libro è neutrale al mercato per costruzione.

Implementazione Python con 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

Interpretare la superficie CATE

I grafici dell'effetto marginale mostrano come l'effetto di trattamento si sposta lungo una covariata con il resto tratto alla sua mediana:

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

Leggi questi come descrizioni della superficie adattata, non come curve dose-risposta causali — mantenere le altre covariate alla loro mediana può posizionarti in una regione dello spazio delle covariate senza supporto.

Assunzioni chiave e diagnostica

Overlap, equilibrio, hidden confounding e controlli placebo regolano il percorso verso una stima causale difendibile

Viola queste e ottieni effetti sicuri, precisi, sbagliati.

1. Non confondimento (Selezione su osservabili)

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

L'assegnazione del trattamento deve essere indipendente dai risultati potenziali date le covariate osservate. Per un evento definito meccanicamente questo è difendibile; per un evento che è esso stesso una reazione di mercato — un annuncio di listing, il motore di liquidazione di uno scasso che si attiva — non lo è, perché lo stesso flusso non osservato che ha innescato l'evento muove anche il rendimento.

Testalo con analisi di sensibilità di Rosenbaum: se un UU non osservato può spostare le quote del trattamento fino a un fattore Γ\Gamma,

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})}

quanto grande deve essere Γ\Gamma prima che l'effetto stimato cambi segno? Un design che si rompe a Γ=1.1\Gamma = 1.1 non è un finding.

2. Overlap (Positività)

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

Ogni unità ha bisogno di probabilità positiva di apparire in entrambe le braccia. Controlla i punteggi di propensione e trimma:

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%}")

Il trimming non è gratuito — ridefinisce la popolazione che descrive il tuo τ^\hat{\tau}. Riporta quale frazione è sopravvissuta.

3. SUTVA (Assunzione di Valore di Trattamento Unitario Stabile)

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

Il trattamento di un'unità non deve influenzare il risultato di un'altra. In crypto questo è il più debole dei tre: una cascata di liquidazione in un perp si propaga attraverso collaterale condiviso e inventario dei market maker in ogni coppia correlata, che è interferenza per definizione. Raggruppare gli errori standard per gruppo di correlazione lo affronta parzialmente; nulla lo fa completamente.

Oltre i trattamenti binari

I causal forests si estendono ai trattamenti continui attraverso la stessa macineria DML — stimando quanto la magnitude di uno shock, non solo la sua occorrenza, sposta gli asset in modo differenziale:

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

dove TiT_i è, diciamo, la dimensione del cambiamento del tasso di funding in punti base. Ora τ(x)\tau(\mathbf{x}) è un effetto per punto base.

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)

Considerazioni pratiche

L'eterogeneità è reale?

Questa è la domanda a cui i causal forests rispondono e nient'altro in questo blog fa, e merita un vero test invece di una regola empirica. L'onestà protegge da divisioni spurie all'interno dello stimatore; la valutazione out-of-sample su eventi trattenuti (non asset trattenuti) è standard e coperta in ottimizzazione walk-forward e Sharpe sgonfio e test multipli. Nessuno ti dice se τ^(x)\hat{\tau}(\mathbf{x}) varia con x\mathbf{x} del tutto.

Il test del Miglior Predittore Lineare lo fa. Regressi il risultato residualizzato sul trattamento residualizzato e la sua interazione con la stima CATE centrata:

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

I due coefficienti rispondono a due diverse domande. α0\alpha_0 è l'effetto medio: c'è qualcosa qui affatto? α1\alpha_1 è la pendenza di calibrazione sulle tue previsioni: quando la tua foresta dice che l'effetto è più grande, è davvero più grande? Sotto la nullità di nessuna eterogeneità α1=0\alpha_1 = 0. Sotto calibrazione perfetta α1=1\alpha_1 = 1. Un α1\alpha_1 significativamente sopra zero ma lontano da uno significa che la foresta ha trovato un ordinamento reale ma ha esagerato la sua diffusione — puoi fare trading del ranking, non delle magnitudini.

L'RScorer di EconML dà un punteggio di selezione del modello compagno:

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}")

Adatta lo scorer su uno split di validazione che la foresta non ha mai visto, poi usalo per confrontare i modelli CATE candidati l'uno contro l'altro e contro una baseline a effetto costante. Una foresta che non può battere il modello a effetto costante su R-score non ha trovato eterogeneità che vale la pena fare trading, qualsiasi cosa dicano le sue importanze in-sample.

Dimensione del campione

I causal forests hanno bisogno di più dati di un modello di risultato, perché l'estimand è una differenza e entrambe le braccia devono essere popolate in ogni foglia. La disciplina generale dati-vs-parametri — quanti punti out-of-sample per parametro libero, e la correzione di Bonferroni una volta che stai confrontando configurazioni — è nella sezione dei requisiti dei dati di ottimizzazione walk-forward. La risposta specifica della causal forest è empirica, non una regola empirica: adatta la foresta su sottocampioni annidati e traccia la larghezza dell'intervallo mediana contro nn; la dimensione del campione utilizzabile è dove la larghezza scende sotto le dimensioni dell'effetto che intendi fare trading.

Walk-Forward, con due sfumature

Il protocollo di valutazione è walk-forward ancorato ordinario — refit su tutti gli eventi fino a tt, trade evento t+1t+1 — e il trattamento completo, incluso purging, embargo, il rapporto di efficienza walk-forward e il tasso di degradazione, è in ottimizzazione walk-forward. Due cose sono specifiche per questo stimatore.

Primo, le finestre degli eventi si sovrappongono. Se la finestra delle covariate precedente l'evento t+1t+1 contiene la finestra del risultato dell'evento tt, i fold condividono osservazioni e il risultato out-of-sample è contaminato. Elimina le finestre sovrapposte prima di contare un solo numero PnL; con un trattamento frequente meccanicamente come un flip di funding questo può rimuovere una porzione sostanziale di eventi.

Secondo, la divisione onesta deve essere ridisegnata a ogni refit. Portare la stessa partizione Isplit\mathcal{I}_{\text{split}}/Iest\mathcal{I}_{\text{est}} attraverso i fold reintroduce esattamente la perdita di selezione-struttura che l'onestà esiste per prevenire, perché gli eventi nuovamente aggiunti atterrano in una partizione che è stata scelta con conoscenza dei vecchi.

Poi esegui il PnL out-of-sample a livello evento attraverso i soliti gate — PBO e il ratio di Sharpe sgonfio — prima di credere a qualcosa.

Costi

Un segnale CATE è prezzato come qualsiasi altro segnale guidato da eventi: sottrai lo half-spread previsto da $|\hat{\tau}|` prima del filtro no-trade, e dimensiona verso il basso nei libri sottili. Le versioni quantitative — la legge dell'impatto radice quadrata e le curve dei costi adattate in modelli dei costi di slippage, il filtro no-trade consapevole dei costi in previsione conforme, e la contabilità di esecuzione in implementation shortfall e TCA — tutti trasferiscono invariati.

L'unica cosa che non si trasferisce: la shelf-life di un segnale CATE è limitata dalla finestra dell'evento, quindi il costo è ammortizzato su un periodo di holding fisso breve invece che su uno aperto. Un segnale detenuto continuativamente paga lo spread una volta e guadagna finché l'edge persiste; questo lo paga a ogni evento. Se l'edge sopravvive a questo è una domanda empirica sul tuo evento specifico e il tuo universo specifico, ed è la prima cosa da verificare, perché può uccidere la strategia prima che conti qualcosa della macchina causale.

Conclusione

I causal forests stimano un oggetto diverso dal resto del toolkit di questo blog. Non "cosa renderà questo asset", ma "quanto questo evento ha spostato questo asset, relativo al controfattuale dove non si è attivato". La macchina che rende questo stimabile — le divisioni che massimizzano l'eterogeneità, la stima onesta, la rappresentazione dei pesi kernel adattivi e gli intervalli jackknife infinitesimale — non ha analogo nell'apprendimento supervisionato ordinario, e le assunzioni di cui ha bisogno (non confondimento, overlap, SUTVA) sono abbastanza forti che devono essere testate invece che essere affermate.

Ciò che questo articolo non ha è un risultato. Ogni numero sopra è un segnaposto. Contro lo standard stabilito dal negativo onesto e Sharpe sgonfio, un metodo senza distribuzione CATE misurata, un BLP α1\alpha_1 con un p-value, una diagnostica di overlap e PnL out-of-sample con gate DSR/PBO è un tutorial, non un finding. Quei numeri sono il prossimo lavoro; un risultato negativo vale la pena essere pubblicato.

Riferimenti

  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
Disclaimer: le informazioni fornite in questo articolo hanno solo scopo didattico e informativo e non costituiscono consulenza finanziaria, di investimento o di trading. Il trading di criptovalute comporta un rischio significativo di perdita.

Autori

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

Resta un Passo Avanti al Mercato

Iscriviti alla nostra newsletter per approfondimenti esclusivi sul trading con IA, analisi di mercato e aggiornamenti sulla piattaforma.

Rispettiamo la tua privacy. Annulla l'iscrizione in qualsiasi momento.