Double Machine Learning: การประมาณค่าพารามิเตอร์เชิงสาเหตุแทนการทำนายผลตอบแทน
บทความการสร้างโมเดลทุกบทความในบล็อกนี้จนถึงตอนนี้นำเสนอคำถามในรูปแบบเดียวกัน: กำหนดคุณลักษณะ ทำนายตัวเลข จากนั้นตรวจสอบว่าการทำนายนั้นอยู่รอดนอกตัวอย่าง โมเดล spread ทำนาย spread โมเดล fill ทำนายความน่าจะเป็นของการ fill กระบวนการตรวจสอบความถูกต้องทั้งหมด — purged walk-forward, deflated Sharpe, look-ahead taxonomy — มีอยู่เพื่อตรวจสอบว่า การทำนาย เป็นจริงหรือไม่
บทความนี้นำเสนอคำถามในรูปแบบที่แตกต่าง และเป็นชิ้นส่วนเครื่องมือเดียวที่บล็อกไม่เคยมีมาก่อน: ประมาณค่าพารามิเตอร์สเกลาร์เดียวที่มีการตีความเชิงสาเหตุ และแนบค่ามาตรฐานข้อผิดพลาดที่อยู่รอดต่อการใช้โมเดล ML ที่ยืดหยุ่นในการไปสู่จุดนั้น
นั่นไม่ใช่ความแตกต่างทางวาจา "ตำแหน่งคิวทำนายความน่าจะเป็นของ fill" เป็นความจริงเล็กน้อยและไร้ประโยชน์ในการดำเนินงาน — แน่นอนว่ามันเป็นเช่นนั้น เพราะทั้งคู่ขับเคลื่อนโดยความลึกและความผันผวน "การเลื่อนไปข้างหน้าหนึ่งตำแหน่งในคิว ทำให้เกิด การเปลี่ยนแปลงของ ในความน่าจะเป็นของ fill โดยกำหนดให้สภาพของตลาดคงที่" เป็นตัวเลขที่คุณสามารถใส่ในนโยบายการวางคำสั่งซื้อขาย อันแรกเป็นการปรับค่าการถดถอย อันที่สองต้องการตัวประมาณที่ไม่มีอยู่ในกล่องเครื่องมือ ML มาตรฐาน เพราะ regularization และ overfitting ในขั้นตอนแรกที่ยืดหยุ่นจะทำให้เกิดความเอนเอียงกับสัมประสิทธิ์ที่คุณใส่ใจพอดี
Double Machine Learning (Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins, 2018) เป็นตัวประมาณที่แก้ไขปัญหานี้ เทรเดอร์ควอนต์ทุกคนได้ยินมา: สหสัมพันธ์ไม่ใช่เชิงสาเหตุ DML คือส่วนที่มาหลังประโยคนั้น
เหตุใดการถดถอยแบบง่ายล้มเหลว

