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

ป่าสาเหตุสำหรับผลกระทบการรักษาที่แตกต่างกันในการเทรด

ป่าสาเหตุสำหรับผลกระทบการรักษาที่แตกต่างกันในการเทรด
#causal-inference
#causal-forest
#heterogeneous-effects
#econometrics
#treatment

โมเดลพยากรณ์ทุกตัวในบล็อกนี้ประมาณวัตถุเดียวกัน: ค่าเฉลี่ยแบบมีเงื่อนไข μ(x)=E[YX=x]\mu(\mathbf{x}) = \mathbb{E}[Y \mid \mathbf{X} = \mathbf{x}] การวิศวกรรมคุณลักษณะ gradient boosting ช่วงความเชื่อมั่นแบบ conformal การตรวจสอบแบบ walk-forward — ทุกอย่างทำหน้าที่เพื่อ estimand เดียว บทความนี้เกี่ยวกับ estimand ที่แตกต่างกันและเครื่องมือที่เปลี่ยนเมื่อคุณสลับมัน

วัตถุคือ ผลกระทบเฉลี่ยของการรักษาแบบมีเงื่อนไข:

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

ความแตกต่างระหว่างผลลัพธ์ที่เป็นไปได้สองอย่างสำหรับหน่วยเดียวกัน — ซึ่งคุณไม่เคยสังเกตอย่างใดอย่างหนึ่ง คุณไม่สามารถถดถอยมันได้เพราะมันไม่อยู่ในข้อมูลของคุณ ป่าสาเหตุ (Athey และ Imbens 2016; Wager และ Athey 2018) ประมาณมันแบบ non-parametric และอย่างน่าประทับใจ ให้ช่วงความเชื่อมั่นที่ถูกต้องรอบๆ มัน

สามสิ่งทำให้สิ่งนี้เป็นไปได้และไม่มีอย่างใดอย่างหนึ่งในป่าสุ่มมาตรฐาน: คำวิจารณ์การแบ่งที่ขยายความแปรปรวนของผลกระทบการรักษาแทนที่จะลดข้อผิดพลาดในการพยากรณ์ ข้อจำกัดของ ความซื่อสัตย์ ที่ห้ามใช้การสังเกตเดียวกันเพื่อเลือกการแบ่งและประมาณผลกระทบภายในมัน และการอ่านป่าซ้ำว่าเป็นเคอร์เนลแบบปรับตัวที่เปลี่ยน co-occurrence ของใบไม้เป็นน้ำหนักการประมาณ สามอย่างนี้ บวกกับการทดสอบการสอบเทียบที่บอกว่าความแตกต่างที่คุณพบเป็นสัญญาณหรือไม่ เป็นเนื้อหาของบทความนี้

จากผลกระทบเฉลี่ยเป็นผลกระทบที่แตกต่างกัน

ผลกระทบเฉลี่ยของการรักษาที่แบนซ่อนกลุ่มเชิงบวกและเชิงลบที่เปิดเผยโดยพื้นผิวผลกระทบการรักษาที่แตกต่างกัน

ผลกระทบเฉลี่ยของการรักษา

การตั้งค่า: การรักษาแบบไบนารี Wi{0,1}W_i \in \{0, 1\} (เหตุการณ์เกิดขึ้นหรือไม่) ผลลัพธ์ YiY_i (ผลตอบแทน) ความร่วมมือ Xi\mathbf{X}_i ผลกระทบเฉลี่ยของการรักษา คือ

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

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

ผลกระทบเฉลี่ยของการรักษาแบบมีเงื่อนไข

CATE τ(x)\tau(\mathbf{x}) มีเงื่อนไขกับคุณลักษณะ กำหนดเหรียญที่มีมูลค่าตลาดเฉพาะ ความผันผวนที่เกิดขึ้นจริง ประวัติการเงินทุน และความลึกของบุ๊ก: ผลกระทบที่คาดหวังของผลตอบแทนจาก เหตุการณ์ นี้ต่อ สินทรัพย์ นี้คืออะไร CATE เป็นฟังก์ชันบนพื้นที่ความร่วมมือ และการประมาณฟังก์ชันนั้นโดยไม่กำหนดรูปร่างคือสิ่งที่ป่าสาเหตุทำ

