ダブルマシンラーニング:リターンを予測する代わりに因果パラメータを推定する
このブログのこれまでのモデリング記事はすべて同じ形式の問いを立ててきました:特徴量を与えられて数値を予測し、その予測がサンプル外でも生き残ることを検証する。スプレッドモデルはスプレッドを予測し、フィルモデルは約定確率を予測する。検証の全装置 — パージド・ウォークフォワード、デフレート済みシャープ、ルックアヘッド分類 — は予測が本物かどうかをチェックするために存在します。
この記事は異なる形式の問いを立てており、これはブログがこれまで持っていなかった唯一の装置です:因果的解釈を持つ単一のスカラーパラメータを推定し、そこに至るために柔軟なMLモデルが使用されたという事実を生き延びる標準误差を添える。
これは修辞上の区別ではありません。「キュー位置が約定確率を予測する」は自明に真であり、操作的には無意味です — もちろんそうですが、両方とも深さとボラティリティによって駆動されています。「キューで1つ前に進むことが引き起こす約定確率のの変化、市場状態を一定に保つ」は、オーダー配置ポリシーに入れることができる数です。前者は回帰フィッティングです。後者には、標準のMLツールボックスには存在しない推定量が必要です。なぜなら、柔軟な第1段階での正則化と過学習は、あなたが気にする係数を正確にバイアスするからです。
ダブルマシンラーニング(Chernozhukov、Chetverikov、Demirer、Duflo、Hansen、Newey & Robins、2018)は、これを修正する推定量です。すべての定量トレーダーはこれを聞いたことがあります:相関は因果ではない。DMLはその文の後の部分です。
ナイーブ回帰が失敗する理由

ブログ独自の領域で問いを設定しましょう。私たちは約定確率に対するキュー位置の因果的効果を望みます:
- :観測での休止中の指値注文がホライズン内で約定したか。
- :配置時のキュー位置(レベルサイズで正規化)。
- :交絡因子 — 実現ボラティリティ、引用スプレッド、深さ不均衡、レベルサイズ、時刻、レジームラベル。これらは、ブログがスプレッドモデリングとマシンラーニングですでに計算している市場状態変数です。
因果パラメータは以下のです:
ここで、は、市場状態と約定結果の間の(潜在的に複雑で非線形な)関係を捉えます。
処置は無作為に割り当てられていません。あなたはキューの前方にいるのはなぜならレベルが薄かったから、あるいは穏やかな期間に投稿したから、あるいは帳簿があなたに有利なように不均衡だったからです。同じ条件が独立的にあなたが約定するかどうかを駆動します。これが交絡です。
アプローチ1:交絡因子を無視する。 をだけで回帰する。推定値は、両方と相関するすべての交絡因子の効果を吸収します。教科書的な omitted variable bias:薄いレベルは良いキュー枠と高い約定率の両方を与えるので、枠自体の価値を過大評価します。
アプローチ2:コントロール付き線形回帰。 をとで回帰する。これはが真に線形の場合にのみ機能します。帳簿のダイナミクスはそうではありません — 約定/ボラティリティ関係には閾値があり、深さ不均衡効果はレジームによって符号を反転します。の誤った特定はバイアスを再導入します。
アプローチ3:ML予測。 で勾配ブーストモデルを適合させる。優れたサンプル外判別を得ますが、因果的解釈は全くありません。モデルは予測的なすべてのパターンを捉えます。因果的かどうかに関わらず;正則化はをバイアスする方法で処置の寄与を縮小します;そして信頼できる標準误差はありません。
これが核心的な緊張関係です。MLは予測には優れていますが、因果パラメータへのナイーブな適用は、バイアスがあり、非正規で、信頼できない推定値を生成します。
部分的に線形なモデル

