Double Machine Learning: Mengestimasi Parameter Kausal Alih-alih Memprediksi Return
Setiap artikel pemodelan di blog ini hingga saat ini mengajukan bentuk pertanyaan yang sama: diberikan fitur, prediksi sebuah angka, lalu validasi bahwa prediksi bertahan di luar sampel. Model spread memprediksi spread. Model fill memprediksi probabilitas fill. Seluruh aparatus validasi — purged walk-forward, Sharpe deflated, taksonomi look-ahead — ada untuk memeriksa apakah sebuah prediksi nyata.
Artikel ini mengajukan bentuk pertanyaan yang berbeda, dan ini adalah satu-satunya bagian mesin yang belum pernah dimiliki blog ini: mengestimasi satu parameter skalar yang memiliki interpretasi kausal, dan melampirkan standar error yang bertahan dari fakta bahwa model ML yang fleksibel digunakan untuk sampai di sana.
Itu bukan perbedaan retoris. "Posisi antrian memprediksi probabilitas fill" secara trivial benar dan secara operasional tidak berguna — tentu saja demikian, keduanya digerakkan oleh kedalaman dan volatilitas. "Bergerak satu posisi ke depan dalam antrian menyebabkan perubahan dalam probabilitas fill, dengan kondisi pasar tetap" adalah sebuah angka yang bisa Anda masukkan ke dalam kebijakan penempatan order. Yang pertama adalah fitting regresi. Yang kedua memerlukan estimator yang tidak ada dalam toolkit ML standar, karena regularisasi dan overfitting dalam tahap pertama yang fleksibel bias persis koefisien yang Anda pedulikan.
Double Machine Learning (Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins, 2018) adalah estimator yang memperbaiki ini. Setiap trader kuantitatif pernah mendengar ini: korelasi bukan kausalitas. DML adalah bagian yang datang setelah kalimat itu.
Mengapa Regresi Naif Gagal

Tetapkan pertanyaan di wilayah blog sendiri. Kami ingin efek kausal dari posisi antrian pada probabilitas fill:
- : apakah limit order yang sedang beristirahat pada observasi terisi dalam horizon.
- : posisi antrian saat penempatan (dinormalisasi oleh ukuran level).
- : confounder — volatilitas terealisasi, spread yang dikutip, ketidakseimbangan kedalaman, ukuran level, waktu hari, label rezim. Ini adalah variabel kondisi pasar yang sudah dihitung blog dalam pemodelan spread dengan machine learning.
Parameter kausal adalah dalam
di mana menangkap hubungan (mungkin kompleks, nonlinier) antara kondisi pasar dan hasil fill.
Perlakuan tidak ditugaskan secara acak. Anda berada di depan antrian karena levelnya tipis, atau karena Anda memposting selama periode tenang, atau karena buku tidak seimbang demi keuntungan Anda. Kondisi yang sama secara independent mengerakan apakah Anda terisi. Itu adalah confounding.
Pendekatan 1: Abaikan confounder. Regresi pada saja. Estimasi menyerap efek dari setiap confounder yang berkorelasi dengan keduanya. Bias variabel yang dihilangkan dari textbook: level tipis memberi Anda slot antrian yang baik dan tingkat fill yang tinggi, jadi Anda melebih-lebihkan nilai slot itu sendiri.
Pendekatan 2: Regresi linier dengan kontrol. Regresi pada dan . Ini hanya bekerja jika benar-benar linier. Dinamika buku tidak — hubungan fill/volatilitas memiliki ambang, efek ketidakseimbangan kedalaman berubah tanda menurut rezim. Menentukan dengan salah memasukkan kembali bias.
Pendekatan 3: Prediksi ML. Pasang model gradient boosted pada . Anda mendapatkan diskriminasi yang baik di luar sampel, dan tanpa interpretasi kausal sama sekali. Model menangkap setiap pola prediktif, kausal atau tidak; regularisasi menyusutkan kontribusi perlakuan dengan cara-cara yang membias ; dan tidak ada standar error yang bisa Anda percayai.
Ini adalah ketegangan inti. ML baik dalam prediksi, tetapi aplikasi naif pada parameter kausal menghasilkan estimasi yang bias, tidak normal, tidak dapat diandalkan.
Model Partially Linear

