← กลับไปยังบทความ
August 2, 2026
อ่าน 5 นาที

Double Machine Learning: การประมาณค่าพารามิเตอร์เชิงสาเหตุแทนการทำนายผลตอบแทน

Double Machine Learning: การประมาณค่าพารามิเตอร์เชิงสาเหตุแทนการทำนายผลตอบแทน
#causal-inference
#double-ML
#treatment-effect
#econometrics
#quant

บทความการสร้างโมเดลทุกบทความในบล็อกนี้จนถึงตอนนี้นำเสนอคำถามในรูปแบบเดียวกัน: กำหนดคุณลักษณะ ทำนายตัวเลข จากนั้นตรวจสอบว่าการทำนายนั้นอยู่รอดนอกตัวอย่าง โมเดล spread ทำนาย spread โมเดล fill ทำนายความน่าจะเป็นของการ fill กระบวนการตรวจสอบความถูกต้องทั้งหมด — purged walk-forward, deflated Sharpe, look-ahead taxonomy — มีอยู่เพื่อตรวจสอบว่า การทำนาย เป็นจริงหรือไม่

บทความนี้นำเสนอคำถามในรูปแบบที่แตกต่าง และเป็นชิ้นส่วนเครื่องมือเดียวที่บล็อกไม่เคยมีมาก่อน: ประมาณค่าพารามิเตอร์สเกลาร์เดียวที่มีการตีความเชิงสาเหตุ และแนบค่ามาตรฐานข้อผิดพลาดที่อยู่รอดต่อการใช้โมเดล ML ที่ยืดหยุ่นในการไปสู่จุดนั้น

นั่นไม่ใช่ความแตกต่างทางวาจา "ตำแหน่งคิวทำนายความน่าจะเป็นของ fill" เป็นความจริงเล็กน้อยและไร้ประโยชน์ในการดำเนินงาน — แน่นอนว่ามันเป็นเช่นนั้น เพราะทั้งคู่ขับเคลื่อนโดยความลึกและความผันผวน "การเลื่อนไปข้างหน้าหนึ่งตำแหน่งในคิว ทำให้เกิด การเปลี่ยนแปลงของ θ\theta ในความน่าจะเป็นของ fill โดยกำหนดให้สภาพของตลาดคงที่" เป็นตัวเลขที่คุณสามารถใส่ในนโยบายการวางคำสั่งซื้อขาย อันแรกเป็นการปรับค่าการถดถอย อันที่สองต้องการตัวประมาณที่ไม่มีอยู่ในกล่องเครื่องมือ ML มาตรฐาน เพราะ regularization และ overfitting ในขั้นตอนแรกที่ยืดหยุ่นจะทำให้เกิดความเอนเอียงกับสัมประสิทธิ์ที่คุณใส่ใจพอดี

Double Machine Learning (Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins, 2018) เป็นตัวประมาณที่แก้ไขปัญหานี้ เทรเดอร์ควอนต์ทุกคนได้ยินมา: สหสัมพันธ์ไม่ใช่เชิงสาเหตุ DML คือส่วนที่มาหลังประโยคนั้น

เหตุใดการถดถอยแบบง่ายล้มเหลว

ตัวแปรสับสนของสภาพตลาดที่ซ่อนอยู่ขับเคลื่อนทั้งการวางคิวและผลลัพธ์ของ fill สร้างความสัมพันธ์ที่หลอกลวง

ตั้งคำถามในดินแดนของบล็อกเอง เราต้องการผลกระทบเชิงสาเหตุของตำแหน่งคิวต่อความน่าจะเป็นของ fill:

  • YiY_i: คำสั่งซื้อขายแบบจำกัดที่พักอยู่ที่การสังเกต ii ถูก fill ภายในขอบเขต
  • DiD_i: ตำแหน่งคิวที่การวาง (ทำให้เป็นปกติโดยขนาดระดับ)
  • XiX_i: ตัวแปรสับสน — ความผันผวนที่เกิดขึ้นจริง, spread ที่ระบุ, ความไม่สมดุลของความลึก, ขนาดระดับ, เวลาของวัน, ป้ายกำกับระบบ นี่คือตัวแปรสภาพตลาดที่บล็อกคำนวณอยู่แล้วใน spread modeling with machine learning