ทำไมไม่ใช้โมเดลอินเทอร์แอ็คชันเชิงเส้น?

ทางเลือกในตำราคือ regression แบบ saturated:

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

ที่ γ\gamma ถืออินเทอร์แอ็คชัน สิ่งนี้ถือว่าอินเทอร์แอ็คชัน เชิงเส้น ซึ่งหายากที่จะเป็น: ความไวต่อการ flip funding เว้าที่ leverage ไม่เชิงเส้น ความลึกโต้ตอบกับมูลค่าตลาดแบบคูณ; รีจิมความผันผวนประตูทุกอย่าง ป่าสาเหตุไม่บังคับสิ่งเหล่านี้ — พวกมันแบ่งพื้นที่ความร่วมมือแบบปรับตัวและปล่อยให้โครงสร้างความแตกต่างออกมาจากข้อมูล

ป่าสาเหตุ: อัลกอริทึม

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

ป่าสาเหตุคือป่าสุ่มที่สร้างขึ้นใหม่รอบ estimand ของผลกระทบการรักษา ทุกต้นไม้คือ ต้นไม้สาเหตุ ที่แบ่งพื้นที่ความร่วมมือเพื่อขยายความแตกต่างของผลกระทบการรักษา

ต้นไม้สาเหตุ

ที่โหนดภายในทุกโหนด อัลกอริทึมเลือกตัวแปรการแบ่ง jj และจุดการแบ่ง ss ความแตกต่างที่สำคัญจากต้นไม้ regression: คำวิจารณ์ขยาย ความแปรปรวนของผลกระทบการรักษาที่ประมาณ ในลูกๆ แทนที่จะลดข้อผิดพลาดกำลังสองของการพยากรณ์

สำหรับโหนดที่มีข้อมูล (Yi,Wi,Xi)inode(Y_i, W_i, \mathbf{X}_i)_{i \in \text{node}} การประมาณผลกระทบระดับโหนดคือความแตกต่างของค่าเฉลี่ยกลุ่ม:

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

และคะแนนการแบ่งคือ

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

กับ nL,nR,nn_L, n_R, n ขนาดตัวอย่างในลูกซ้าย ลูกขวา และพาเรนต์ นี่คือความแปรปรวนระหว่างกลุ่มของผลกระทบการรักษา: การแบ่งดีเมื่อลูกสองคนไม่เห็นด้วยกับผลกระทบ ไม่ใช่เมื่อพวกมันพยากรณ์ผลลัพธ์ได้ดี ความร่วมมือที่พยากรณ์ YY แรง แต่ orthogonal กับวิธีที่ WW ทำงานจะไม่ถูกเลือก

การประมาณที่ซื่อสัตย์

นวัตกรรมสำคัญคือ ความซื่อสัตย์ ข้อมูลที่ใช้กำหนดโครงสร้างต้นไม้ต้องแยกจากข้อมูลที่ใช้ประมาณผลกระทบใบไม้:

  1. แบ่งข้อมูล เป็น Isplit\mathcal{I}_{\text{split}} และ Iest\mathcal{I}_{\text{est}}
  2. สร้างต้นไม้ ใช้เฉพาะ Isplit\mathcal{I}_{\text{split}} เพื่อเลือกตัวแปรและจุดการแบ่ง
  3. ประมาณผลกระทบใบไม้ ใช้เฉพาะ Iest\mathcal{I}_{\text{est}} dropping การสังเกตเหล่านั้นลงในต้นไม้ที่ถูกตรึงไว้แล้ว

โดยไม่มีสิ่งนี้ ต้นไม้โกง: มันแกะสลักใบไม้ที่ผลกระทบสุดโต่งเป็นสัญญาณรบกวนในตัวอย่างเดียวกันที่ใช้ค้นหาพวกมัน แล้วรายงานสัญญาณรบกวนนั้นเป็นการประมาณ นี่คือความล้มเหลวของการเลือกแบบปรับตัวเดียวกับที่ ความน่าจะเป็นของ backtest overfitting วัดที่ระดับกลยุทธ์ ยกเว้นที่นี่ป้องกันภายในตัวประมาณแทนที่จะวินิจฉัยหลังจากนั้น ความซื่อสัตย์ซื้อความไม่มีอคติเชิง asymptotic:

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

