Causal Forests untuk Efek Perawatan Heterogen dalam Trading
Setiap model prediktif di blog ini memperkirakan objek yang sama: rata-rata bersyarat . Feature engineering, gradient boosting, interval konformal, validasi walk-forward — semuanya melayani satu estimand. Artikel ini tentang estimand yang berbeda dan mesin yang berubah saat Anda menukarnya.
Objeknya adalah rata-rata efek perawatan bersyarat:
perbedaan antara dua hasil potensial untuk unit yang sama — yang tidak pernah Anda amati. Anda tidak bisa melakukan regresi padanya, karena itu tidak ada di data Anda. Causal forests (Athey dan Imbens 2016; Wager dan Athey 2018) memperkiraannya secara nonparametrik dan, luar biasanya, memberikan interval kepercayaan yang valid di sekitarnya.
Tiga hal membuat ini mungkin dan tidak ada satupun yang ada dalam random forest standar: kriteria pemisahan yang memaksimalkan varians efek perawatan alih-alih meminimalkan kesalahan prediksi, kendala kejujuran yang melarang menggunakan observasi yang sama untuk memilih split dan memperkirakan efek di dalamnya, dan pembacaan ulang hutan sebagai kernel adaptif yang mengubah ko-kejadian daun menjadi bobot estimasi. Ketiga hal ini, ditambah tes kalibrasi yang memberi tahu Anda apakah heterogenitas yang Anda temukan adalah sinyal, adalah isi artikel ini.
Dari Efek Rata-rata ke Efek Heterogen