พารามิเตอร์เชิงสาเหตุคือ θ0\theta_0 ใน

Yi=Diθ0+g0(Xi)+ϵiY_i = D_i \theta_0 + g_0(X_i) + \epsilon_i

โดยที่ g0(Xi)g_0(X_i) จับความสัมพันธ์ (ที่อาจซับซ้อน, ไม่เป็นเชิงเส้น) ระหว่างสภาพตลาดและผลลัพธ์ของ fill

การรักษาไม่ได้ถูกสุ่มมอบหมาย คุณอยู่ใกล้ด้านหน้าของคิว เพราะ ระดับบางๆ หรือเพราะคุณโพสต์ในช่วงที่สงบ หรือเพราะสมุดฯ ไม่สมดุลในทางที่ดีสำหรับคุณ เงื่อนไขเดียวกันขับเคลื่อนอย่างเป็นอิสระว่าคุณถูก fill หรือไม่ นั่นคือความสับสน

แนวทางที่ 1: ละเลยตัวแปรสับสน ถดถอย YY กับ DD เพียงอย่างเดียว การประมาณจะดูดซับผลกระทบของตัวแปรสับสนทุกตัวที่มีสหสัมพันธ์กับทั้งสอง อคติของตัวแปรที่ถูกละเลยในตำรา: ระดับบางๆ ให้ทั้งช่องคิวที่ดีและอัตรา fill สูง ดังนั้นคุณประเมินค่าช่องมากเกินไป

แนวทางที่ 2: การถดถอยเชิงเส้นพร้อมตัวควบคุม ถดถอย YY กับ DD และ XX วิธีนี้ใช้ได้ก็ต่อเมื่อ g0(X)g_0(X) เป็นเชิงเส้นจริงๆ พลวัตของสมุดฯไม่ใช่เช่นนั้น — ความสัมพันธ์ fill/volatility มีเกณฑ์, ผลกระทบของความไม่สมดุลของความลึกเปลี่ยนเครื่องหมายตามระบบ การระบุ g0g_0 ผิดจะนำอคติกลับมา

แนวทางที่ 3: การทำนาย ML ปรับโมเดล gradient boosted บน (D,X)(D, X) คุณได้รับการแยกแยะ out-of-sample ที่ดี และไม่มีการตีความเชิงสาเหตุอย่างสิ้นเชิง โมเดลจับรูปแบบการทำนายทุกรูปแบบ เชิงสาเหตุหรือไม่ก็ตาม; regularization ย่อส่วนส่วนสนับสนุนของการรักษาในแบบที่ทำให้ θ\theta เอนเอียง; และไม่มีค่ามาตรฐานข้อผิดพลาดที่คุณวางใจได้

นี่คือความตึงเครียดหลัก ML ดีในการทำนาย แต่การใช้งานแบบง่ายต่อพารามิเตอร์เชิงสาเหตุผลิตการประมาณที่เอนเอียง ไม่ปกติ และไม่น่าเชื่อถือ

โมเดลเส้นตรงบางส่วน

ช่อง residualization สองช่องที่ซิงค์กันลบสภาพตลาดที่น่ารำคาญออกก่อนที่กระแสตกค้างที่สะอาดจะพบกันที่การประมาณเชิงสาเหตุที่ตั้งฉากกัน

DML ทำงานภายใต้กรอบโครงสร้าง เครื่องมือหลักคือ การถดถอยเส้นตรงบางส่วน (PLR):