DML bekerja dalam kerangka struktural. Penarik beban adalah regresi partially linear (PLR):
- adalah parameter kausal yang diminati.
- adalah fungsi gangguan — bagian dari hasil yang dijelaskan oleh kondisi pasar.
- adalah fungsi gangguan lain — ekspektasi kondisional perlakuan diberikan kondisi pasar ("propensity" dalam pengaturan perlakuan kontinu).
- dan adalah residual struktural.
Wawasan kunci: berdimensi rendah, tetapi dan bisa sangat kompleks. Kami ingin ML menangani fungsi gangguan sambil tetap memberikan inferensi yang valid pada skalar.
Mengapa "Ganda"?
Dua model ML, bukan satu:
- Model hasil: — prediksi hasil dari kondisi pasar saja.
- Model perlakuan: — prediksi perlakuan dari kondisi pasar saja.
Bentuk residual
dan estimasi dengan meregresi pada :
Ini adalah Frisch-Waugh-Lovell dengan steroid: partial-out confounder dengan ML bukan proyeksi linier, lalu baca efek perlakuan dari variasi residual.
Ortogonalitas Neyman: Mengapa Ini Berfungsi
Pendekatan partial-out naif (estimasi , kurangi, regresi) gagal karena error estimasi ML dalam masuk langsung ke . Skor DML dibuat menjadi Neyman ortogonal — tidak sensitif terhadap gangguan kecil dalam fungsi gangguan.
Skor ortogonal untuk PLR:
di mana . Kondisi ortogonalitas adalah
Secara intuitif, skor hanya menggunakan variasi dalam dan yang independen dari , dan error dalam satu fungsi gangguan dikompensasi oleh yang lain. Jika sedikit over-prediksi perlakuan, sedikit terlalu kecil, tetapi error yang sesuai dalam dari salah estimasi mendorong ke arah kompensasi. Bias menjadi urutan kedua — produk dari dua error tahap pertama — bukan urutan pertama.
Secara formal, jika kedua estimator gangguan konvergen pada laju (ringan; metode ML yang wajar yang paling memenuhi), maka
jadi konvergen pada laju parametrik dan asymptotically normal.
Cross-Fitting: Mengapa Wajib di Sini
Ortogonalitas sendiri tidak cukup. Jika model gangguan dipasang pada baris yang sama digunakan untuk estimasi , overfitting tahap pertama mencemari tahap kedua — dan kerusakan spesifik ini sepadan untuk dinyatakan secara presisi, karena ini bukan kerusakan yang biasa Anda lihat. Di tempat lain, overfitting muncul sebagai skor validasi yang menggelembung: Anda menyadarinya, Anda mendiskonnya, Anda melanjutkan. Di sini muncul sebagai estimasi titik yang bergeser untuk , dengan interval kepercayaan yang masih sempit dan masih berpusat pada angka yang salah. Tidak ada skor untuk dicurigai. Estimator hanya berbohong dengan tenang.
Cross-fitting memutus ketergantungan: prediksi gangguan setiap observasi berasal dari model yang dilatih tanpanya, dan diestimasi dari residual yang diheld-out. Mekanik adalah mesin K-fold biasa, dibahas dalam pemodelan spread dengan machine learning; yang penting di bawah adalah folds apa yang Anda berikan.
Algoritma DML Langkah demi Langkah
Input: data , metode ML dan , folds .
Langkah 1 — Partisi: bagi menjadi folds disjoint.
Langkah 2 — Cross-fit model gangguan: untuk , latih dan pada komplemen fold , lalu hitung dan untuk .
Langkah 3 — Estimasi:
Langkah 4 — Inferensi:
dengan interval .
Interval kepercayaan valid untuk tepat satu pertanyaan
Ini adalah peringatan yang menentukan apakah hasil DML bernilai, dan di mana sebagian besar penggunaan metode secara terapan diam-diam runtuh.
Normalitas asymptotik di atas adalah pernyataan tentang satu perlakuan yang telah ditentukan sebelumnya, satu set confounder yang telah ditentukan sebelumnya, satu skor yang telah ditentukan sebelumnya. Tetapkan itu sebelumnya, jalankan estimator sekali, dan interval berarti apa yang dikatakannya. Coba tiga perlakuan kandidat, atau empat set confounder, atau tukar learner sampai p-value terlihat lebih baik, dan Anda tidak lagi melakukan inferensi — Anda menjalankan pencarian, dan p-value yang dilaporkan adalah p-value dari maksimum, bukan dari draw.
Blog sudah mengukur apa yang dilakukannya. Dalam studi rasio Sharpe deflated, pencarian atas noise murni dengan keunggulan nyata nol menghasilkan tingkat penemuan palsu naif 1,000 — tes yang tidak disesuaikan dipicu setiap saat — sementara p-value naif median dari pemenang duduk di dekat 0,0007. Tidak ada tentang ortogonalitas Neyman yang melindungi Anda dari ini. Ortogonalitas memperbaiki bias dari estimasi gangguan; tidak mengatakan apa-apa tentang bias dari pencarian spesifikasi. p-value DML 1e-05 yang diperoleh setelah mencoba enam spesifikasi layak mendapatkan perawatan Bonferroni/Holm/BHY yang sama seperti pemenang lain yang ditarik dari grid, dengan diatur ke jumlah spesifikasi yang sebenarnya Anda jalankan.
Ini memiliki konsekuensi praktis langsung untuk fitur kenyamanan alat. DoubleMLData menerima daftar di d_cols dan dengan senang akan mengembalikan tiga efek perlakuan dalam satu tabel ringkasan:
dml_data_multi = dml.DoubleMLData(
df, y_col='filled', d_cols=['queue_pos', 'toxicity', 'spread_at_post'],
x_cols=confounder_cols,
)
Tiga baris, tiga p-values, dan masalah pengujian ganda yang tidak disebutkan tabel ringkasan. Jika Anda membaca ketiganya, sesuaikan ketiganya. Jika hanya satu yang pertanyaan yang telah terdaftar, katakan demikian, dan perlakukan dua lainnya secara eksplisit sebagai eksploratori.
Cross-Fitting pada Time Series: Purge, Embargo, Custom Folds