DMLは構造的フレームワーク内で動作します。主力は**部分的に線形な回帰(PLR)**です:
- は関心のある因果パラメータです。
- は nuisance関数 — 市場状態によって説明される結果の部分。
- は別のnuisance関数 — 市場状態を与えたときの処置の条件付き期待値(連続処置設定での「propensity」)。
- とは構造的残差です。
重要な洞察:は低次元ですが、とは任意に複雑になる可能性があります。MLにnuisance関数を処理させながら、スカラーで有効な推論を提供することを望みます。
なぜ「ダブル」なのか?
2つのMLモデル、1つではありません:
- 結果モデル: — 市場状態だけから結果を予測する。
- 処置モデル: — 市場状態だけから処置を予測する。
残差を形成する
そして、をに回帰してを推定する:
これはステロイドを投与されたFrisch-Waugh-Lovellです:線形射影ではなくMLで交絡因子をpartial-outし、残差変動から処置効果を読み取ります。
Neyman直交性:なぜ機能するのか
ナイーブなpartial-outアプローチ(を推定し、引き、回帰する)は、のML推定誤差がに直接伝播するため失敗します。DMLスコアはNeyman直交になるように構築されています — nuisance関数の小さな摂動に鈍感です。
PLRの直交スコア:
ここで、。直交条件は
直感的には、スコアはから独立したとの変動のみを使用し、1つのnuisance関数の誤差はもう一方によって相殺されます。もしが処置をわずかに過大予測する場合、はわずかに小さすぎますが、の誤推定に由来するの対応する誤差は補償方向に押し込みます。バイアスは第2次になります — 2つの第1段階誤差の積 — 第1次ではなく。
形式的には、両方のnuisance推定量がのレートで収束する場合(穏やか;ほとんどの妥当なML手法が満たします)、次のようになります:
したがって、はパラメトリックレートで収束し、漸近的に正規です。
交差検証:なぜここで必須なのか
直交性だけでは不十分です。nuisanceモデルがの推定に使用されたのと同じ行で適合されている場合、第1段階の過学習が第2段階を汚染します — そしてこの特定の害は正確に述べる価値があります。なぜなら、それはあなたが慣れている害ではないからです。他の場所では、過学習は膨らんだ検証スコアとして現れます:あなたはそれに気づき、割り引いて、進みます。ここでは、のズレた点推定として現れ、信頼区間はまだ狭く、間違った数値を中心にしています。疑うべきスコアはありません。推定量はただ静かに嘘をつきます。
交差検証は依存関係を断ち切ります:各観測のnuisance予測は、それなしでトレーニングされたモデルから来ており、はプールされたheld-out残差から推定されます。メカニクスは普通のK-fold機械で、スプレッドモデリングとマシンラーニングで扱われています;以下で重要なのは、どのfoldを渡すかです。
DMLアルゴリズム ステップバイステップ
入力:データ、MLメソッドと、fold 。
ステップ1 — 分割:をの互いに素なfoldに分割する。
ステップ2 — 交差適合nuisanceモデル:について、fold の補集合でとをトレーニングし、についてとを計算する。
ステップ3 — 推定:
ステップ4 — 推論:
区間付き。
信頼区間は正確に1つの問いに対して有効
これが、DML結果が価値があるかどうかを決定する警告であり、メソッドのほとんどの応用的使用が静かに崩れる場所です。
上記の漸近的正規性は、1つの事前に指定された処置、1つの事前に指定された交絡因子セット、1つの事前に指定されたスコアについてのステートメントです。これらを事前に固定し、推定量を1回実行し、区間はそれが言うことを意味します。3つの候補処置、または4つの交絡因子セット、またはp値が良く見えるまでlearnerを交換し、推論を行っていません — 検索を実行しており、報告されたp値は最大値のp値であり、抽出のものではありません。
ブログはすでにこれが何をするかを測定しました。デフレート済みシャープ比研究では、真のエッジがゼロの純粋なノイズに対する検索は、1.000のナイーブな偽発見率を生成します — 未調整のテストは毎回発火します — 一方、勝者の中央値ナイーブp値は0.0007付近に座ります。Neyman直交性について何もこれからあなたを守りません。直交性はnuisance推定からのバイアスを修正します;仕様検索からのバイアスについては何も言いません。6つの仕様を試した後に得られた1e-05のDML p値は、グリッドから抽出された他の勝者とまったく同じBonferroni/Holm/BHY処理に値し、を実際に実行した仕様の数に設定します。
これはツールの便利機能に直接的な実用的影響があります。DoubleMLDataはd_colsのリストを受け入れ、喜んで1つの要約テーブルに3つの処置効果を返します:
dml_data_multi = dml.DoubleMLData(
df, y_col='filled', d_cols=['queue_pos', 'toxicity', 'spread_at_post'],
x_cols=confounder_cols,
)
3行、3つのp値、そして要約テーブルが言及しない多重検定問題。すべて3つを読む場合は、すべて3つを調整してください。1つだけが事前登録された質問である場合は、そうと言い、他の2つを明示的に探索的として扱ってください。
時系列での交差検証:パージ、エンバーゴ、カスタムFold