ราคาคือประสิทธิภาพตัวอย่าง — ครึ่งข้อมูลของคุณสร้างโครงสร้างที่ไม่สามารถใช้เติมได้

จากต้นไม้เป็นป่า

ป่าสาเหตุรวม BB ต้นไม้สาเหตุ แต่ละต้นบน subsample สุ่มขนาด s<ns < n ด้วยชุดย่อยของความร่วมมือสุ่มที่การแบ่งแต่ละครั้ง:

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

วิธีที่มีประโยชน์กว่าในการเขียนสิ่งนี้คือเป็น ค่าเฉลี่ยถ่วงน้ำหนักของผลลัพธ์:

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

กับน้ำหนักแบบปรับตัวที่ตั้งโดยความถี่ที่การสังเกต ii ตกลงในใบไม้เดียวกับ 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})|}

ที่ Lb(x)L_b(\mathbf{x}) คือใบไม้ที่มี x\mathbf{x} ในต้นไม้ bb นี่คือมุมมองป่าสุ่มทั่วไป (Athey, Tibshirani และ Wager 2019): ป่าสาเหตุคือ ตัวประมาณเคอร์เนลแบบปรับตัวในเครื่อง มันเรียนรู้แนวคิดของ "คล้ายกัน" เอง กำหนดโดยความร่วมมือที่สำคัญสำหรับความแตกต่างของผลกระทบ ไม่ใช่ระยะห่างแบบยุคลิดในพื้นที่ที่คุณต้องเลือกสเกลด้วยตนเอง

ทฤษฎี asymptotic

ภายใต้เงื่อนไขความสม่ำเสมอ (Wager และ Athey 2018) ตัวประมาณเป็น consistent, τ^(x)pτ(x)\hat{\tau}(\mathbf{x}) \xrightarrow{p} \tau(\mathbf{x}) และ asymptotic ปกติ:

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

ให้ช่วงจุด τ^(x)±zα/2σ^(x)\hat{\tau}(\mathbf{x}) \pm z_{\alpha/2} \cdot \hat{\sigma}(\mathbf{x}) ความแปรปรวน σ^2(x)\hat{\sigma}^2(\mathbf{x}) มาจาก infinitesimal jackknife (หรือ bootstrap-of-little-bags) คำนวณจากโครงสร้าง subsample เดียวกับที่ป่าสร้างไว้แล้ว — ไม่มีวง bootstrap ภายนอก

น่าจะเป็นเฉพาะเจาะจงเกี่ยวกับการรับประกันนี้คืออะไรและไม่ใช่อะไร มันเป็น asymptotic และเป็นจุดๆ และถือสำหรับ CATE ช่วง การพยากรณ์แบบ conformal ที่ใช้ที่อื่นในบล็อกนี้เป็น finite-sample และ free-from-distribution แต่ marginal และครอบผลลัพธ์ Estimand ต่างกัน การรับประกันต่างกัน; พวกมันไม่ใช่ตัวแทน

การเชื่อมต่อ Double Machine Learning

เมื่อการรักษาไม่ได้ถูกกำหนดแบบสุ่ม ป่าสาเหตุ fit บนข้อมูลที่ residualized: โมเดลผลลัพธ์ m^(X)=E[YX]\hat{m}(\mathbf{X}) = \mathbb{E}[Y \mid \mathbf{X}] และโมเดล propensity e^(X)=E[WX]\hat{e}(\mathbf{X}) = \mathbb{E}[W \mid \mathbf{X}] ถูกประมาณโดย cross-fitting และป่าทำงานบน Y~=Ym^\tilde{Y} = Y - \hat{m} กับ W~=We^\tilde{W} = W - \hat{e} ความ orthogonal ของ Neyman คือสิ่งที่ทำให้สิ่งนี้ปลอดภัย: ข้อผิดพลาดของการประมาณ nuisance เข้ามาเฉพาะในฐานะผลคูณ ดังนั้น m^\hat{m} และ e^\hat{e} แต่ละตัวสามารถ converge ที่ n1/4n^{-1/4} และ τ^\hat{\tau} ยัง converge ที่ n1/2n^{-1/2}