Y=Dθ0+g0(X)+U,E[UX,D]=0Y = D\theta_0 + g_0(X) + U, \quad \mathbb{E}[U \mid X, D] = 0

D=m0(X)+V,E[VX]=0D = m_0(X) + V, \quad \mathbb{E}[V \mid X] = 0

  • θ0\theta_0 คือพารามิเตอร์เชิงสาเหตุที่น่าสนใจ
  • g0(X)g_0(X) คือฟังก์ชัน nuisance — ส่วนของผลลัพธ์ที่อธิบายโดยสภาพตลาด
  • m0(X)m_0(X) คือฟังก์ชัน nuisance อีกอัน — ค่าคาดหวังเงื่อนไขของการรักษาที่ให้สภาพตลาด ("propensity" ในการตั้งค่าการรักษาต่อเนื่อง)
  • UU และ VV คือตกค้างโครงสร้าง

ข้อเข้าใจสำคัญ: θ0\theta_0 เป็นมิติต่ำ แต่ g0g_0 และ m0m_0 สามารถซับซ้อนโดยพลการ เราต้องการให้ ML จัดการฟังก์ชัน nuisance ในขณะที่ยังคงให้การอนุมานที่ถูกต้องบนสเกลาร์

เหตุใด "คู่"?

สองโมเดล ML ไม่ใช่หนึ่ง:

  1. โมเดลผลลัพธ์: ^(X)E[YX]\hat{\ell}(X) \approx \mathbb{E}[Y \mid X] — ทำนายผลลัพธ์จากสภาพตลาดอย่างเดียว
  2. โมเดลการรักษา: m^(X)E[DX]\hat{m}(X) \approx \mathbb{E}[D \mid X] — ทำนายการรักษาจากสภาพตลาดอย่างเดียว

สร้างตกค้าง

Y~i=Yi^(Xi),D~i=Dim^(Xi)\tilde{Y}_i = Y_i - \hat{\ell}(X_i), \quad \tilde{D}_i = D_i - \hat{m}(X_i)

และประมาณ θ0\theta_0 โดยถดถอย Y~\tilde{Y} บน D~\tilde{D}:

θ^0=iD~iY~iiD~i2\hat{\theta}_0 = \frac{\sum_i \tilde{D}_i \tilde{Y}_i}{\sum_i \tilde{D}_i^2}

นี่คือ Frisch-Waugh-Lovell บนสเตอรอยด์: partial out ตัวแปรสับสนด้วย ML แทนการฉายภาพเชิงเส้น จากนั้นอ่านผลกระทบการรักษาจากความแปรผันของตกค้าง

ออร์โธโกนาลิตีของ Neyman: เหตุใดมันใช้ได้

แนวทาง partial-out แบบง่าย (ประมาณ g0g_0, ลบ, ถดถอย) ล้มเหลวเพราะข้อผิดพลาดในการประมาณ ML ใน g^0\hat{g}_0 แพร่กระจายตรงไปยัง θ^0\hat\theta_0 คะแนน DML ถูกสร้างขึ้นเพื่อเป็น Neyman orthogonal — ไม่ไวต่อการรบกวนเล็กน้อยในฟังก์ชัน nuisance

คะแนนออร์โธโกนอลสำหรับ PLR:

ψ(W;θ,η)=[Y(X)θ(Dm(X))][Dm(X)]\psi(W; \theta, \eta) = \big[Y - \ell(X) - \theta(D - m(X))\big] \cdot \big[D - m(X)\big]

โดยที่ η=(,m)\eta = (\ell, m) เงื่อนไขออร์โธโกนาลิตีคือ

ηE[ψ(W;θ0,η)]η=η0=0\left. \frac{\partial}{\partial \eta} \mathbb{E}\big[\psi(W; \theta_0, \eta)\big] \right|_{\eta = \eta_0} = 0