標準的なDMLはi.i.d.観測を仮定します。帳簿データはそうではなく、失敗モードはブログがすでに詳細に文書化したものです:隣接する行は重なり合う先読みウィンドウを共有するため、普通のTimeSeriesSplitは依然としてfold境界を越えて回答をリークします。パージされ、エンバーゴされたウォークフォワード実装についてはスプレッドモデリングとマシンラーニング、および少なくともhorizon行のギャップが必要な理由、およびすべてのリークとその測定された大きさの完全なカタログについてはルックアヘッドバイアス分類を参照してください。
真にDML固有の部分は、パージされたfoldを推定量に渡す方法です。なぜなら、set_sample_splittingは人々を躓かせる契約があるからです:
import numpy as np
import doubleml as dml
def purged_folds(n: int, n_splits: int, horizon: int):
"""`horizon`行のパージ/エンバーゴギャップを持つ拡張ウィンドウfold。
スプレッドモデリング記事のパージされたウォークフォワードCVと同じ構造:
ギャップはトレーニング行の先読みウィンドウと検証行の間の
重なりを除去します。
"""
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()
注意すべき2つのこと、どちらもライブラリドキュメントからは明らかではありません:
- パージされたウォークフォワードfoldはすべての行をカバーしません。 パージギャップと初期トレーニングブロックは誰のテストfoldでもないため、は厳密に未満の残差から推定されます。これは正しい動作であり、バグではありませんが、分散式の有効なはプールされたテスト行の数であることを意味します — 仮定するのではなく確認してください。
n_rep反復はここでは無料ではありません。 ランダムKフォールドの場合、交差検証を繰り返して平均化することは安価な分散削減です。決定論的な時順分割では分割が1つしかないため、n_repは何も買わず、何も隠しません;安定性は代わりに異なるデータウィンドウで再実行することから来る必要があります。
パネル構造(同じ期間の多くのシンボル)の場合、DoubleMLはクラスタロバスト標準误差をサポートします — シンボルでクラスタし、時刻ではありません。いつクロスインストルメント結果が実際に確立されるかについては、ブログの立场についてはマルチシンボル検証を参照してください。
測定されたケース:キューポジションと約定確率