Efek Perawatan Rata-rata
Pengaturan: perawatan biner (suatu kejadian terjadi atau tidak), hasil (return), kovariat . Efek Perawatan Rata-rata adalah
dampak rata-rata di seluruh unit. Untuk trading ini hampir tidak berguna — Anda tidak trading rata-ratanya. Jika suatu kejadian mendorong setengah alam semesta naik dan setengah turun, ATE adalah nol dan peluangnya maksimal.
Efek Perawatan Rata-rata Bersyarat
CATE $\tau(\mathbf{x})` mengkondisikan pada karakteristik. Diberikan koin dengan kapitalisasi pasar tertentu, volatilitas terealisasi, riwayat pendanaan, dan kedalaman buku, apa dampak return yang diharapkan dari kejadian ini pada aset ini? CATE adalah fungsi atas ruang kovariat, dan memperkirakan fungsi itu tanpa memaksakan bentuknya adalah yang dilakukan causal forests.
Kenapa Tidak Hanya Gunakan Model Interaksi Linier?
Alternatif buku teks adalah regresi jenuh:
di mana membawa interaksi. Ini mengasumsikan interaksi linier. Jarang terjadi: sensitivitas terhadap flip pendanaan adalah cembung dalam leverage, tidak linier; kedalaman berinteraksi secara multiplicative dengan kapitalisasi pasar; rezim volatilitas mengatur segala sesuatu. Causal forests tidak memaksakan hal ini — mereka mempartisi ruang kovariat secara adaptif dan membiarkan struktur heterogenitas muncul dari data.
Causal Forests: Algoritma

Causal forest adalah random forest yang dibangun kembali di sekitar estimand efek perawatan. Setiap pohon adalah pohon kausal yang mempartisi ruang kovariat untuk memaksimalkan heterogenitas efek perawatan.
Pohon Kausal
Di setiap simpul internal, algoritma memilih variabel split dan titik split . Perbedaan kunci dari pohon regresi: kriteria memaksimalkan varians efek perawatan yang diperkirakan di seluruh anak alih-alih meminimalkan kesalahan prediksi kuadrat.
Untuk simpul dengan data , estimasi efek tingkat simpul adalah perbedaan mean grup:
dan skor split adalah
dengan ukuran sampel di anak kiri, anak kanan, dan induk. Ini persis varians antar-grup dari efek perawatan: split bagus ketika dua anak tidak setuju tentang efeknya, bukan ketika mereka memprediksi hasil dengan baik. Kovariat yang memprediksi dengan kuat tapi ortogonal terhadap cara kerja tidak akan pernah dipilih.
Estimasi Jujur
Inovasi kritis adalah kejujuran. Data yang digunakan untuk menentukan struktur pohon harus terpisah dari data yang digunakan untuk memperkirakan efek daun:
- Bagi data menjadi dan
- Bangun pohon menggunakan hanya untuk memilih variabel dan titik split
- Perkirakan efek daun menggunakan hanya , dengan menjatuhkan observasi tersebut ke pohon yang sudah tetap
Tanpa ini, pohon bercurang: ia mengukir daun yang efek ekstremnya adalah noise di sampel yang sama yang digunakan untuk menemukannya, lalu melaporkan noise itu sebagai estimasi. Ini adalah kegagalan seleksi-adaptif yang sama yang probabilitas overfitting backtest ukur di tingkat strategi, kecuali di sini dipertahankan di dalam estimator alih-alih didiagnosis setelahnya. Kejujuran membelikan ketidakbiasan asimptotik:
Harganya adalah efisiensi sampel — separuh data Anda membangun struktur yang kemudian tidak dapat digunakan untuk mengisinya.
Dari Pohon ke Hutan
Causal forest mengagregasi pohon kausal, masing-masing pada sub-sampel acak ukuran dengan subset kovariat acak di setiap split:
Cara yang lebih berguna untuk menulis ini adalah sebagai rata-rata tertimbang dari hasil:
dengan bobot adaptif yang ditetapkan oleh seberapa sering observasi mendarat di daun yang sama dengan :
di mana adalah daun yang berisi di pohon . Ini adalah pandangan generalized-random-forest (Athey, Tibshirani dan Wager 2019): causal forest adalah estimator kernel lokal-adaptif. Ini mempelajari notion sendiri tentang "mirip", ditentukan oleh kovariat yang sebenarnya penting untuk heterogenitas efek, alih-alih oleh jarak Euclidean di ruang tempat Anda harus memilih scaling secara manual.
Teori Asimptotik
Di bawah kondisi keteraturan (Wager dan Athey 2018) estimator konsisten, , dan asimptotik normal:
memberikan interval titik . Varians berasal dari jackknife infinitesimal (atau bootstrap-of-little-bags), dihitung dari struktur sub-sampel yang sama yang hutan sudah bangun — tidak ada loop bootstrap luar.
Worth being precise about what this guarantee is and is not. Ini asimptotik dan titik, dan berlaku untuk CATE. Interval prediksi konformal yang digunakan di tempat lain di blog ini adalah finite-sample dan bebas-distribusi, tapi marjinal, dan mencakup hasil. Estimand berbeda, jaminan berbeda; mereka bukan pengganti.
Koneksi Double Machine Learning
Ketika perawatan tidak ditetapkan secara acak, causal forest dipasang pada data yang di-residualisasi: model hasil dan model propensi diperkirakan dengan cross-fitting, dan hutan berjalan pada melawan . Ortogonalitas Neyman adalah yang membuat ini aman: kesalahan estimasi nuisance masuk hanya sebagai produk, jadi dan dapat masing-masing konvergen pada dan masih konvergen pada .
Framework itu — residualisasi, cross-fitting, argumen ortogonalitas, implikasi ukuran sampel — adalah subjek artikelnya sendiri, Double Machine Learning untuk Sinyal Trading Kausal. Bacalah dulu; semua di bawah mengasumsikan itu dan hanya mencakup apa yang berubah ketika estimand adalah \tau$.
Aplikasi Trading: Heterogenitas Dampak Kejadian

Pengaturan
Domain alami untuk blog ini adalah alam semesta koin perpetual-futures, di mana kejadian sering, bertanda waktu, dan dapat diamati tanpa feed vendor.
- Unit: observasi koin-kejadian di seluruh alam semesta perp yang dapat diperdagangkan
- Perawatan: jika kejadian terjadi untuk koin — flip tanda tingkat pendanaan, listing spot, atau kaskade likuidasi yang melintasi ambang superkritis yang dijelaskan dalam kaskade likuidasi sebagai sinyal trading — dan untuk jendela non-kejadian yang cocok
- Hasil: = return abnormal selama jendela kejadian, bukan return mentah. Pasang model pasar pada jendela estimasi sebelum kejadian, lalu ambil return abnormal kumulatif. Spesifikasi tepatnya — jendela estimasi, regresi model pasar, konstruksi CAR dan statistik t-nya — dikerjakan di bagian studi-kejadian dari mining alpha LLM dari earnings call; gunakan lagi verbatim. Langkah ini tidak opsional: hasil close-to-close mentah membiarkan gerakan pasar-wide masuk ke , dan karena gerakan pasar umum untuk semua unit yang dirawat terlihat persis seperti efek perawatan
- Kovariat $\mathbf{X}_i`: kapitalisasi pasar, volatilitas terealisasi, riwayat pendanaan, kedalaman order book, rasio open-interest-to-cap
- Pengkonfusi $\mathbf{W}_i`: variabel rezim yang menggeser probabilitas kejadian dan return
Sinyal Trading
Permukaan CATE dipetakan ke position sizer persis seperti estimasi ketidakpastian yang dikalibrasi: ukur dengan relatif terhadap lebar interval, dan jangan trading ketika interval menyeberangi nol. Aturan keputusan ini — sizing lebar-terbalik, rasio edge , filter no-trade, varian sadar-biaya, dan argumen mengapa Anda tidak harus mengalikannya ke fraksi Kelly — diturunkan dalam Prediksi Konformal untuk Position Sizing Sadar-Risiko. Gunakan lagi dengan \hat{\mu}` dan interval causal forest sebagai pengganti konformal. Seimbangkan kaki panjang dan pendek dan buku netral-pasar menurut konstruksi.
Implementasi Python dengan 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
Menginterpretasikan Permukaan CATE
Plot efek marjinal menunjukkan bagaimana efek perawatan bergerak di sepanjang satu kovariat dengan sisanya ditahan di mediannya:
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
Baca ini sebagai deskripsi permukaan yang dipasang, bukan sebagai kurva dosis-respons kausal — menahan kovariat lain di mediannya dapat menempatkan Anda di wilayah ruang kovariat tanpa dukungan.
Asumsi Kunci dan Diagnostik