เชิงอรรถ คะแนนใช้เฉพาะความแปรผันใน DD และ YY ที่เป็นอิสระจาก XX และข้อผิดพลาดในฟังก์ชัน nuisance หนึ่งจะถูกชดเชยโดยอีกอัน หาก m^\hat{m} ทำนายการรักษามากเกินไปเล็กน้อย D~\tilde{D} จะเล็กเกินไปเล็กน้อย แต่ข้อผิดพลาดที่สอดคล้องกันใน Y~\tilde{Y} จากการประมาณ \ell ผิดจะผลักในทิศทางชดเชย อคติจะกลายเป็น ลำดับที่สอง — ผลคูณของข้อผิดพลาดสองขั้นตอนแรก — แทนที่จะเป็นลำดับแรก

อย่างเป็นทางการ หากตัวประมาณ nuisance ทั้งสองบรรจบกันที่อัตรา n1/4n^{-1/4} (ไม่รุนแรง; วิธี ML ที่สมเหตุสมผลส่วนใหญ่ผ่าน) แล้ว

N(θ^0θ0)dN(0,σ2)\sqrt{N}(\hat{\theta}_0 - \theta_0) \xrightarrow{d} \mathcal{N}(0, \sigma^2)

ดังนั้น θ^0\hat\theta_0 บรรจบกันที่อัตราพารามิเตอร์และเป็นปกติแบบไม่มีที่สิ้นสุด

Cross-Fitting: เหตุใดจำเป็นที่นี่

ออร์โธโกนาลิตีอย่างเดียวไม่เพียงพอ หากโมเดล nuisance ถูกปรับบนแถวเดียวกันที่ใช้ประมาณ θ0\theta_0 overfitting ขั้นตอนแรกจะปนเปื้อนขั้นตอนที่สอง — และอันตรายเฉพาะนั้นมีค่ากล่าวอย่างแม่นยำ เพราะมันไม่ใช่อันตรายที่คุณคุ้ยกาล ที่อื่น overfitting ปรากฏเป็นคะแนนการตรวจสอบที่พองตัว: คุณสังเกตมัน, คุณหักคะแนนมัน, คุณดำเนินต่อ ที่นี่ปรากฏเป็น การประมาณจุดที่เลื่อนสำหรับ θ0\theta_0 พร้อมช่วงความมั่นใจที่ยังแคบและยังจัดกึ่งกลางกับตัวเลขที่ผิด ไม่มีคะแนนให้ต้องสงสัย ตัวประมาณเพียงแค่โกหกเงียบๆ

Cross-fitting ตัดความเชื่อมโยง: การทำนาย nuisance ของแต่ละการสังเกตมาจากโมเดลที่ฝึกโดยไม่มีมัน และ θ0\theta_0 ถูกประมาณจากตกค้างที่รวมกันแบบ held-out กลไกคือเครื่องจักร K-fold ธรรมดา ครอบคลุมใน spread modeling with machine learning; สิ่งที่สำคัญด้านล่างคือ folds ที่คุณส่งให้มัน

อัลกอริทึม DML ทีละขั้นตอน

อินพุต: ข้อมูล {(Yi,Di,Xi)}i=1N\{(Y_i, D_i, X_i)\}_{i=1}^N, วิธี ML M\mathcal{M}_\ell และ Mm\mathcal{M}_m, folds KK

ขั้นตอนที่ 1 — แบ่งส่วน: แบ่ง {1,,N}\{1, \ldots, N\} เป็น KK folds ที่ไม่ซ้อนทับกัน

ขั้นตอนที่ 2 — Cross-fit โมเดล nuisance: สำหรับ k=1,,Kk = 1, \ldots, K, ฝึก ^(k)\hat{\ell}^{(-k)} และ m^(k)\hat{m}^{(-k)} บนส่วนประกอบของ fold kk, จากนั้นคำนวณ Y~i=Yi^(k)(Xi)\tilde{Y}_i = Y_i - \hat{\ell}^{(-k)}(X_i) และ D~i=Dim^(k)(Xi)\tilde{D}_i = D_i - \hat{m}^{(-k)}(X_i) สำหรับ iIki \in I_k

