取引における不均一処置効果のための因果関係フォレスト
このブログのすべての予測モデルは、同じオブジェクトクトを推定します:条件付き平均 。特徴量エンジニアリング、勾配ブースティング、適合区間、ウォークフォワード検証 — すべてが1つの推定量に仕えています。この記事は異なる推定量と、それを交換したときに変わる道具についてです。
オブジェクトは条件付き平均処置効果です:
同じ単位の2つの潜在的結果の違い — そのうち1つは観測しません。あなたはそれに対して回帰できません、なぜならそれはあなたのデータにないからです。因果フォレスト(AtheyとImbens 2016; WagerとAthey 2018)は非パラメトリックにそれを推定し、驚くべきことに、その周囲の有効な信頼区間を提供します。
3つのことがこれを可能にし、そのうちのいずれも標準のランダムフォレストには存在しません:予測誤差を最小化するのではなく処置効果の分散を最大化する分割基準、分割を選択してその中の効果を推定するために同じ観測値を使用することを禁止する誠実さ制約、および葉の共存を推定重みに変える適応型カーネルとしてのフォレストの再読み込み。これら3つに加えて、あなたが見つけた不均一性がシグナルであるかどうかを伝える較正テストが、この記事の内容です。
平均効果から不均一効果へ

平均処置効果
セットアップ:バイナリ処置 (イベントが発生したかどうか)、結果 (リターン)、共変量 。平均処置効果は
すべての単位の平均影響。トレードについては、これはほとんど役に立ちません — あなたは平均をトレードしません。イベントが宇宙の半分を押し上げ、半分を押し下げる場合、ATEはゼロで機会は最大です。
条件付き平均処置効果
CATE $\tau(\mathbf{x})` は特性を条件としています。特定の市場時価総額、実現ボラティリティ、資金履歴、オーダーブック深さを持つコインについて、このイベントがこの資産に与える期待リターン影響は何ですか?CATEは共変量空間上の関数であり、その形状を強要することなくその関数を推定することが、因果フォレストが行うことです。
線形相互作用モデルだけを使用しないのはなぜですか?
教科書の代替は飽和回帰です:
ここで $\gamma` は相互作用を持ちます。これは相互作用が線形であると仮定します。それは稀です:資金反転の感度はレバレッジに対して凸であり、線形ではありません;深さは市場時価総額と乗算的に相互作用します;ボラティリティレジームは他のすべてを制御します。因果フォレストはこれらのいずれも強要しません — それらは適応的に共変量空間を分割し、不均一性構造をデータから脱落させます。
因果フォレスト:アルゴリズム