DML standar mengasumsikan observasi i.i.d. Data buku tidak, dan mode kegagalan adalah yang sudah didokumentasikan blog secara rinci: baris yang berdekatan berbagi jendela forward yang tumpang tindih, jadi TimeSeriesSplit biasa masih bocor jawaban di seluruh batas fold. Lihat pemodelan spread dengan machine learning untuk implementasi walk-forward yang dipurges dan diembargo dan alasan mengapa jarak setidaknya horizon baris diperlukan, dan taksonomi bias look-ahead untuk katalog lengkap kebocoran dan magnitudo terukurnya.
Bagian yang benar-benar DML-spesifik adalah bagaimana Anda menyerahkan folds yang dipurges ke estimator, karena set_sample_splitting memiliki kontrak yang membuat orang tersandung:
import numpy as np
import doubleml as dml
def purged_folds(n: int, n_splits: int, horizon: int):
"""Fold jendela yang meluas dengan jarak purge/embargo `horizon` baris.
Konstruksi yang sama dengan CV walk-forward yang dipurges di artikel
pemodelan spread: jarak menghapus tumpang tindih antara jendela forward
dari baris pelatihan dan baris validasi.
"""
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()
Dua hal yang perlu diwaspadai, tidak ada yang jelas dari docs pustaka:
- Fold walk-forward yang dipurges tidak mencakup setiap baris. Jarak purge dan blok pelatihan awal tidak pernah menjadi fold tes siapa pun, jadi diestimasi dari kurang dari residual secara ketat. Itu perilaku yang benar, bukan bug, tetapi berarti bahwa efektif dalam rumus varians adalah jumlah baris tes yang digabungkan — periksa daripada berasumsi.
- Pengulangan
n_reptidak gratis di sini. Dengan K-fold acak, mengulang cross-fitting dan rata-rata adalah reduksi varians murah. Dengan split deterministik yang diurutkan waktu hanya ada satu splitting, jadin_reptidak membeli apa-apa dan tidak menyembunyikan apa-apa; stabilitas harus berasal dari menjalankan kembali pada jendela data yang berbeda.
Untuk struktur panel (banyak simbol dalam periode yang sama), DoubleML mendukung error standar yang kuat kluster — kluster pada simbol, bukan pada waktu, dan lihat validasi multi-simbol untuk posisi blog tentang kapan hasil cross-instrument benar-benar ditetapkan.
Kasus Terukur: Posisi Antrian dan Probabilitas Fill