ขั้นตอนที่ 3 — การประมาณ:

θ^0=(i=1ND~i2)1i=1ND~iY~i\hat{\theta}_0 = \left(\sum_{i=1}^N \tilde{D}_i^2\right)^{-1} \sum_{i=1}^N \tilde{D}_i \tilde{Y}_i

ขั้นตอนที่ 4 — การอนุมาน:

σ^2=1Ni=1N(Y~iθ^0D~i)2D~i2/(1Ni=1ND~i2)2\hat{\sigma}^2 = \frac{1}{N} \sum_{i=1}^N \big(\tilde{Y}_i - \hat{\theta}_0 \tilde{D}_i\big)^2 \tilde{D}_i^2 \bigg/ \left(\frac{1}{N} \sum_{i=1}^N \tilde{D}_i^2\right)^2

พร้อมช่วง θ^0±zα/2σ^/N\hat{\theta}_0 \pm z_{\alpha/2} \cdot \hat{\sigma} / \sqrt{N}

ช่วงความมั่นใจถูกต้องสำหรับคำถามที่แน่นอนหนึ่งคำถาม

นี่คือข้อจำกัดที่ตัดสินว่าผลลัพธ์ 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 โดยที่ MM ถูกตั้งค่าเป็นจำนวนสเปคที่คุณเรียกใช้จริงๆ

นี้มีผลกระทบเชิงปฏิบัติโดยตรงต่อคุณสมบัติความสะดวกของเครื่องมือ 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 แบบกำหนดเอง

Folds อนุกรมเวลาแบบหมุนใช้ช่องว่าง purge และโซน embargo ก่อนที่ตกค้าง out-of-fold จะประกอบเป็นการประมาณเชิงสาเหตุหนึ่งครั้ง

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

สองสิ่งที่ต้องรู้ ไม่มีสิ่งใดที่ชัดเจนจากเอกสารไลบรารี:

  1. Folds walk-forward ที่ถูก purge ไม่ครอบคลุมทุกแถว ช่องว่าง purge และบล็อกการฝึกเริ่มต้นไม่เคยเป็น fold ทดสอบของใคร ดังนั้น θ0\theta_0 ถูกประมาณจากตกค้างน้อยกว่า NN อย่างเคร่งครัด นั่นคือพฤติกรรมที่ถูกต้อง ไม่ใช่บั๊ก แต่มันหมายความว่า NN ที่มีประสิทธิภาพในสูตรความแปรผันคือจำนวนแถว การทดสอบที่รวมกัน — ตรวจสอบมันแทนการสมมติ

  2. การทำซ้ำ n_rep ไม่ฟรีที่นี่ พร้อม K-fold สุ่ม, การทำซ้ำ cross-fitting และการเฉลี่ยเป็นการลดความแปรผันที่ถูก ด้วยการแยกแบบมิติตามลำดับเวลาที่กำหนดไว้มีเพียงการแยกหนึ่งเดียว ดังนั้น n_rep ไม่ซื้ออะไรและไม่ซ่อนอะไร; เสถียรภาพต้องมาจากการรันใหม่บนหน้าต่างข้อมูลที่แตกต่างแทน

สำหรับโครงสร้างแผง (สัญลักษณ์มากมายในช่วงเวลาเดียวกัน), DoubleML รองรับค่ามาตรฐานข้อผิดพลาดแบบทนต่อคลัสเตอร์ — คลัสเตอร์บนสัญลักษณ์ ไม่ใช่บนเวลา และดู multi-symbol validation สำหรับตำแหน่งของบล็อกเกี่ยวกับเวลาที่ผลลัพธ์ข้ามเครื่องมือถูกสถาปนาจริงๆ

กรณีที่วัด: ตำแหน่งคิวและความน่าจะเป็นของ Fill