ตั้งคำถามในดินแดนของบล็อกเอง เราต้องการผลกระทบเชิงสาเหตุของตำแหน่งคิวต่อความน่าจะเป็นของ fill:
- : คำสั่งซื้อขายแบบจำกัดที่พักอยู่ที่การสังเกต ถูก fill ภายในขอบเขต
- : ตำแหน่งคิวที่การวาง (ทำให้เป็นปกติโดยขนาดระดับ)
- : ตัวแปรสับสน — ความผันผวนที่เกิดขึ้นจริง, spread ที่ระบุ, ความไม่สมดุลของความลึก, ขนาดระดับ, เวลาของวัน, ป้ายกำกับระบบ นี่คือตัวแปรสภาพตลาดที่บล็อกคำนวณอยู่แล้วใน spread modeling with machine learning
พารามิเตอร์เชิงสาเหตุคือ ใน
โดยที่ จับความสัมพันธ์ (ที่อาจซับซ้อน, ไม่เป็นเชิงเส้น) ระหว่างสภาพตลาดและผลลัพธ์ของ fill
การรักษาไม่ได้ถูกสุ่มมอบหมาย คุณอยู่ใกล้ด้านหน้าของคิว เพราะ ระดับบางๆ หรือเพราะคุณโพสต์ในช่วงที่สงบ หรือเพราะสมุดฯ ไม่สมดุลในทางที่ดีสำหรับคุณ เงื่อนไขเดียวกันขับเคลื่อนอย่างเป็นอิสระว่าคุณถูก fill หรือไม่ นั่นคือความสับสน
แนวทางที่ 1: ละเลยตัวแปรสับสน ถดถอย กับ เพียงอย่างเดียว การประมาณจะดูดซับผลกระทบของตัวแปรสับสนทุกตัวที่มีสหสัมพันธ์กับทั้งสอง อคติของตัวแปรที่ถูกละเลยในตำรา: ระดับบางๆ ให้ทั้งช่องคิวที่ดีและอัตรา fill สูง ดังนั้นคุณประเมินค่าช่องมากเกินไป
แนวทางที่ 2: การถดถอยเชิงเส้นพร้อมตัวควบคุม ถดถอย กับ และ วิธีนี้ใช้ได้ก็ต่อเมื่อ เป็นเชิงเส้นจริงๆ พลวัตของสมุดฯไม่ใช่เช่นนั้น — ความสัมพันธ์ fill/volatility มีเกณฑ์, ผลกระทบของความไม่สมดุลของความลึกเปลี่ยนเครื่องหมายตามระบบ การระบุ ผิดจะนำอคติกลับมา
แนวทางที่ 3: การทำนาย ML ปรับโมเดล gradient boosted บน คุณได้รับการแยกแยะ out-of-sample ที่ดี และไม่มีการตีความเชิงสาเหตุอย่างสิ้นเชิง โมเดลจับรูปแบบการทำนายทุกรูปแบบ เชิงสาเหตุหรือไม่ก็ตาม; regularization ย่อส่วนส่วนสนับสนุนของการรักษาในแบบที่ทำให้ เอนเอียง; และไม่มีค่ามาตรฐานข้อผิดพลาดที่คุณวางใจได้
นี่คือความตึงเครียดหลัก ML ดีในการทำนาย แต่การใช้งานแบบง่ายต่อพารามิเตอร์เชิงสาเหตุผลิตการประมาณที่เอนเอียง ไม่ปกติ และไม่น่าเชื่อถือ
โมเดลเส้นตรงบางส่วน