因果フォレストは、処置効果推定量の周りに再構築されたランダムフォレストです。各ツリーは、処置効果の不均一性を最大化するために共変量空間を分割する因果ツリーです。
因果ツリー
各内部ノードで、アルゴリズムは分割変数 と分割点 を選択します。回帰ツリーとの主な違い:基準は、二乗予測誤差を最小化するのではなく、子間の推定処置効果の分散を最大化します。
データ を持つノードの場合、ノードレベルの効果推定値はグループ平均の差です:
および分割スコアは
YW$ の動作に対して直交する共変量は選択されません。
正直な推定
重要な革新は誠実さです。ツリー構造を決定するために使用されるデータは、葉効果を推定するために使用されるデータから分離している必要があります:
- データを分割 \mathcal{I}_{\text{est}}$ に
- ツリーを構築 分割変数と点を選択するために のみを使用
- 葉効果を推定 のみを使用し、それらの観測値をすでに固定されたツリーにドロップする
これなしでは、ツリーは不正を働きます:それは、極端な効果がノイズである葉を彫刻し、そのノイズを推定値として報告します。これは、バックテスト過剰適合の確率 が戦略レベルで測定する同じ適応選択失敗です(ただし、ここでは事後に診断されるのではなく、推定量内で防御されます)。誠実さは漸近的不偏性を購入します:
価格はサンプル効率です — データの半分が構造を構築し、その後それを埋めるために使用できません。
ツリーからフォレストへ
因果フォレストは、各分割でランダムな共変量サブセットを持つサイズ のランダムサブサンプル上の 個の因果ツリーを集約します:
これを書く最も有用な方法は、結果の加重平均としてです:
適応型重みは、観測 が と同じ葉に着地する頻度によって設定されます:
ここで b で $\mathbf{x} を含む葉です。これは一般化ランダムフォレストビュー(Athey、Tibshirani、Wager 2019)です:因果フォレストは局所適応型カーネル推定量です。それは、ユークリッド距離ではなく、効果の不均一性に実際に重要な共変量によって定義される「類似」の独自の概念を学習します。
漸近理論
正則性条件下(WagerとAthey 2018)で、推定量は一貫しており、$\hat{\tau}(\mathbf{x}) \xrightarrow{p} \tau(\mathbf{x})`、漸近的に正規です:
点ごとの区間 を与えます。分散 $\hat{\sigma}^2(\mathbf{x})` は無限小ジャックナイフ(またはbootstrap-of-little-bags)から来ており、フォレストがすでに構築したのと同じサブサンプル構造から計算されます — 外部のブートストラップループはありません。
この保証が何であるか、何でないかについて正確である価値があります。それは漸近的および点ごとであり、CATEに対して有効です。このブログの他の場所で使用される適合予測区間は有限サンプルで分布に依存しませんが、周辺であり、結果をカバーします。推定量が異なり、保証が異なります。それらは代替品ではありません。
ダブル機械学習接続
処置がランダムに割り当てられていない場合、因果フォレストは残差化されたデータに適合されます:結果モデル と傾向モデル \tilde{Y} = Y - \hat{m}\tilde{W} = W - \hat{e}\hat{m}\hat{e}n^{-1/4}\hat{\tau}n^{-1/2}$ で収束します。
そのフレームワーク — 残差化、交差検証、直交性引数、サンプルサイズへの影響 — は独自の記事の主題、因果トレードシグナルのためのダブル機械学習です。最初に読んでください;以下のすべてはそれを想定し、推定量が の代わりに $\tau(\mathbf{x})` であるときに何が変わるかのみをカバーします。
トレードアプリケーション:イベント影響の不均一性

セットアップ
このブログの自然なドメインは、イベントが頻繁で、タイムスタンプが押され、ベンダーフィードなしで観察可能な無期限先物コイン宇宙です。
- 単位:トレード可能なperp宇宙全体のコインイベント観測
- 処置:iW_i = 0`
- 結果: = イベントウィンドウ中の異常なリターン、生のリターンではありません。イベントの前に推定ウィンドウで市場モデルを適合させ、その後累積異常リターンを取得します。正確な仕様 — 推定ウィンドウ、市場モデル回帰、CAR構築およびそのt統計 — はearningsコールからのLLMアルファマイニングのイベントスタディセクションで作業されています;そのまま再利用してください。このステップはオプションではありません:生のclose-to-close結果は市場全体の動きが に入ることを許し、市場の動きがすべての処置単位に共通であるため、それは処置効果とまったく同じように見えるからです
- 共変量 :市場時価総額、実現ボラティリティ、資金履歴、オーダーブック深さ、オープンインタレスト対キャップ比率
- 交絡因子 :イベント確率とリターンの両方をシフトするレジーム変数
トレードシグナル
CATE表面は、キャリブレーションされた不確実性推定とまったく同じようにポジションサイザーにマッピングされます: を区間幅に対してサイジングし、区間がゼロをまたぐときはトレードしません。その決定ルール — 逆幅サイジング、エッジ比率 、ノートレードフィルター、コスト意識バリアント、およびそれをケリー分数に乗算すべきでないという引数 — はリスク意識ポジションサイジングのための適合予測で導出されています。\hat{\tau}` を、適合の代わりに因果フォレスト区間を使用して再利用してください。ロング脚とショート脚をバランスさせると、ブックは構成によって市場中立です。
EconMLによるPython実装
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表面の解釈
限界効果プロットは、残りを中央値に保持したまま、1つの共変量に沿って処置効果がどのように移動するかを示します:
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
これらは適合された表面の説明として読んでください、因果線量反応曲線としてではありません — 他の共変量を中央値に保つと、サポートのない共変量空間の領域に配置される可能性があります。
重要な仮定と診断

これらに違反すると、自信過剰で、正確で、間違った効果が得られます。
1. 非交絡(観測可能量による選択)
処置の割り当ては、観察された共変量を条件として潜在的結果から独立している必要があります。機械的に定義されたイベントについては防御可能です。それ自体が市場反応であるイベント — 上場発表、取引所独自の清算エンジンの発火 — については、イベントを引き起こしたのと同じ観察されないフローがリターンも移動させるため、そうではありません。
ローゼンバウム感度分析でテストしてください:観察されない が処置の確率を係数 までシフトできる場合、
推定効果が符号を反転する前に、\Gamma = 1.1` で壊れるデザインは発見ではありません。
2. オーバーラップ(正値性)
すべての単位は、両方の腕に現れる正の確率が必要です。傾向スコアを確認してトリミングしてください:
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%}")
トリミングは無料ではありません — あなたの が記述する母集団を再定義します。生存した割合を報告してください。
3. SUTVA(安定単位処置値仮定)
1つの単位の処置は、別の単位の結果に影響してはなりません。暗号通貨では、これが3つの中で最も弱いです:1つのperpの清算カスケードは、共有担保とマーケットメイカーの在庫を通じてすべての相関ペアに伝播し、それは定義上干渉です。相関グループごとに標準エラーをクラスタリングすると部分的に対処します;何も完全には対処しません。
バイナリ処置を超えて
因果フォレストは、同じDML機械を通じて連続処置に拡張されます — ショックの大きさが、単にその発生だけでなく、資産を異常に移動する方法を見積もり:
ここで は、たとえば、ベーシスポイントでの資金レート変更のサイズです。今や $\tau(\mathbf{x})` はベーシスポイントごとの効果です。
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)
実用的な考慮事項
不均一性は本物ですか?
これは因果フォレストが答え、このブログの他は何も答えない質問であり、経験則ではなく実際のテストに値します。誠実さは推定量内の偽の分割から保護します;保持されたイベント(保持された資産ではなく)のサンプル外評価は標準であり、ウォークフォワード最適化とデフレートシャープと多重検定でカバーされています。どれも \mathbf{x}` とどのように変化するかは伝えません。
最良線形予測子テストがそれを行います。残差化された結果を残差化された処置に、また平均化されたCATE推定値との相互作用に対して回帰してください:
2つの係数は2つの異なる質問に答えます。\alpha_1 は独自の予測に対する較正勾配です:フォレストが効果が大きいと言うとき、それは実際に大きいですか?不均一性がないという帰無の下で $\alpha_1 = 0 です。完全な較正の下で \alpha_1` がゼロより有意に高いが1よりはるかに低い場合、フォレストは真の順序を見つけたが、その広がりを誇張していることを意味します — あなたは順位をトレードできますが、大きさはトレードできません。
EconMLの RScorer は同伴のモデル選択スコアを提供します:
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}")
フォレストが見たことのない検証分割でスコアラーを適合させ、その後候補CATEモデルを互いにおよび一定効果ベースラインと比較するために使用してください。Rスコアで一定効果モデルを破れないフォレストは、サンプル内の重要度が何を言っても、トレードする価値のある不均一性を見つけていません。
サンプルサイズ
因果フォレストは結果モデルよりも多くのデータを必要とします。なぜなら、推定量は差であり、両方の腕がすべての葉の中に住んでいる必要があるからです。一般的なデータ対パラメータ規律 — 自由パラメータあたりのサンプル外ポイントの数、および構成を比較した後のボンフェローニ補正 — はウォークフォワード最適化のデータ要件セクションにあります。因果フォレスト固有の回答は経験的であり、経験則ではありません:フォレストをネストされたサブサンプルに適合させ、中央値区間幅を $n` に対してプロットしてください;使用可能なサンプルサイズは、幅がトレードする意図する効果サイズ以下になる場所です。
ウォークフォワード、2つの微妙な違い付き
評価プロトコルは通常のアンカー付きウォークフォワードです — t+1` をトレード — そして完全な処置(パージング、エンバーゴ、ウォークフォワード効率比率、劣化率を含む)はウォークフォワード最適化にあります。この推定量に固有の2つのことがあります。
まず、イベントウィンドウが重なります。イベント の前の共変量ウィンドウがイベント の結果ウィンドウを含む場合、フォールドは観測値を共有し、サンプル外結果は汚染されます。単一のPnL数字を数える前に重複するウィンドウをパージしてください;資金反転のような機械的に頻繁な処置では、これはイベントの実質的な部分を削除する可能性があります。
次に、正直な分割はすべての再適合で再描画する必要があります。同じ / 分割をフォールド全体に持ち込むと、誠実さが存在するのを防ぐ構造選択の漏れが正確に再導入されます。なぜなら、新しく追加されたイベントは、古いものの知識を持って選択された分割に着地するからです。
その後、PBOおよびデフレートシャープ比率を通じて、イベントレベルのサンプル外PnLを実行してください — 何かを信じる前に。
コスト
CATEシグナルは、他のイベント駆動型シグナルと同じように価格設定されます:ノートレードフィルターの前に から予想される半スプレッドを差し引き、薄い本でサイジングを下げてください。定量的バージョン — スリッページコストモデルの平方根影響法則と適合コスト曲線、適合予測のコスト意識ノートレードフィルター、および実装ショートフォールとTCAの実行会計 — すべて変更なしで転送されます。
転送されない唯一のもの:CATEシグナルの寿命はイベントウィンドウによって制限されるため、コストは開かれた期間ではなく固定された短期間保持期間にわたって償却されます。継続的に保持されたシグナルはスプレッドを1回支払い、エッジが持続する間稼ぎます;これはすべてのイベントでそれを支払います。エッジがこれを生き残るかどうかは、あなたの特定のイベントと特定の宇宙に関する実証的な質問であり、これが最初に確認することです。なぜなら、因果機械が重要になる前に戦略を殺す可能性があるからです。
結論
因果フォレストは、このブログのツールキットの残りの部分とは異なるオブジェクトクトを推定します。「この資産は何を返すか」ではなく、「このイベントが発火しなかった反事実と比較して、この資産をどれくらい移動させたか」です。これを推定可能にする道具 — 不均一性最大化分割、正直な推定、適応型カーネル重み表現、および無限小ジャックナイフ区間 — は通常の教師あり学習には類推がなく、必要とする仮定(非交絡、オーバーラップ、SUTVA)は、主張するよりもテストする必要があるほど十分に強力です。
この記事にないものは結果です。上記のすべての数字はプレースホルダーです。正直なネガティブおよびデフレートシャープによって設定された基準に対して、測定されたCATE分布、p値を持つBLP 、オーバーラップ診断、およびDSR/PBOゲート付きサンプル外PnLを持たない方法は、チュートリアルであり、発見ではありません。それらの数字が次の仕事です;否定的な結果は公開する価値があります。
参考文献
- 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
Authors
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.