ตำแหน่งคำสั่งซื้อขายในคิว FIFO บรรจบเป็นผลกระทบตำแหน่งคิวที่ปรับโดย DML พร้อมรัศมีความมั่นใจ

นี่คือคำถามเชิงสาเหตุหนึ่งเดียวในบทความที่โปรเจกต์มีข้อมูลอยู่แล้ว และควรเรียกใช้แทนที่จะเสนอ Queue position analysis ครอบคลุมการประมาณตำแหน่ง, กลไก FIFO, อัตราการระบายและเวลาถึง fill บนข้อมูลสมุดฯ จริง; fill simulation ครอบคลุมโมเดลการคำนวณความน่าจะเป็นของ fill และลูปการสอบเทียบกับ fills สด ทั้งสองผลิตโมเดล การทำนาย ของ fills DML แปลงอินพุตเดียวกันเป็นการประมาณเชิงสาเหตุ

สเปคที่ลงทะเบียนไว้ล่วงหน้าก่อนดูการประมาณ:

  • ผลลัพธ์ YY: ถูก fill ภายใน HORIZON snapshots (ไบนารี)
  • การรักษา DD: ตำแหน่งคิวที่ทำให้เป็นปกติในขณะวาง
  • ตัวแปรสับสน XX: ความผันผวนที่เกิดขึ้นจริง 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 ของ YY บน DD อย่างเดียว, การประมาณ ควบคุมเชิงเส้น ของ YY บน DD และ XX, การประมาณ DML พร้อมค่ามาตรฐานข้อผิดพลาด และ ค่าความแข็งแกร่ง จากการวิเคราะห์ความไว — ตัวแปรสับสนที่ไม่สังเกตที่แข็งแกร่งเพียงใดจะต้องเป็นเพื่อทำให้ผลกระทบเป็นโมฆะ ช่องว่างระหว่างคอลัมน์แบบธรรมดาและ DML คือปริมาณที่น่าสนใจจริง: มันคือเท่าใดของค่าปรากฏของตำแหน่งคิวที่เป็นสภาพตลาดสวมชุด

θ\theta ว่างเป็นศูนย์หรือเชิงลบที่นี่เป็นผลลัพธ์ที่ตีพิมพ์ได้และเหมาะกับบล็อกนี้มากกว่าเชิงบวกที่สะอาด หากผลกระทบเชิงสาเหตุของตำแหน่งคิวยุบตัวลงเมื่อความผันผวนและขนาดระดับถูก partial out นั่นคือการค้นพบโดยตรงเกี่ยวกับนโยบายการวางคำสั่งซื้อขาย: ช่องไม่ใช่สิ่งที่ทำให้ได้ fill, เงื่อนไขที่คุณได้รับช่องคือ

การวิเคราะห์ปัจจัยเชิงสาเหตุ

แนวทางมาตรฐานสำหรับการลงทุนปัจจัยคือเชิงสัมพันธ์: เรียงตามลักษณะเฉพาะ, สร้างพอร์ตโฟลิโอ long-short, สังเกตว่าผลตอบแทนแตกต่าง DML ทำให้การทดสอบที่แตกต่าง — ประมาณผลกระทบเชิงสาเหตุโดยตรงของลักษณะเฉพาะต่อผลตอบแทน ลบผลกระทบการสับสนของลักษณะเฉพาะอื่น หากผลกระทบหายไปภายใต้ DML ปัจจัยไม่ได้เป็นอิสระเชิงสาเหตุ; มันคือพร็อกซี