DML ทำงานภายใต้กรอบโครงสร้าง เครื่องมือหลักคือ การถดถอยเส้นตรงบางส่วน (PLR):
- คือพารามิเตอร์เชิงสาเหตุที่น่าสนใจ
- คือฟังก์ชัน nuisance — ส่วนของผลลัพธ์ที่อธิบายโดยสภาพตลาด
- คือฟังก์ชัน nuisance อีกอัน — ค่าคาดหวังเงื่อนไขของการรักษาที่ให้สภาพตลาด ("propensity" ในการตั้งค่าการรักษาต่อเนื่อง)
- และ คือตกค้างโครงสร้าง
ข้อเข้าใจสำคัญ: เป็นมิติต่ำ แต่ และ สามารถซับซ้อนโดยพลการ เราต้องการให้ ML จัดการฟังก์ชัน nuisance ในขณะที่ยังคงให้การอนุมานที่ถูกต้องบนสเกลาร์
เหตุใด "คู่"?
สองโมเดล ML ไม่ใช่หนึ่ง:
- โมเดลผลลัพธ์: — ทำนายผลลัพธ์จากสภาพตลาดอย่างเดียว
- โมเดลการรักษา: — ทำนายการรักษาจากสภาพตลาดอย่างเดียว
สร้างตกค้าง
และประมาณ โดยถดถอย บน :
นี่คือ Frisch-Waugh-Lovell บนสเตอรอยด์: partial out ตัวแปรสับสนด้วย ML แทนการฉายภาพเชิงเส้น จากนั้นอ่านผลกระทบการรักษาจากความแปรผันของตกค้าง
ออร์โธโกนาลิตีของ Neyman: เหตุใดมันใช้ได้
แนวทาง partial-out แบบง่าย (ประมาณ , ลบ, ถดถอย) ล้มเหลวเพราะข้อผิดพลาดในการประมาณ ML ใน แพร่กระจายตรงไปยัง คะแนน DML ถูกสร้างขึ้นเพื่อเป็น Neyman orthogonal — ไม่ไวต่อการรบกวนเล็กน้อยในฟังก์ชัน nuisance
คะแนนออร์โธโกนอลสำหรับ PLR:
โดยที่ เงื่อนไขออร์โธโกนาลิตีคือ
เชิงอรรถ คะแนนใช้เฉพาะความแปรผันใน และ ที่เป็นอิสระจาก และข้อผิดพลาดในฟังก์ชัน nuisance หนึ่งจะถูกชดเชยโดยอีกอัน หาก ทำนายการรักษามากเกินไปเล็กน้อย จะเล็กเกินไปเล็กน้อย แต่ข้อผิดพลาดที่สอดคล้องกันใน จากการประมาณ ผิดจะผลักในทิศทางชดเชย อคติจะกลายเป็น ลำดับที่สอง — ผลคูณของข้อผิดพลาดสองขั้นตอนแรก — แทนที่จะเป็นลำดับแรก
อย่างเป็นทางการ หากตัวประมาณ nuisance ทั้งสองบรรจบกันที่อัตรา (ไม่รุนแรง; วิธี ML ที่สมเหตุสมผลส่วนใหญ่ผ่าน) แล้ว
ดังนั้น บรรจบกันที่อัตราพารามิเตอร์และเป็นปกติแบบไม่มีที่สิ้นสุด
Cross-Fitting: เหตุใดจำเป็นที่นี่
ออร์โธโกนาลิตีอย่างเดียวไม่เพียงพอ หากโมเดล nuisance ถูกปรับบนแถวเดียวกันที่ใช้ประมาณ overfitting ขั้นตอนแรกจะปนเปื้อนขั้นตอนที่สอง — และอันตรายเฉพาะนั้นมีค่ากล่าวอย่างแม่นยำ เพราะมันไม่ใช่อันตรายที่คุณคุ้ยกาล ที่อื่น overfitting ปรากฏเป็นคะแนนการตรวจสอบที่พองตัว: คุณสังเกตมัน, คุณหักคะแนนมัน, คุณดำเนินต่อ ที่นี่ปรากฏเป็น การประมาณจุดที่เลื่อนสำหรับ พร้อมช่วงความมั่นใจที่ยังแคบและยังจัดกึ่งกลางกับตัวเลขที่ผิด ไม่มีคะแนนให้ต้องสงสัย ตัวประมาณเพียงแค่โกหกเงียบๆ
Cross-fitting ตัดความเชื่อมโยง: การทำนาย nuisance ของแต่ละการสังเกตมาจากโมเดลที่ฝึกโดยไม่มีมัน และ ถูกประมาณจากตกค้างที่รวมกันแบบ held-out กลไกคือเครื่องจักร K-fold ธรรมดา ครอบคลุมใน spread modeling with machine learning; สิ่งที่สำคัญด้านล่างคือ folds ที่คุณส่งให้มัน
อัลกอริทึม DML ทีละขั้นตอน
อินพุต: ข้อมูล , วิธี ML และ , folds
ขั้นตอนที่ 1 — แบ่งส่วน: แบ่ง เป็น folds ที่ไม่ซ้อนทับกัน
ขั้นตอนที่ 2 — Cross-fit โมเดล nuisance: สำหรับ , ฝึก และ บนส่วนประกอบของ fold , จากนั้นคำนวณ และ สำหรับ
ขั้นตอนที่ 3 — การประมาณ:
ขั้นตอนที่ 4 — การอนุมาน:
พร้อมช่วง
ช่วงความมั่นใจถูกต้องสำหรับคำถามที่แน่นอนหนึ่งคำถาม
นี่คือข้อจำกัดที่ตัดสินว่าผลลัพธ์ DML มีค่าหรือไม่ และเป็นจุดที่การใช้งานวิธีส่วนใหญ่แตกออกอย่างเงียบๆ
ความเป็นปกติแบบไม่มีที่สิ้นสุดด้านบนคือการแถลงเกี่ยวกับ การรักษาที่ระบุไว้ล่วงหน้าหนึ่ง, ชุดตัวแปรสับสนที่ระบุไว้ล่วงหน้าหนึ่ง, คะแนนที่ระบุไว้ล่วงหน้าหนึ่ง กำหนดเหล่านั้นล่วงหน้า, เรียกใช้ตัวประมาณครั้งหนึ่ง และช่วงหมายถึงสิ่งที่มันกล่าว ลองการรักษาผู้สมัครสาม, หรือชุดตัวแปรสับสนสี่, หรือสลับ learners จนกว่า p-value จะดูดีขึ้น และคุณไม่ได้กำลังทำการอนุมานอีกต่อไป — คุณกำลังเรียกใช้การค้นหา และ p-value ที่รายงานคือ p-value ของ สูงสุด ไม่ใช่ของการจับสลาก
บล็อกได้วัดสิ่งที่มันทำแล้วใน the deflated Sharpe ratio study, การค้นหาบนสัญญาณรบกวนบริสุทธิ์ด้วยขอบเริ่มต้นจริงเป็นศูนย์ผลิตอัตราการค้นพบเท็จแบบธรรมดา 1.000 — การทดสอบที่ไม่ได้ปรับยิงทุกครั้ง — ในขณะที่ p-value ธรรมดากลางของผู้ชนะนั่งอยู่ใกล้กับ 0.0007 ไม่มีอะไรเกี่ยวกับออร์โธโกนาลิตีของ Neyman ปกป้องคุณจากสิ่งนี้ ออร์โธโกนาลิตีแก้ไขอคติจาก การประมาณ nuisance; มันไม่พูดอะไรเกี่ยวกับอคติจาก การค้นหาสเปค p-value DML ของ 1e-05 ที่ได้หลังจากลองสเปคหกครั้งสมควรได้รับการ treat แบบ Bonferroni/Holm/BHY เช่นเดียวกับผู้ชนะอื่นที่ดึงออกจาก grid โดยที่ ถูกตั้งค่าเป็นจำนวนสเปคที่คุณเรียกใช้จริงๆ
นี้มีผลกระทบเชิงปฏิบัติโดยตรงต่อคุณสมบัติความสะดวกของเครื่องมือ DoubleMLData ยอมรับรายการใน d_cols และจะส่งคืนผลกระทบการรักษาสามครั้งในตารางสรุปอย่างยินดี:
dml_data_multi = dml.DoubleMLData(
df, y_col='filled', d_cols=['queue_pos', 'toxicity', 'spread_at_post'],
x_cols=confounder_cols,
)
สามแถว, สาม p-values, และปัญหาการทดสอบหลายครั้งที่ตารางสรุปไม่ได้กล่าวถึง หากคุณอ่านทั้งสาม, ปรับทั้งสาม หากเพียงหนึ่งเป็นคำถามที่ลงทะเบียนไว้ล่วงหน้า, บอกเช่นนั้น และ treat อีกสองอย่างชัดเจนว่าเป็นการสำรวจ
Cross-Fitting บนอนุกรมเวลา: Purge, Embargo, Folds แบบกำหนดเอง