เฟรมเวิร์กนี้ — residualization, cross-fitting, อาร์กิวเมนต์ความ orthogonal, ผลกระทบของขนาดตัวอย่าง — เป็นหัวข้อของบทความของมันเอง, Double Machine Learning สำหรับสัญญาณการเทรดเชิงสาเหตุ อ่านมันก่อน; ทุกอย่างด้านล่างถือว่ามันและครอบเฉพาะสิ่งที่เปลี่ยนเมื่อ estimand เป็น τ(x)\tau(\mathbf{x}) แทน τ\tau

แอปพลิเคชันการเทรด: ความแตกต่างของผลกระทบเหตุการณ์

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

การตั้งค่า

โดเมนธรรมชาติสำหรับบล็อกนี้คือจักรวาูลเหรียญ perpetual-futures ที่เหตุการณ์ถี่, มี timestamp และสังเกตได้โดยไม่มี vendor feed

  • หน่วย: การสังเกตเหรียญ-เหตุการณ์ across the tradable perp universe
  • การรักษา: Wi=1W_i = 1 ถ้าเหตุการณ์เกิดขึ้นสำหรับเหรียญ ii — flip เครื่องหมาย funding-rate, spot listing, หรือ cascades of liquidation ที่ข้ามเกณฑ์ supercritical ที่อธิบายใน liquidation cascades as a trading signal — และ Wi=0W_i = 0 สำหรับหน้าต่างที่ไม่ใช่เหตุการณ์ที่ match
  • ผลลัพธ์: YiY_i = ผลตอบแทน ผิดปกติ ในช่วงเหตุการณ์ ไม่ใช่ผลตอบแทนดิบ Fit ตลาดโมเดลบนหน้าต่างการประมาณก่อนเหตุการณ์ แล้วรับผลตอบแทนผิดปกติสะสม สเปคที่แน่นอน — หน้าต่างการประมาณ, regression ของตลาดโมเดล, การสร้าง CAR และ t-statistic — ทำงานในส่วนการศึกษาเหตุการณ์ของ LLM alpha mining จาก earnings calls; ใช้ซ้ำ verbatim ขั้นตอนนี้ไม่ใช้ตัวเลือก: ผลลัพธ์ close-to-close ดิบปล่อยให้การเคลื่อนไหวของตลาดเข้า τ^\hat{\tau} และเนื่องจากการเคลื่อนไหวของตลาดเป็นสายธารร่วมกับหน่วยที่รักษาทั้งหมด มันดูเหมือนผลกระทบการรักษา
  • ความร่วมมือ Xi\mathbf{X}_i: มูลค่าตลาด ความผันผวนที่เกิดขึ้นจริง ประวัติ funding ความลึกของบุ๊ก อัตรา open-interest-to-cap
  • Confounders Wi\mathbf{W}_i: ตัวแปรรีจิมที่เลื่อนทั้งความน่าจะเป็นของเหตุการณ์และผลตอบแทน

สัญญาณการเทรด

พื้นผิว CATE map ไปยัง position sizer แม่นยำเหมือนการประมาณความไม่แน่นอนที่สอบเทียบ: sizing โดย τ^|\hat{\tau}| สัมพัธ์กับความกว้างช่วง และไม่เทรดเมื่อช่วงข้ามศูนย์ กฎการตัดสินใจนี้ — inverse-width sizing, edge ratio e=τ^/we = |\hat{\tau}|/w, ฟิลเตอร์ no-trade, cost-aware variant และอาร์กิวเมนต์ทำไมคุณไม่ควรคูณมันเป็นเศษส่วน Kelly — ได้รับมาใน Conformal Prediction for Risk-Aware Position Sizing ใช้ซ้ำด้วย τ^\hat{\tau} แทน μ^\hat{\mu} และช่วงป่าสาเหตุแทน conformal สมดุลขาทั้งยาวและสั้นและบุ๊กเป็นกลางตลาดโดยการสร้าง

การใช้งาน Python กับ 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

การตีความพื้นผิว CATE

กราฟผลกระทบเชิง margin แสดงว่าผลกระทบการรักษาเคลื่อนที่อย่างไรตามความร่วมมือหนึ่งเมื่อที่เหลือถูกครองที่ median:

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