これは、プロジェクトがすでにデータを持っている記事の唯一の因果的な質問であり、提起されるものではなく実行されるべきものです。キューポジション分析はすでに実際の帳簿データでの位置推定、FIFOメカニクス、ドレインレートと時間-から-フィルまでをカバーしています;フィルシミュレーションは、約定確率モデリングとライブフィルに対する較正ループをカバーしています。両方ともフィルの予測モデルを生成します。DMLは同じ入力を因果推定に変えます。
推定を見る前に事前登録された仕様:
- 結果 :
HORIZONスナップショット内で約定(バイナリ)。 - 処置 :配置時の正規化されたキューポジション。
- 交絡因子 :1秒実現ボラティリティ、bpsでの引用スプレッド、深さ不均衡、投稿時のレベルサイズ、ティックでのmidからの距離、時刻エンコーディング、レジームラベル。
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)
報告する結果は、単一の係数ではなく4列の比較です:のみののナイーブOLS推定、とのの線形制御推定、標準误差付きのDML推定、および感度分析からのロバストネス値 — 効果を無効にするために未観測の交絡因子がどれほど強力である必要があるか。ナイーブ列とDML列の間のギャップが真の関心のある量です:それは、キューポジションの見かけの価値のどれだけが市場状態の変装だったかです。
ここでのがゼロまたは負であることは発表可能な結果であり、きれいな正の結果よりもこのブログに適合します。ボラティリティとレベルサイズが部分的に除去されると、キューポジションの因果効果が崩壊する場合、それはオーダー配置ポリシーについての直接的な発見です:枠を獲得しているのは位置ではなく、枠を得た条件です。
因果ファクター分析
ファクター投資の標準的なアプローチは連想的です:特性でソートし、ロングショートポートフォリオを形成し、リターンが異なることを観察します。DMLは異なるテストを可能にします — リターンに対する特性の直接的な因果効果を推定し、他の特性の交絡効果を除去します。DMLで効果が消失する場合、ファクターは独立的に因果的ではありません;プロキシです。
これは、ファクター懐疑主義の2番目の独立した形式であり、ブログがすでに公開しているものとどのように関連しているかを明示する価値があります。デフレート済みシャープ比は、ファクターズーを選択側から攻撃します:十分な試行があれば、ファクターは何度も見たからというだけで重要に見える可能性があります。DMLは交絡側から攻撃します:ファクターは1つの正直なテストで重要に見えても、条件付けセットの他の何かのプロキシのまま可能性があります。ファクターが興味深いものであるためには両方を生き残る必要があり、2つの失敗モードは独立です — 1つをパスしてもう一方について何もわかりません。
DMLができないこと
-
交絡因子が観察される必要があります。 未観測の変数が処置と結果の両方を駆動する場合、DMLはバイアスされており、どのようなML洗練さも識別問題を修正しません。感度分析はリスクを境界付けます;除去しません。
-
平均効果を推定します。 レジーム全体でキューポジションの効果が鋭く異なる場合、点推定はサンプルのレジーム混合の平均です。不均一性にはInteractive Regression Model(
DoubleMLIRM)または因果フォレストを使用してください。 -
構造モデルを仮定します。 部分的に線形な仕様は、処置が特定の方法で結果方程式に入ることを必要とします。真のプロセスが根本的に異なる場合、DMLは自信を持って間違っています。
-
因果構造を発見しません。 DMLは事前に指定された処置の効果を推定します。どの変数が原因であるかは教えてくれません。
-
多重検定から免除しません。 これは最も頻繁にスキップされるため、上記の点を繰り返します:直交性はnuisance推定をデバイアスしますが、仕様検索はデバイアスしません。
実用的なノート
サンプルサイズ。 DMLは、nuisanceモデルがで収束することを必要とします。これは実践的に、MLモデルがとをまったく近似するのに十分な行があることを意味します。整数の閾値を信頼する代わりに、マルチシンボル検証が行うように経験的に妥当性を確立してください — 推定がインストゥルメントとサブピリオード全体で保持するかどうかを確認し、不安定性をそれが示すシグナルとして扱ってください。
Learnerの選択。 DML固有の事実は狭いですが有用です:収束が与えられると、learnerはの効率性(区間幅)に影響しますが、その整合性には影響しません。表形式の市場データで到達する価值のあるlearner、およびなぜ勾配ブースティングがデフォルトであるかは、すでにスプレッドモデリングとマシンラーニングでカバーされています。もしがlearner間で実質的に移動する場合、それは選択メニューではなく — nuisance関数が不適切に推定されている証拠であり、上記のセクションによると、最も友好的なものを選択すると、演習が検索に変わります。
結論
DMLは、ブログにまだなかったものを与えます:優れた検証スコアを持つ予測としてではなく、防御可能な標準误差を持つ因果パラメータとして市場マイクロストラクチャの主張を表明する方法。
荷重を持つ3つのアイデアは:
- スコアを直交化して、第1段階の誤差が第2次で相殺されるようにします。
- 時系列データでパージされ、エンバーゴされたfoldで交差適合して、第1段階の過学習がをシフトできないようにします。
- 事前に指定して、報告する区間が実際に獲得した区間であるようにします。
推定量は簡単な部分です。難しい部分は変わらずです:どの交絡因子が重要かを決定し、識別仮説が成立すると論じ、仕様をもう一度実行する衝動に抵抗すること。
参考文献
DMLの系譜は短く、1行の価値があります:これは、MLがカーネル推定量を置き換えたRobinson(1988)の部分的に線形なモデルであり、セミパラメトリック効率境界を達成し、NeymanのC()テストに由来する直交条件とターゲット学習(TMLE)文献の近い従兄弟を持っています。Chernozhukov et al.の貢献は、任意のML learnerでこれを運用化しながら、-整合で漸近的に正規な推論を維持できることを示すことでした。
- 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.
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.