นี้คือความสงสัยปัจจัย ที่สอง ที่เป็นอิสระ และมีค่าเป็นชัดเจนเกี่ยวกับวิธีที่มันเกี่ยวข้องกับสิ่งที่บล็อกเผยแพร่อยู่แล้ว The deflated Sharpe ratio โจมตีสวนสัตว์ปัจจัยจากด้าน การเลือก: ด้วยการทดลองพอ, ปัจจัยสามารถดูสำคัญเพียงเพราะคุณมองหลายครั้ง DML โจมตีจากด้าน การสับสน: ปัจจัยสามารถดูสำคัญในการทดสอบซื่อสัตย์ครั้งเดียวและยังเป็นพร็อกซีสำหรับสิ่งอื่นในชุดเงื่อนไข ปัจจัยต้องอยู่รอดทั้งสองเพื่อน่าสนใจ และโหมดความล้มเหลวสองแบบเป็นอิสระ — ผ่านหนึ่งบอกอะไรไม่ได้เกี่ยวกับอีกหนึ่ง

สิ่งที่ DML ไม่สามารถทำ

  1. มันต้องการให้ตัวแปรสับสนถูกสังเกต หากตัวแปรที่ไม่ถูกสังเกตขับเคลื่อนทั้งการรักษาและผลลัพธ์ DML เอนเอียง และไม่มีความซับซ้อนของ ML ใดแก้ไขปัญหาการระบุ การวิเคราะห์ความไวจำกัดความเสี่ยง; มันไม่ลบมันออก

  2. มันประมาณผลกระทบเฉลี่ย หากผลกระทบของตำแหน่งคิวแตกต่างอย่างมากข้ามระบบ การประมาณจุดคือเฉลี่ยข้ามการผสมระบบของตัวอย่างของคุณ สำหรับความแตกต่างใช้ Interactive Regression Model (DoubleMLIRM) หรือ causal forest

  3. มันสมมติโมเดลโครงสร้าง สเปคเส้นตรงบางส่วนต้องการให้การรักษาเข้าสู่สมการผลลัพธ์ในวิธีเฉพาะ หากกระบวนการจริงแตกต่างอย่างพื้นฐาน DML ผิดอย่างมั่นใจ

  4. มันไม่ค้นพบโครงสร้างเชิงสาเหตุ DML ประมาณผลกระทบของ การรักษาที่ระบุไว้ล่วงหน้า มันไม่บอกคุณว่าตัวแปรใดเป็นสาเหตุ

  5. มันไม่ยกเว้นคุณจากการทดสอบหลายครั้ง ทำซ้ำจุดด้านบนเพราะมันคือจุดที่ถูกข้ามมากที่สุด: ออร์โธโกนาลิตี de-biases การประมาณ nuisance, ไม่ใช่การค้นหาสเปค

บันทึกเชิงปฏิบัติ

ขนาดตัวอย่าง DML ต้องการให้โมเดล nuisance บรรจบกันที่ n1/4n^{-1/4} ซึ่งในทางปฏิบัติหมายความว่าแถวเพียงพอสำหรับโมเดล ML เพื่อประมาณ g0g_0 และ m0m_0 โดยสิ้นเชิง แทนที่จะเชื่อใจเกณฑ์ตัวเลขปัด สถาปนาความเหมาะสมอย่างเป็นประจัมวิธีที่ multi-symbol validation ทำ — ตรวจสอบว่าการประมาณยืนหยุดข้ามเครื่องมือและช่วงย่อย และ treat ความไม่เสถียรเป็นสัญญาณที่มันคือ

การเลือก learner ความจริงเฉพาะ DML แคบแต่มีประโยชน์: กำหนดการบรรจบ n1/4n^{-1/4}, learner ส่งผลต่อ ประสิทธิภาพ ของ θ^0\hat\theta_0 (ความกว้างช่วง) ไม่ใช่ความสอดคล้อง ว่า learners ที่ไหนควรไปถึงบนข้อมูลตลาดตาราง และเหตุใด gradient boosting เป็นค่าเริ่มต้น ครอบคลุมอยู่แล้วใน spread modeling with machine learning หาก θ^0\hat\theta_0 เคลื่อนที่อย่างมีวัสดุข้าม learners นั่นไม่ใช่เมนูให้เลือก — มันคือหลักฐานว่าฟังก์ชัน nuisance ถูกประมาณแย่ และตามส่วนด้านบน, เลือกที่เป็นมิตรที่สุดเปลี่ยนแบบฝึกเป็นการค้นหา