อ่านสิ่งเหล่านี้เป็นคำอธิบายของพื้นผิวที่ fit ไม่ใช่เป็น curves ปริมาณ-การตอบสนองเชิงสาเหตุ — การถือความร่วมมืออื่นที่ median อาจวางคุณในภูมิภาคของพื้นที่ความร่วมมือที่ไม่มีการสนับสนุน

สมมติฐานสำคัญและการวินิจฉัย

Overlap, balance, hidden-confounding และการตรวจสอบ placebo ประตูเส้นทางสู่การประมาณเชิงสาเหตุที่ปกป้องได้

ละเมิดสิ่งเหล่านี้และคุณจะได้ผลกระทบที่มั่นใจ แม่นยำ ผิด

1. Unconfoundedness (Selection on Observables)

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

การกำหนดการรักษาต้องเป็นอิสระจากผลลัพธ์ที่เป็นไปได้เมื่อมีความร่วมมือที่สังเกต สำหรับเหตุการณ์ที่กำหนดทางกลไกสิ่งนี้ปกป้องได้; สำหรับเหตุการณ์ที่เป็นปฏิกิริยาตลาดเอง — ประกาศ listing, liquidation engine ของ exchange ยิง — ไม่ใช่ เพราะการไหลที่ไม่สังเกตเดียวกันที่ทำให้เหตุการณ์เกิดขึ้นก็เคลื่อนผลตอบแทน

ทดสอบด้วยการวิเคราะห์ความไวของ Rosenbaum: ถ้า UU ที่ไม่สังเกตสามารถเลื่อนอัตราการรักษาได้ถึง factor Γ\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})}

Γ\Gamma ต้องใหญ่แค่ไหนก่อนที่ผลกระทบที่ประมาณจะเปลี่ยนเครื่องหมาย? การออกแบบที่แตกที่ Γ=1.1\Gamma = 1.1 ไม่ใช่การค้นพบ

2. Overlap (Positivity)

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

ทุกหน่วยต้องการความน่าจะเป็นเชิงบวกในการปรากฏในทั้งสองแขนง ตรวจสอบ propensity scores และ 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 ไม่ฟรี — มัน redefine ประชากรที่ τ^\hat{\tau} ของคุณอธิบาย รายงานเศษส่วนที่รอดชีวิต

3. SUTVA (Stable Unit Treatment Value Assumption)

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

การรักษาของหน่วยหนึ่งต้องไม่กระทบผลลัพธ์ของอีกหน่วยหนึ่ง ในคริปโตนี่คืออ่อนที่สุดในสาม: cascade of liquidation ใน perp หนึ่ง propagate ผ่าน collateral ที่ใช้ร่วมกันและ inventory ของ market maker ไปยังคู่ที่ correlate ทุกคู่ซึ่งเป็น interference โดยคำจำกัดความ การรวม standard errors โดยกลุ่มความสัมพันธ์แก้ปัญหาบางส่วน; ไม่มีอะไรแก้ไข้ทั้งหมด

อยู่เหนือการรักษาแบบไบนารี

ป่าสาเหตุขยายไปยัง การรักษาแบบต่อเนื่อง ผ่านเครื่องมือ DML เดียวกัน — ประมาณว่า ขนาด ของ shock ไม่ใช่เฉพาะการเกิดขึ้น เคลื่อนที่สินทรัพย์แตกต่างกัน:

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

ที่ TiT_i คือ, เช่น, ขนาดของการเปลี่ยนแปลง funding-rate ใน basis points ตอนนี้ τ(x)\tau(\mathbf{x}) คือผลกระทบต่อ 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)

ข้อควรพิจารณาเชิงปฏิบัติ

ความแตกต่างเป็นสิ่งจริงหรือ?

นี่คือคำถามที่ป่าสาเหตุตอบและไม่มีอะไรในบล็อกนี้ทำ และสมควรได้รับการทดสอบจริง ไม่ใช่กฎยาว ความซื่อสัตย์ป้องกันการแบ่งที่สุ่มภายในตัวประมาณ; การประเมิน out-of-sample บน เหตุการณ์ ที่ถูกถือ (ไม่ใช่สินทรัพย์ที่ถูกถือ) เป็นมาตรฐานและครอบใน walk-forward optimization และ deflated Sharpe และ multiple testing ไม่มีอะไรบอกคุณว่า τ^(x)\hat{\tau}(\mathbf{x}) แตกต่างกับ x\mathbf{x} อย่างไร