Ini adalah satu-satunya pertanyaan kausal dalam artikel di mana proyek sudah memiliki data, dan harus dijalankan bukan diajukan. Analisis posisi antrian sudah membahas estimasi posisi, mekanika FIFO, laju drain dan waktu-ke-fill pada data buku nyata; simulasi fill membahas pemodelan probabilitas fill dan loop kalibrasi terhadap fill langsung. Keduanya menghasilkan model prediktif dari fill. DML mengubah input yang sama menjadi estimasi kausal.
Spesifikasi, terdaftar sebelumnya sebelum melihat estimasi:
- Hasil : terisi dalam
HORIZONsnapshots (biner). - Perlakuan : posisi antrian yang dinormalisasi saat penempatan.
- Confounder : volatilitas terealisasi 1s, spread yang dikutip dalam bps, ketidakseimbangan kedalaman, ukuran level saat posting, jarak dari mid dalam tick, encoding waktu hari, label rezim.
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)
Hasil untuk dilaporkan adalah perbandingan empat kolom, bukan satu koefisien: estimasi naif OLS dari pada saja, estimasi kontrol linier dari pada dan , estimasi DML dengan standar error-nya, dan nilai robustness dari analisis sensitivitas — seberapa kuat confounder yang tidak diamati harus untuk meniadakan efek. Kesenjangan antara kolom naif dan DML adalah kuantitas nyata yang diminati: itu berapa banyak dari nilai nyata posisi antrian adalah kondisi pasar yang memakai kostum.
nol atau negatif di sini adalah hasil yang dapat dipublikasikan dan lebih sesuai dengan blog ini daripada yang positif yang bersih. Jika efek kausal posisi antrian runtuh setelah volatilitas dan ukuran level dipartial-out, itu adalah temuan langsung tentang kebijakan penempatan order: slot bukan yang menghasilkan fill, kondisi di mana Anda mendapatkan slot adalah.
Analisis Faktor Kausal
Pendekatan standar untuk investasi faktor adalah asosiatif: urutkan dengan karakteristik, bentuk portofolio long-short, amati bahwa return berbeda. DML memungkinkan tes yang berbeda — estimasi efek kausal langsung dari karakteristik pada return, menghapus efek confounding dari karakteristik lain. Jika efek menghilang di bawah DML, faktor tidak independen kausal; itu adalah proksi.
Ini adalah bentuk kedua, skeptisisme faktor yang independen, dan sepadan untuk eksplisit tentang bagaimana ini berkaitan dengan yang sudah dipublikasikan blog. Rasio Sharpe deflated menyerang kebun binatang faktor dari sisi seleksi: dengan cukup percobaan, faktor bisa tampak signifikan murni karena Anda melihat berkali-kali. DML menyerang dari sisi confounding: faktor bisa tampak signifikan pada satu tes jujur dan masih menjadi proksi untuk sesuatu yang lain dalam set kondisi. Faktor harus bertahan keduanya untuk menarik, dan dua mode kegagalan independen — lulus satu tidak memberi tahu apa-apa tentang yang lain.
Apa yang DML Tidak Dapat Lakukan
-
Ini mengharuskan confounder untuk diamati. Jika variabel yang tidak diamati menggerakkan perlakuan dan hasil, DML bias, dan tidak ada kecanggihan ML yang memperbaiki masalah identifikasi. Analisis sensitivitas membatasi risiko; tidak menghapusnya.
-
Ini mengestimasi efek rata-rata. Jika efek posisi antrian bervariasi tajam melintasi rezim, estimasi titik adalah rata-rata atas campuran rezim sampel Anda. Untuk heterogenitas gunakan Interactive Regression Model (
DoubleMLIRM) atau hutan kausal. -
Ini mengasumsikan model struktural. Spesifikasi partially linear mengharuskan perlakuan masuk ke persamaan hasil dengan cara tertentu. Jika proses sebenarnya berbeda secara mendasar, DML salah dengan percaya diri.
-
Ini tidak menemukan struktur kausal. DML mengestimasi efek dari perlakuan yang telah ditentukan sebelumnya. Ini tidak memberi tahu Anda variabel mana yang menjadi penyebab.
-
Ini tidak membebaskan Anda dari pengujian ganda. Mengulang poin di atas karena ini yang paling sering dilewati: ortogonalitas de-bias estimasi gangguan, bukan pencarian spesifikasi.
Catatan Praktis
Ukuran sampel. DML membutuhkan model gangguan untuk konvergen pada , yang dalam praktiknya berarti cukup baris bagi model ML untuk mengaproksimasi dan sama sekali. Daripada memercayai ambang angka bulat, buktikan kecukupan secara empiris dengan cara validasi multi-simbol melakukannya — periksa apakah estimasi bertahan melintasi instrumen dan sub-periode, dan perlakukan ketidakstabilan sebagai sinyal itu.
Pemilihan learner. Fakta spesifik DML sempit tetapi berguna: diberikan konvergensi , learner mempengaruhi efisiensi dari (lebar interval), bukan konsistensinya. Learner mana yang layak dicapai pada data pasar tabular, dan mengapa gradient boosting adalah default, sudah dibahas dalam pemodelan spread dengan machine learning. Jika bergerak secara material melintasi learner, itu bukan menu untuk dipilih — adalah bukti bahwa fungsi gangguan diperkirakan dengan buruk, dan per bagian di atas, memilih yang paling ramah mengubah latihan menjadi pencarian.
Kesimpulan
DML memberi blog sesuatu yang belum dimilikinya: cara menyatakan klaim mikrosruktur pasar sebagai parameter kausal dengan standar error yang dapat dipertahankan, alih-alih sebagai prediksi dengan skor validasi yang baik.
Tiga ide yang membawa beban adalah:
- Ortogonalkan skor sehingga error tahap pertama membatalkan ke urutan kedua.
- Cross-fit, dengan folds yang dipurges dan diembargo pada data time series, sehingga overfitting tahap pertama tidak dapat menggeser .
- Tentukan sebelumnya, sehingga interval yang Anda laporkan adalah interval yang sebenarnya Anda peroleh.
Estimator adalah bagian mudah. Bagian sulit tetap tidak berubah: menentukan confounder mana yang penting, memberi argumen bahwa asumsi identifikasi bertahan, dan menahan dorongan untuk menjalankan spesifikasi sekali lagi.
Referensi
Keturunan DML pendek dan layak satu baris: adalah model partially linear Robinson (1988) dengan ML menggantikan estimator kernel, mencapai bound efisiensi semiparametrik, dengan kondisi ortogonalitas yang melacak kembali ke tes C() Neyman dan sepupu dekat dalam sastra pembelajaran yang ditargetkan (TMLE). Kontribusi Chernozhukov et al. adalah menunjukkan bahwa ini dapat dioperasionalkan dengan learner ML sembarang saat mempertahankan inferensi -konsisten, asymptotically normal.
- 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.
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.