บทสรุป

DML ให้บล็อกสิ่งที่มันไม่มี: วิธีระบุข้ออ้างเชิง microstructure ของตลาดเป็นพารามิเตอร์เชิงสาเหตุพร้อมค่ามาตรฐานข้อผิดพลาดที่ปกป้องได้ แทนที่จะเป็นการทำนายพร้อมคะแนนการตรวจสอบที่ดี

สามแนวคิดที่แบกรับน้ำหนักคือ:

  • ทำให้ตั้งฉาก คะแนนเพื่อให้ข้อผิดพลาดขั้นตอนแรกชดเชยเป็นลำดับที่สอง
  • Cross-fit, พร้อม folds ที่ถูก purge และ embargo บนข้อมูลอนุกรมเวลา เพื่อให้ overfitting ขั้นตอนแรกไม่สามารถเลื่อน θ0\theta_0
  • ระบุล่วงหน้า, เพื่อให้ช่วงที่คุณรายงานคือช่วงที่คุณได้รับจริงๆ

ตัวประมาณคือส่วนที่ง่าย ส่วนที่ยากยังไม่เปลี่ยนแปลง: ตัดสินใจว่าตัวแปรสับสนใดสำคัญ, โต้แย้งว่าข้อสมมติฐานการระบุยังคงอยู่, และต้านทานความอยากที่จะรันสเปคอีกครั้ง


อ้างอิง

เชื้อสายของ DML สั้นและมีค่าหนึ่งบรรทัด: มันคือโมเดลเส้นตรงบางส่วนของ Robinson (1988) พร้อม ML แทนที่ตัวประมาณเคอร์เนล, บรรจบถึงขอบเขตประสิทธิภาพกึ่งพารามิเตอร์, พร้อมเงื่อนไขออร์โธโกนาลิตีที่ย้อนกลับไปถึงการทดสอบ C(α\alpha) ของ Neyman และลูกพี่ลูกน้องใกล้ชิดในวรรณกรรมการเรียนรู้ที่มุ่งเป้า (TMLE) การมีส่วนร่วมของ Chernozhukov และคณะคือการแสดงว่าสิ่งนี้สามารถทำให้เป็นปฏิบัติการณ์ได้ด้วย learners ML โดยพลการในขณะที่ยังคงการอนุมาน N\sqrt{N}-consistent, แบบไม่มีที่สิ้นสุด

  1. 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.
  2. Robinson, P. M. (1988). Root-N-Consistent Semiparametric Regression. Econometrica, 56(4), 931-954.
  3. 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.
  4. Facure, M. (2022). Causal Inference for the Brave and True. Chapter 22: Debiased/Orthogonal Machine Learning.
  5. Cahan, E., Bai, J., & Ng, S. (2024). Causal Factor Investing. Quantitative Finance.
ข้อจำกัดความรับผิดชอบ: ข้อมูลที่ให้ไว้ในบทความนี้มีไว้เพื่อการศึกษาและให้ข้อมูลเท่านั้น และไม่ถือเป็นคำแนะนำทางการเงิน การลงทุน หรือการเทรด การเทรดสกุลเงินดิจิทัลมีความเสี่ยงสูงที่จะขาดทุน

ผู้เขียน

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

ก้าวนำหน้าตลาด

สมัครรับจดหมายข่าวของเราเพื่อรับข้อมูลเชิงลึกการเทรดด้วย AI เฉพาะ การวิเคราะห์ตลาด และการอัปเดตแพลตฟอร์ม

เราเคารพความเป็นส่วนตัวของคุณ ยกเลิกการสมัครได้ทุกเมื่อ