การทดสอบ Best Linear Predictor ทำ ถดถอยผลลัพธ์ที่ residualized บนการรักษาที่ residualized และอินเทอร์แอ็คชันกับการประมาณ CATE ที่ centered:

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

สองสัมประสิทธิ์ตอบคำถามสองอย่างต่างกัน α0\alpha_0 คือผลกระทบเฉลี่ย: มีอะไรที่นี่เลยหรือ? α1\alpha_1 คือความชันของการสอบเทียบในการพยากรณ์ของคุณเอง: เมื่อป่าของคุณบอกว่าผลกระทบใหญ่ขึ้น มันใหญ่ขึ้นจริงหรือ? ภายใต้ null ของไม่มีความแตกต่าง α1=0\alpha_1 = 0 ภายใต้การสอบเทียบสมบูรณ์ α1=1\alpha_1 = 1 α1\alpha_1 มีนัยสำคัญเหนือศูนย์ แต่ไกลจากหนึ่งหมายความว่าป่าพบการจัดลำดับจริง แต่ overstate การกระจาย — คุณสามารถเทรด ranking ไม่ใช่ขนาด

RScorer ของ EconML ให้คะแนนการเลือกโมเดลที่เป็นเพื่อน:

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

Fit scorer บน validation split ที่ป่าไม่เคยเห็น แล้วใช้เปรียบเทียบโมเดล CATE ที่เป็นตัวเลือกกับแต่ละและกับ baseline ของผลกระทบคงที่ ป่าที่ไม่สามารถ beat โมเดลผลกระทบคงที่บน R-score ไม่พบความแตกต่างที่คุ้มเทรด ไม่ว่า importances in-sample จะพูดอะไร

ขนาดตัวอย่าง

ป่าสาเหตุต้องการข้อมูลมากกว่าโมเดลผลลัพธ์เพราะ estimand เป็นความแตกต่างและทั้งสองแขนงต้องถูก populate ภายในทุกใบไม้ วินัยทั่วไปของ data-vs-parameters — กี่จุด out-of-sample ต่อพารามิเตอร์ free และการแก้ไข Bonferroni เมื่อคุณเปรียบเทียบ configurations — อยู่ในส่วนความต้องการข้อมูลของ walk-forward optimization คำตอบเฉพาะของป่าสาเหตุเป็นเชิงประจักษ์ ไม่ใช่กฐินิ้ว: fit ป่าบน nested subsamples และ plot ความกว้างช่วง median กับ nn; ขนาดตัวอย่างที่ใช้ได้อยู่ที่ความกว้างตกต่ำกว่าขนาดผลกระทบที่คุณตั้งใจเทรด

Walk-Forward, พร้อมสองเรื่อง

โปรโตคอลการประเมินคือ walk-forward anchored ปกติ — refit บนเหตุการณ์ทั้งหมดถึง tt, เทรดเหตุการณ์ t+1t+1 — และการรักษาเต็ม รวม purging, embargo, walk-forward efficiency ratio และ degradation rate อยู่ใน walk-forward optimization สองสิ่งเฉพาะสำหรับตัวประมาณนี้

ขั้นแรก หน้าต่างเหตุการณ์ overlap ถ้าหน้าต่างความร่วมมือก่อนเหตุการณ์ t+1t+1 มีหน้าต่างผลลัพธ์ของเหตุการณ์ tt folds ใช้การสังเกตร่วมกันและผลลัพธ์ out-of-sample ถูกปนเปื้อน Purge หน้าต่างที่ overlap ก่อนนับจำนวน PnL เดียว; ด้วยการรักษาที่ถี่ทางกลไกเช่น flip funding สิ่งนี้สามารถลบส่วนสำคัญของเหตุการณ์

ขั้นที่สอง การแบ่งที่ซื่อสัตย์ต้องถูกวาดใหม่ที่ทุก refit การพา partition Isplit\mathcal{I}_{\text{split}}/Iest\mathcal{I}_{\text{est}} เดียวกัน across folds reintroduce การรั่วไหลของการเลือกโครงสร้างเดียวกับที่ความซื่อสัตย์มีอยู่เพื่อป้องกัน เพราะเหตุการณ์ที่เพิ่มใหม่ลงใน partition ที่ถูกเลือกด้วยความรู้ของตัวเก่า