Langgar ini dan Anda mendapatkan efek yang percaya diri, presisi, tapi salah.
1. Unconfoundedness (Seleksi pada Observables)
Penetapan perawatan harus independen dari hasil potensial diberikan kovariat yang diamati. Untuk kejadian yang didefinisikan secara mekanis ini dapat dibela; untuk kejadian yang merupakan reaksi pasar itu sendiri — pengumuman listing, mesin likuidasi bursa sendiri menembak — tidak, karena aliran tak teramati yang sama yang memicu kejadian juga menggerakkan return.
Uji dengan analisis sensitivitas Rosenbaum: jika tak teramati dapat menggeser odds perawatan hingga faktor ,
seberapa besar harus sebelum efek yang diperkirakan berbalik tanda? Desain yang rusak pada bukan temuan.
2. Overlap (Positivitas)
Setiap unit perlu probabilitas positif muncul di kedua lengan. Periksa skor propensi dan trim:
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%}")
Trimming tidak gratis — mendefinisikan ulang populasi yang dijelaskan Anda. Laporkan fraksi mana yang bertahan.
3. SUTVA (Asumsi Nilai Perawatan Unit Stabil)
Perawatan satu unit tidak boleh mempengaruhi hasil unit lain. Dalam crypto ini terlemah dari tiga: kaskade likuidasi dalam satu perp menyebar melalui collateral bersama dan inventory market maker ke setiap pasang berkorelasi, yang adalah interferensi menurut definisi. Mengelompokkan kesalahan standar oleh grup korelasi secara parsial mengatasinya; tidak ada yang sepenuhnya.
Di Luar Perawatan Biner
Causal forests meluas ke perawatan kontinu melalui mesin DML yang sama — memperkirakan seberapa banyak besarnya guncangan, bukan hanya kejadiannya, memindahkan aset secara berbeda:
di mana adalah, katakanlah, ukuran perubahan tingkat pendanaan dalam basis point. Sekarang adalah efek per basis point.
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)
Pertimbangan Praktis
Apakah Heterogenitas Nyata?
Ini adalah pertanyaan yang dijawab oleh causal forests dan tidak ada yang lain di blog ini, dan pantas untuk tes sungguhan alih-alih aturan jempol. Kejujuran melindungi dari split palsu di dalam estimator; evaluasi out-of-sample atas kejadian yang ditahan (bukan aset yang ditahan) adalah standar dan dibahas dalam optimasi walk-forward dan Sharpe deflated dan multiple testing. Tidak ada yang memberi tahu Anda apakah \mathbf{x}$ sama sekali.
Tes Prediktor Linier Terbaik melakukan itu. Regresikan hasil yang di-residualisasi pada perawatan yang di-residualisasi dan interaksinya dengan estimasi CATE yang di-demean:
Dua koefisien menjawab dua pertanyaan berbeda. adalah efek rata-rata: apakah ada sesuatu di sini sama sekali? adalah kemiringan kalibrasi pada prediksi Anda sendiri: ketika hutan Anda mengatakan efeknya lebih besar, apakah itu benar-benar lebih besar? Di bawah nol dari tanpa heterogenitas . Di bawah kalibrasi sempurna . secara signifikan di atas nol tapi jauh di bawah satu berarti hutan menemukan urutan nyata tapi melebih-lebihkan penyebarannya — Anda dapat trading peringkatannya, bukan magnitudonya.
RScorer EconML memberikan skor pemilihan-model pendamping:
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}")
Pasang scorer pada split validasi yang hutan tidak pernah lihat, lalu gunakan untuk membandingkan model CATE kandidat satu sama lain dan melawan baseline efek-konstan. Hutan yang tidak bisa mengalahkan model efek-konstan pada R-score tidak menemukan heterogenitas yang worth trading, apa pun yang dikatakan kepentingan in-samplenya.
Ukuran Sampel
Causal forests butuh data lebih banyak daripada model hasil, karena estimand adalah perbedaan dan kedua lengan harus dihuni di setiap daun. Disiplin data-vs-parameter umum — berapa banyak poin out-of-sample per parameter bebas, dan koreksi Bonferroni setelah Anda membandingkan konfigurasi — ada di bagian persyaratan data dari optimasi walk-forward. Jawaban khususal causal forest empiris, bukan aturan jempol: pasang hutan pada sub-sampel bersarang dan plot lebar interval median terhadap ; ukuran sampel yang dapat digunakan adalah tempat lebar jatuh di bawah ukuran efek yang berniat Anda trading.
Walk-Forward, Dengan Dua Rincian
Protokol evaluasi adalah walk-forward terjangkar biasa — refit pada semua kejadian hingga , trade kejadian — dan perawatan lengkap, termasuk purging, embargo, rasio efisiensi walk-forward dan tingkat degradasi, ada di optimasi walk-forward. Dua hal spesifik untuk estimator ini.
Pertama, jendela kejadian tumpang tindih. Jika jendela kovariat sebelum kejadian berisi jendela hasil kejadian , fold berbagi observasi dan hasil out-of-sample terkontaminasi. Buang jendela yang tumpang tindih sebelum menghitung satu angka PnL; dengan perawatan sering mekanis seperti flip pendanaan ini dapat menghapus porsi besar kejadian.
Kedua, split jujur harus digambar ulang di setiap refit. Membawa partisi / yang sama melintasi fold reintroduksi kebocoran seleksi-struktur persis yang kejujuran ada untuk mencegah, karena kejadian yang baru ditambahkan mendarat di partisi yang dipilih dengan pengetahuan yang lama.
Lalu jalankan PnL out-of-sample tingkat kejadian melalui gerbang biasa — PBO dan rasio Sharpe deflated — sebelum percaya apa pun.
Biaya
Sinyal CATE dihargai seperti sinyal driven-kejadian lainnya: kurangi setengah spread yang diharapkan dari $|\hat{\tau}|` sebelum filter no-trade, dan sizing turun di buku tipis. Versi kuantitatif — hukum dampak akar-kuadrat dan kurva biaya yang dipasang dalam model biaya slippage, filter no-trade sadar-biaya dalam prediksi konformal, dan akuntansi eksekusi dalam implementation shortfall dan TCA — semua mentransfer tanpa perubahan.
Satu hal yang tidak mentransfer: shelf-life sinyal CATE dibatasi oleh jendela kejadian, jadi biaya diamortisasi atas periode holding pendek tetap alih-alih periode terbuka. Sinyal yang terus ditahan membayar spread sekali dan menghasilkan selama edge bertahan; ini membayarnya setiap kejadian. Apakah edge bertahan itu adalah pertanyaan empiris tentang kejadian dan alam semesta spesifik Anda, dan itu hal pertama untuk diperiksa, karena bisa membunuh strategi sebelum mesin kausal penting.
Kesimpulan
Causal forests memperkirakan objek yang berbeda dari sisanya toolkit blog ini. Bukan "apa yang akan return aset ini", tapi "seberapa banyak kejadian ini menggerakkan aset ini, relatif terhadap kontrafaktual di mana itu tidak menembak". Mesin yang membuatnya estimable — split yang memaksimalkan heterogenitas, estimasi jujur, representasi bobot kernel adaptif dan interval jackknife-infinitesimal — tidak ada analog dalam pembelajaran terbim bias biasa, dan asumsi yang dibutuhkan (unconfoundedness, overlap, SUTVA) cukup kuat bahwa harus diuji alih-alih ditegaskan.
Yang tidak dimiliki artikel ini adalah hasil. Setiap angka di atas adalah placeholder. Melawan standar yang ditetapkan oleh negatif jujur dan Sharpe deflated, metode tanpa distribusi CATE yang diukur, BLP dengan nilai p, diagnostik overlap, dan PnL out-of-sample yang digate oleh DSR/PBO adalah tutorial, bukan temuan. Angka-angka itu adalah pekerjaan berikutnya; hasil negatif worth dipublikasikan.
Referensi
- Athey, S., Imbens, G.W. "Recursive Partitioning for Heterogeneous Causal Effects." PNAS, 113(27), 7353-7360 (2016).
- Wager, S., Athey, S. "Estimation and Inference of Heterogeneous Treatment Effects using Random Forests." JASA, 113(523), 1228-1242 (2018). arXiv:1510.04342
- Athey, S., Tibshirani, J., Wager, S. "Generalized Random Forests." Annals of Statistics, 47(2), 1148-1178 (2019).
- Chernozhukov, V., et al. "Double/Debiased Machine Learning for Treatment and Structural Parameters." The Econometrics Journal, 21(1), C1-C68 (2018).
- Chernozhukov, V., Demirer, M., Duflo, E., Fernandez-Val, I. "Generic Machine Learning Inference on Heterogeneous Treatment Effects in Randomized Experiments." (2018). arXiv:1712.04802
- Battocchi, K., et al. "EconML: A Python Package for ML-Based Heterogeneous Treatment Effects Estimation." Microsoft Research (2019). GitHub
Penulis
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.