DML มาตรฐานสมมติการสังเกต i.i.d. ข้อมูลสมุดฯไม่ใช่ และโหมดความล้มเหลวคือสิ่งที่บล็อกได้บันทึกรายละเอียดมาแล้ว: แถวที่อยู่ติดกันแชร์หน้าต่างล่วงหน้าที่ซ้อนทับ ดังนั้น TimeSeriesSplit ธรรมดายังรั่วคำตอบข้ามขอบเขต fold ดู spread modeling with machine learning สำหรับการนำ walk-forward ที่ถูก purge และ embargo และเหตุผลที่ต้องการช่องว่างอย่างน้อย horizon แถว และ the look-ahead bias taxonomy สำหรับแคตตาล็อกรั่วเต็มและขนาดที่วัดได้
ส่วนที่เฉพาะเจาะจง DML จริงๆ คือวิธีที่คุณส่ง folds ที่ถูก purge ไปยังตัวประมาณ เพราะ set_sample_splitting มีสัญญาที่ทำให้คนติดกับ:
import numpy as np
import doubleml as dml
def purged_folds(n: int, n_splits: int, horizon: int):
"""Folds หน้าต่างขยายพร้อมช่องว่าง purge/embargo `horizon` แถว
การสร้างเดียวกันกับ CV walk-forward ที่ถูก purge ในบทความ
spread modeling: ช่องว่างลบการซ้อนทับระหว่างหน้าต่างล่วงหน้า
ของแถวการฝึกและแถวการตรวจสอบ
"""
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()
สองสิ่งที่ต้องรู้ ไม่มีสิ่งใดที่ชัดเจนจากเอกสารไลบรารี:
-
Folds walk-forward ที่ถูก purge ไม่ครอบคลุมทุกแถว ช่องว่าง purge และบล็อกการฝึกเริ่มต้นไม่เคยเป็น fold ทดสอบของใคร ดังนั้น ถูกประมาณจากตกค้างน้อยกว่า อย่างเคร่งครัด นั่นคือพฤติกรรมที่ถูกต้อง ไม่ใช่บั๊ก แต่มันหมายความว่า ที่มีประสิทธิภาพในสูตรความแปรผันคือจำนวนแถว การทดสอบที่รวมกัน — ตรวจสอบมันแทนการสมมติ
-
การทำซ้ำ
n_repไม่ฟรีที่นี่ พร้อม K-fold สุ่ม, การทำซ้ำ cross-fitting และการเฉลี่ยเป็นการลดความแปรผันที่ถูก ด้วยการแยกแบบมิติตามลำดับเวลาที่กำหนดไว้มีเพียงการแยกหนึ่งเดียว ดังนั้นn_repไม่ซื้ออะไรและไม่ซ่อนอะไร; เสถียรภาพต้องมาจากการรันใหม่บนหน้าต่างข้อมูลที่แตกต่างแทน
สำหรับโครงสร้างแผง (สัญลักษณ์มากมายในช่วงเวลาเดียวกัน), DoubleML รองรับค่ามาตรฐานข้อผิดพลาดแบบทนต่อคลัสเตอร์ — คลัสเตอร์บนสัญลักษณ์ ไม่ใช่บนเวลา และดู multi-symbol validation สำหรับตำแหน่งของบล็อกเกี่ยวกับเวลาที่ผลลัพธ์ข้ามเครื่องมือถูกสถาปนาจริงๆ
กรณีที่วัด: ตำแหน่งคิวและความน่าจะเป็นของ Fill