จากนั้นรัน PnL out-of-sample ระดับเหตุการณ์ผ่านประตูปกติ — PBO และ deflated Sharpe ratio — ก่อนเชื่อสิ่งใด

ต้นทุน

สัญญาณ CATE ถูกกำหนดราคาเหมือนสัญญาณที่ขับเคลื่อนโดยเหตุการณ์อื่น: ลบ half-spread ที่คาดหวังจาก τ^|\hat{\tau}| ก่อนฟิลเตอร์ no-trade และ size down ในบุ๊กบาง เวอร์ชันเชิงปริมาณ — กฎการกระทบรากที่สองและ cost curves ที่ fit ใน slippage cost models, ฟิลเตอร์ no-trade ที่รับรู้ต้นทุนใน conformal prediction และการบัญชีการดำเนินการใน implementation shortfall และ TCA — ทั้งหมดถ่ายโอนไม่เปลี่ยนแปลง

สิ่งเดียวที่ไม่ถ่ายโอน: shelf-life ของสัญญาณ CATE ถูกจำกัดโดยหน้าต่างเหตุการณ์ ดังนั้นต้นทุนถูก amortize ไปยังระยะเวลาการถือครองสั้นตายตัว แทนที่จะเปิดกว้าง สัญญาณที่ถืออย่างต่อเนื่องจ่าย spread ครั้งและได้รับระหว่างที่ edge persist; นี่จ่ายทุกเหตุการณ์ edge รอดไหมเป็นคำถามเชิงประจักษ์เกี่ยวกับเหตุการณ์เฉพาะและจักรวาลเฉพาะของคุณ และเป็นสิ่งแรกที่ต้องตรวจสอบ เพราะมันสามารถฆ่ากลยุทธ์ก่อนที่เครื่องมือสาเหตุจะสำคัญ

บทสรุป

ป่าสาเหตุประมาณวัตถุที่แตกต่างจาก toolkit อื่นของบล็อกนี้ ไม่ใช่ "สินทรัพย์นี้จะคืนอะไร" แต่ "เหตุการณ์นี้เคลื่อนสินทรัพย์นี้มากเท่าไหร่ สัมพัธ์กับค่าต้านที่มันไม่ยิง" เครื่องมือที่ทำให้สิ่งนี้ประมาณได้ — การแบ่งที่ขยายความแตกต่าง การประมาณที่ซื่อสัตย์ การแสดงถึงน้ำหนักเคอร์เนลแบบปรับตัว และช่วง infinitesimal-jackknife — ไม่มีอะนาล็อกในการเรียนรู้แบบมีผู้สอนธรรมดา และสมมติฐานที่ต้องการ (unconfoundedness, overlap, SUTVA) แข็งแรงพอที่จะต้องถูกทดสอบ ไม่ใช่ยืนยัน

สิ่งที่บทความนี้ไม่มีคือผลลัพธ์ ทุกตัวเลขข้างบนเป็นตัวยึดตำแหน่ง กับมาตรฐานที่ตั้งโดย negative ที่ซื่อสัตย์ และ deflated Sharpe วิธีที่ไม่มีการกระจาย CATE ที่วัด BLP α1\alpha_1 กับ p-value, การวินิจฉัย overlap และ PnL out-of-sample ที่ประตูโดย DSR/PBO เป็น tutorial ไม่ใช่การค้นพบ ตัวเลขเหล่านี้คืองานถัดไป; ผลลัพธ์เชิงลบค่าการเผยแพร่

อ้างอิง

  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
ข้อจำกัดความรับผิดชอบ: ข้อมูลที่ให้ไว้ในบทความนี้มีไว้เพื่อการศึกษาและให้ข้อมูลเท่านั้น และไม่ถือเป็นคำแนะนำทางการเงิน การลงทุน หรือการเทรด การเทรดสกุลเงินดิจิทัลมีความเสี่ยงสูงที่จะขาดทุน

ผู้เขียน

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 เฉพาะ การวิเคราะห์ตลาด และการอัปเดตแพลตฟอร์ม

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