นี่คือคำถามเชิงสาเหตุหนึ่งเดียวในบทความที่โปรเจกต์มีข้อมูลอยู่แล้ว และควรเรียกใช้แทนที่จะเสนอ Queue position analysis ครอบคลุมการประมาณตำแหน่ง, กลไก FIFO, อัตราการระบายและเวลาถึง fill บนข้อมูลสมุดฯ จริง; fill simulation ครอบคลุมโมเดลการคำนวณความน่าจะเป็นของ fill และลูปการสอบเทียบกับ fills สด ทั้งสองผลิตโมเดล การทำนาย ของ fills DML แปลงอินพุตเดียวกันเป็นการประมาณเชิงสาเหตุ
สเปคที่ลงทะเบียนไว้ล่วงหน้าก่อนดูการประมาณ:
- ผลลัพธ์ : ถูก fill ภายใน
HORIZONsnapshots (ไบนารี) - การรักษา : ตำแหน่งคิวที่ทำให้เป็นปกติในขณะวาง
- ตัวแปรสับสน : ความผันผวนที่เกิดขึ้นจริง 1s, spread ที่ระบุใน bps, ความไม่สมดุลของความลึก, ขนาดระดับที่โพสต์, ระยะห่างจาก mid ใน ticks, การเข้ารหัสเวลาของวัน, ป้ายกำกับระบบ
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)
ผลลัพธ์ที่จะรายงานคือการเปรียบเทียบสี่คอลัมน์ ไม่ใช่สัมประสิทธิ์เดียว: การประมาณ แบบธรรมดา OLS ของ บน อย่างเดียว, การประมาณ ควบคุมเชิงเส้น ของ บน และ , การประมาณ DML พร้อมค่ามาตรฐานข้อผิดพลาด และ ค่าความแข็งแกร่ง จากการวิเคราะห์ความไว — ตัวแปรสับสนที่ไม่สังเกตที่แข็งแกร่งเพียงใดจะต้องเป็นเพื่อทำให้ผลกระทบเป็นโมฆะ ช่องว่างระหว่างคอลัมน์แบบธรรมดาและ DML คือปริมาณที่น่าสนใจจริง: มันคือเท่าใดของค่าปรากฏของตำแหน่งคิวที่เป็นสภาพตลาดสวมชุด
ว่างเป็นศูนย์หรือเชิงลบที่นี่เป็นผลลัพธ์ที่ตีพิมพ์ได้และเหมาะกับบล็อกนี้มากกว่าเชิงบวกที่สะอาด หากผลกระทบเชิงสาเหตุของตำแหน่งคิวยุบตัวลงเมื่อความผันผวนและขนาดระดับถูก partial out นั่นคือการค้นพบโดยตรงเกี่ยวกับนโยบายการวางคำสั่งซื้อขาย: ช่องไม่ใช่สิ่งที่ทำให้ได้ fill, เงื่อนไขที่คุณได้รับช่องคือ
การวิเคราะห์ปัจจัยเชิงสาเหตุ
แนวทางมาตรฐานสำหรับการลงทุนปัจจัยคือเชิงสัมพันธ์: เรียงตามลักษณะเฉพาะ, สร้างพอร์ตโฟลิโอ long-short, สังเกตว่าผลตอบแทนแตกต่าง DML ทำให้การทดสอบที่แตกต่าง — ประมาณผลกระทบเชิงสาเหตุโดยตรงของลักษณะเฉพาะต่อผลตอบแทน ลบผลกระทบการสับสนของลักษณะเฉพาะอื่น หากผลกระทบหายไปภายใต้ DML ปัจจัยไม่ได้เป็นอิสระเชิงสาเหตุ; มันคือพร็อกซี
นี้คือความสงสัยปัจจัย ที่สอง ที่เป็นอิสระ และมีค่าเป็นชัดเจนเกี่ยวกับวิธีที่มันเกี่ยวข้องกับสิ่งที่บล็อกเผยแพร่อยู่แล้ว The deflated Sharpe ratio โจมตีสวนสัตว์ปัจจัยจากด้าน การเลือก: ด้วยการทดลองพอ, ปัจจัยสามารถดูสำคัญเพียงเพราะคุณมองหลายครั้ง DML โจมตีจากด้าน การสับสน: ปัจจัยสามารถดูสำคัญในการทดสอบซื่อสัตย์ครั้งเดียวและยังเป็นพร็อกซีสำหรับสิ่งอื่นในชุดเงื่อนไข ปัจจัยต้องอยู่รอดทั้งสองเพื่อน่าสนใจ และโหมดความล้มเหลวสองแบบเป็นอิสระ — ผ่านหนึ่งบอกอะไรไม่ได้เกี่ยวกับอีกหนึ่ง
สิ่งที่ DML ไม่สามารถทำ
-
มันต้องการให้ตัวแปรสับสนถูกสังเกต หากตัวแปรที่ไม่ถูกสังเกตขับเคลื่อนทั้งการรักษาและผลลัพธ์ DML เอนเอียง และไม่มีความซับซ้อนของ ML ใดแก้ไขปัญหาการระบุ การวิเคราะห์ความไวจำกัดความเสี่ยง; มันไม่ลบมันออก
-
มันประมาณผลกระทบเฉลี่ย หากผลกระทบของตำแหน่งคิวแตกต่างอย่างมากข้ามระบบ การประมาณจุดคือเฉลี่ยข้ามการผสมระบบของตัวอย่างของคุณ สำหรับความแตกต่างใช้ Interactive Regression Model (
DoubleMLIRM) หรือ causal forest -
มันสมมติโมเดลโครงสร้าง สเปคเส้นตรงบางส่วนต้องการให้การรักษาเข้าสู่สมการผลลัพธ์ในวิธีเฉพาะ หากกระบวนการจริงแตกต่างอย่างพื้นฐาน DML ผิดอย่างมั่นใจ
-
มันไม่ค้นพบโครงสร้างเชิงสาเหตุ DML ประมาณผลกระทบของ การรักษาที่ระบุไว้ล่วงหน้า มันไม่บอกคุณว่าตัวแปรใดเป็นสาเหตุ
-
มันไม่ยกเว้นคุณจากการทดสอบหลายครั้ง ทำซ้ำจุดด้านบนเพราะมันคือจุดที่ถูกข้ามมากที่สุด: ออร์โธโกนาลิตี de-biases การประมาณ nuisance, ไม่ใช่การค้นหาสเปค
บันทึกเชิงปฏิบัติ
ขนาดตัวอย่าง DML ต้องการให้โมเดล nuisance บรรจบกันที่ ซึ่งในทางปฏิบัติหมายความว่าแถวเพียงพอสำหรับโมเดล ML เพื่อประมาณ และ โดยสิ้นเชิง แทนที่จะเชื่อใจเกณฑ์ตัวเลขปัด สถาปนาความเหมาะสมอย่างเป็นประจัมวิธีที่ multi-symbol validation ทำ — ตรวจสอบว่าการประมาณยืนหยุดข้ามเครื่องมือและช่วงย่อย และ treat ความไม่เสถียรเป็นสัญญาณที่มันคือ
การเลือก learner ความจริงเฉพาะ DML แคบแต่มีประโยชน์: กำหนดการบรรจบ , learner ส่งผลต่อ ประสิทธิภาพ ของ (ความกว้างช่วง) ไม่ใช่ความสอดคล้อง ว่า learners ที่ไหนควรไปถึงบนข้อมูลตลาดตาราง และเหตุใด gradient boosting เป็นค่าเริ่มต้น ครอบคลุมอยู่แล้วใน spread modeling with machine learning หาก เคลื่อนที่อย่างมีวัสดุข้าม learners นั่นไม่ใช่เมนูให้เลือก — มันคือหลักฐานว่าฟังก์ชัน nuisance ถูกประมาณแย่ และตามส่วนด้านบน, เลือกที่เป็นมิตรที่สุดเปลี่ยนแบบฝึกเป็นการค้นหา
บทสรุป
DML ให้บล็อกสิ่งที่มันไม่มี: วิธีระบุข้ออ้างเชิง microstructure ของตลาดเป็นพารามิเตอร์เชิงสาเหตุพร้อมค่ามาตรฐานข้อผิดพลาดที่ปกป้องได้ แทนที่จะเป็นการทำนายพร้อมคะแนนการตรวจสอบที่ดี
สามแนวคิดที่แบกรับน้ำหนักคือ:
- ทำให้ตั้งฉาก คะแนนเพื่อให้ข้อผิดพลาดขั้นตอนแรกชดเชยเป็นลำดับที่สอง
- Cross-fit, พร้อม folds ที่ถูก purge และ embargo บนข้อมูลอนุกรมเวลา เพื่อให้ overfitting ขั้นตอนแรกไม่สามารถเลื่อน
- ระบุล่วงหน้า, เพื่อให้ช่วงที่คุณรายงานคือช่วงที่คุณได้รับจริงๆ
ตัวประมาณคือส่วนที่ง่าย ส่วนที่ยากยังไม่เปลี่ยนแปลง: ตัดสินใจว่าตัวแปรสับสนใดสำคัญ, โต้แย้งว่าข้อสมมติฐานการระบุยังคงอยู่, และต้านทานความอยากที่จะรันสเปคอีกครั้ง
อ้างอิง
เชื้อสายของ DML สั้นและมีค่าหนึ่งบรรทัด: มันคือโมเดลเส้นตรงบางส่วนของ Robinson (1988) พร้อม ML แทนที่ตัวประมาณเคอร์เนล, บรรจบถึงขอบเขตประสิทธิภาพกึ่งพารามิเตอร์, พร้อมเงื่อนไขออร์โธโกนาลิตีที่ย้อนกลับไปถึงการทดสอบ C() ของ Neyman และลูกพี่ลูกน้องใกล้ชิดในวรรณกรรมการเรียนรู้ที่มุ่งเป้า (TMLE) การมีส่วนร่วมของ Chernozhukov และคณะคือการแสดงว่าสิ่งนี้สามารถทำให้เป็นปฏิบัติการณ์ได้ด้วย learners ML โดยพลการในขณะที่ยังคงการอนุมาน -consistent, แบบไม่มีที่สิ้นสุด
- 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.
ผู้เขียน
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.