더블 머신 러닝: 수익률 예측 대신 인과 파라미터 추정
이 블로그의 모든 모델링 기사는 지금까지 동일한 형태의 질문을 제기했습니다: 특성을 주면 숫자를 예측한 다음, 예측이 샘플 외에서도 유지되는지 검증합니다. 스프레드 모델은 스프레드를 예측하고, 채움 모델은 채움 확률을 예측합니다. 전체 검증 장치 — 제거된 워크포워드, 수축된 샤프, lookahead 분류 —는 예측이 실제인지 확인하기 위해 존재합니다.
이 기사는 다른 형태의 질문을 제기하며, 이것이 블로그가 갖고 있지 않았던 유일한 장치입니다: 인과적 해석을 가진 단일 스칼라 파라미터를 추정하고, 유연한 ML 모델을 사용하여 그곳에 도달했다는 사실을 견디는 표준 오차를 부착합니다.
이것은 수사적 구별이 아닙니다. "대기열 위치가 채움 확률을 예측한다"는 것은 사소하게 참이며 작동적으로 무용합니다 — 당연한 것입니다, 둘 모두 깊이와 변동성에 의해 좌우되기 때문입니다. "대기열에서 한 위치 앞으로 이동하는 것이초래하는채움 확률의 변화, 시장 상태를 고정 상태로 유지"는 주문 배치 정책에 넣을 수 있는 숫자입니다. 전자는 회귀 피팅입니다. 후자는 표준 ML 도구 상자에 존재하지 않는 추정량이 필요합니다. 유연한 1단계에서 정규화와 과적합이 당신이 관심 있는 계수를 정확히 편향시키기 때문입니다.
더블 머신 러닝(Chernozhukov, Chetverikov, Demirer, Duflo, Hansen, Newey & Robins, 2018)은 이것을 수정하는 추정량입니다. 모든 정량 트레이더는 이것을 들었습니다: 상관관계는 인과관계가 아닙니다. DML은 그 문장 뒤에 오는 부분입니다.
순진한 회귀가 실패하는 이유

블로그 자체의 영토에서 질문을 설정하세요. 우리는 채움 확률에 대한 대기열 위치의 인과 효과를 원합니다:
- : 관측 에서 휴식 중인 지정가 주문이 horizon 내에서 채워졌는지 여부.
- : 배치 시 대기열 위치(레벨 크기로 정규화됨).
- : 교락 변수 — 실현 변동성, 호가 스프레드, 깊이 불균형, 레벨 크기, 하루 중 시간, 레짐 라벨. 이것들은 블로그가 스프레드 모델링 및 머신 러닝에서 이미 계산하는 시장 상태 변수입니다.
인과 파라미터는 다음의 입니다:
여기서 는 시장 상태와 채움 결과 사이의 (잠재적으로 복잡하고 비선형적인) 관계를 포착합니다.
처치는 무작위로 할당되지 않습니다. 당신은 대기열의 앞부분에 있는 이유는 레벨이 얇았기 때문이거나, 조용한 기간 동안 게시했기 때문이거나, 오더북이 당신에게 유리하게 불균형했기 때문입니다. 동일한 조건이 당신이 채워지는지 여부를 독립적으로 구동합니다. 이것이 교락입니다.
접근법 1: 교락 변수 무시. 를 에만 회귀합니다. 추정치는 둘 모두와 상관된 모든 교락 변수의 효과를 흡수합니다. 교과서적인 누락 변수 편향: 얇은 레벨은 좋은 대기열 슬롯과 높은 채움률을 모두 제공하므로 슬롯 자체의 가치를 과대평가합니다.
접근법 2: 컨트롤을 포함한 선형 회귀. 를 와 에 회귀합니다. 이것은 가 진정으로 선형인 경우에만 작동합니다. 오더북 역학은 그렇지 않습니다 — 채움/변동성 관계에는 임계값이 있으며 깊이 불균형 효과는 레짐에 따라 부호가 바뀝니다. 를 잘못 명시하면 편향이 다시 도입됩니다.
접근법 3: ML 예측. 에 그라디언트 부스팅 모델을 피팅합니다. 좋은 샘플 외 판별을 얻지만 인과적 해석은 전혀 없습니다. 모델은 예측적 패턴을 포착합니다, 인과적이든 아니든; 정규화는 를 편향시키는 방식으로 처치의 기여를 축소합니다; 그리고 신뢰할 수 있는 표준 오차가 없습니다.
이것이 핵심 긴장입니다. ML은 예측에는 좋지만, 인과 파라미터에 대한 순진한 적용은 편향되고, 비정규적이며, 신뢰할 수 없는 추정치를 생성합니다.
부분 선형 모델

DML은 구조적 프레임워크 내에서 작동합니다. 작업 마력은 **부분 선형 회귀(PLR)**입니다:
- 는 관심 있는 인과 파라미터입니다.
- 는 nuisance 함수 — 시장 상태에 의해 설명되는 결과의 부분.
- 는 또 다른 nuisance 함수 — 시장 상태를 주었을 때 처치의 조건부 기대값(연속 처치 설정에서의 "propensity").
- 와 는 구조적 잔차입니다.
핵심 통찰: 는 저차원이지만 와 는 임의로 복잡할 수 있습니다. 우리는 ML이 nuisance 함수를 처리하면서 스칼라에 대한 유효한 추론을 전달하기를 원합니다.
왜 "더블"인가?
두 개의 ML 모델, 하나가 아닙니다:
- 결과 모델: — 시장 상태만에서 결과를 예측합니다.
- 처치 모델: — 시장 상태만에서 처치를 예측합니다.
잔차를 형성하세요
그리고 를 에 회귀하여 를 추정합니다:
이것은 스테로이드를 투여받은 Frisch-Waugh-Lovell입니다: 선형 투영 대신 ML로 교락 변수를 부분 제거한 다음 잔차 변동에서 처치 효과를 읽습니다.
Neyman 직교성: 왜 작동하는가
순진한 부분 제거 접근(를 추정하고 빼고 회귀)은 의 ML 추정 오차가 로 직접 전파되기 때문에 실패합니다. DML 점수는 Neyman 직교가 되도록 구성됩니다 — nuisance 함수의 작은 섭동에 둔감합니다.
PLR의 직교 점수:
여기서 . 직교 조건은
직관적으로, 점수는 와 독립적인 와 의 변동만 사용하며, 한 nuisance 함수의 오차는 다른 함수에 의해 상쇄됩니다. 만약 이 처치를 약간 과대 예측하면 는 약간 너무 작지만, 의 잘못된 추정에서 오는 의 해당 오차는 보상 방향으로 밉니다. 편향은 2차가 됩니다 — 두 1단계 오차의 곱 — 1차 대신.
형식적으로, 두 nuisance 추정량이 모두 속도로 수렴하면(완화; 대부분의 합리적인 ML 방법이 이를 충족), 다음을 얻습니다:
따라서 는 모수적 속도로 수렴하고 점근적으로 정규입니다.
교차 검증: 왜 여기서 필수인가
직교성만으로는 충분하지 않습니다. nuisance 모델이 를 추정하는 데 사용된 것과 동일한 행에서 피팅되면 1단계 과적합이 2단계를 오염시킵니다 — 그리고 이 특정한 피해는 정확히 명시할 가치가 있습니다, 당신이 익숙한 피해가 아니기 때문입니다. 다른 곳에서는 과적합이 부풀린 검증 점수로 나타납니다: 당신은 이것을 알아차리고, 할인하고, 계속 진행합니다. 여기서는 에 대한 치우쳐진 점 추정으로 나타나며, 여전히 좁고 여전히 잘못된 숫자를 중심으로 하는 신뢰 구간이 있습니다. 의심할 점수가 없습니다. 추정량은 조용히 거짓말을 합니다.
교차 검증은 의존성을 끊습니다: 각 관측의 nuisance 예측은 그것 없이 훈련된 모델에서 나오며, 는 풀링된 held-out 잔차에서 추정됩니다. 메카닉은 일반적인 K-fold 장비이며 스프레드 모델링 및 머신 러닝에서 다룹니다; 아래에서 중요한 것은 어떤 fold를 전달하는지입니다.
DML 알고리즘 단계별
입력: 데이터 , ML 방법 및 , fold .
1단계 — 분할: 을 개의 분리된 fold로 나눕니다.
2단계 — 교차 피팅 nuisance 모델: 에 대해, fold 의 보완에서 와 를 훈련시킨 다음 에 대해 와 를 계산합니다.
3단계 — 추정:
4단계 — 추론:
구간 와 함께.
신뢰 구간은 정확히 하나의 질문에만 유효합니다
이것이 DML 결과의 가치가 있는지 여부를 결정하는 경고이며, 방법의 대부분의 적용이 조용히 무너지는 곳입니다.
위의 점근적 정규성은 하나의 미리 지정된 처치, 하나의 미리 지정된 교락 변수 세트, 하나의 미리 지정된 점수에 대한 문장입니다. 이것들을 미리 고정하고, 추정량을 한 번 실행하고, 구간은 말하는 것을 의미합니다. 세 가지 후보 처치 또는 네 가지 교락 변수 세트 또는 p값이 더 나아 보일 때까지 learner를 바꾸면 추론을 하는 것이 아닙니다 — 검색을 실행하고 있으며, 보고된 p값은 최대값의 p값이지 추출의 것이 아닙니다.
블로그는 이미 이것이 무엇을 하는지 측정했습니다. 수축된 샤프 비율 연구에서, 진짜 에지가 0인 순수 노이즈에 대한 검색은 1.000의 순진한 가짜 발견율을 생성합니다 — 미조정된 테스트는 매번 발화합니다 — 반면 승자의 중앙값 순진 p값은 0.0007 근처에 앉습니다. Neyman 직교성에 대해서는 이것으로부터 당신을 보호하는 것은 없습니다. 직교성은 nuisance 추정으로부터의 편향을 수정합니다; 사양 검색으로부터의 편향에 대해서는 아무것도 말하지 않습니다. 여섯 가지 사양을 시도한 후 얻은 1e-05의 DML p값은 을 실제로 실행한 사양의 수로 설정하여 그리드에서 꺼낸 다른 승자와 정확히 동일한 Bonferroni/Holm/BHY 처리를 받을 자격이 있습니다.
이것은 도구의 편의 기능에 직접적인 실용적 영향을 미칩니다. 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값, 그리고 요약 테이블이 언급하지 않는 다중 테스트 문제. 세 가지를 모두 읽으면 세 가지를 모두 조정하세요. 하나만 사전 등록된 질문이라면 그렇다고 말하고 다른 두 가지를 명시적으로 탐색적으로 처리하세요.
시계열에서의 교차 검증: 제거, 엠바고, 사용자 정의 Fold

표준 DML은 i.i.d. 관측을 가정합니다. 오더북 데이터는 그렇지 않으며 실패 모드는 블로그가 이미 상세히 문서화한 것입니다: 인접한 행은 중첩되는 lookahead 윈도우를 공유하므로 평범한 TimeSeriesSplit은 여전히 fold 경계를 넘어 답을 누출합니다. 제거되고 엠바고된 워크포워드 구현과 최소 horizon 행 갭이 필요한 이유, 그리고 모든 누출과 측정된 크기의 전체 목록은 lookahead 편향 분류를 참조하세요.
진정으로 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와 동일한 구성:
갭은 훈련 행의 lookahead 윈도우와 검증 행 사이의
중첩을 제거합니다.
"""
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()
두 가지 주의할 사항, 둘 다 라이브러리 문서에서 명확하지 않습니다:
- 제거된 워크포워드 fold는 모든 행을 포함하지 않습니다. 제거 갭과 초기 훈련 블록은 누구의 테스트 fold도 아니므로 는 엄격히 미만의 잔차에서 추정됩니다. 이것은 올바른 동작이며 버그가 아니지만 분산 식의 유효한 은 풀링된 테스트 행의 수입니다 — 가정하는 대신 확인하세요.
n_rep반복은 여기서 무료가 아닙니다. 무작위 K-fold에서는 교차 검증을 반복하고 평균화하는 것이 저렴한 분산 감소입니다. 결정론적인 시간 순서 분할에는 하나의 분할만 있으므로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 열 사이의 간격이 진정한 관심의 양입니다: 대기열 위치의 겉보기 가치가 얼마나 시장 상태의 변장이었는지입니다.
여기서 가 null 또는 음수인 것은 게시 가능한 결과이며 깨끗한 양수보다 이 블로그에 더 적합합니다. 대기열 위치의 인과 효과가 변동성과 레벨 크기가 부분 제거되면 붕괴한다면, 이것은 주문 배치 정책에 대한 직접적인 발견입니다: 슬롯을 얻는 것은 채움을 얻는 것이 아니라, 슬롯을 얻은 조건입니다.
인과 요인 분석
요인 투자의 표준 접근은 연관적입니다: 특성으로 정렬하고, 롱-숏 포트폴리오를 형성하고, 수익률이 다른 것을 관찰합니다. DML은 다른 테스트를 가능하게 합니다 — 다른 특성의 교락 효과를 제거하면서 수익률에 대한 특성의 직접 인과 효과를 추정합니다. DML에서 효과가 사라지면 요인은 독립적으로 인과적이지 않습니다; 프록시입니다.
이것은 요인 회의주의의 두 번째 독립적인 형태이며, 블로그가 이미 게시하는 것과 어떻게 관련되는지 명시할 가치가 있습니다. 수축된 샤프 비율은 선택 측면에서 요인 동물원을 공격합니다: 충분한 시행이 있으면 요인은 많이 보았기 때문에만 중요해 보일 수 있습니다. DML은 교락 측면에서 공격합니다: 요인은 하나의 정직한 테스트에서 중요해 보이지만 조건부 설정의 다른 것의 프록시일 수 있습니다. 요인은 흥미로워지기 위해 둘 다 살아남아야 하며 두 가지 실패 모드는 독립적입니다 — 하나를 통과한다고 다른 것에 대해서 아무것도 말하지 않습니다.
DML이 할 수 없는 것
-
교락 변수가 관측되어야 합니다. 관측되지 않은 변수가 처치와 결과를 모두 구동하면 DML은 편향되어 있으며 어떤 ML 정교함도 식별 문제를 수정하지 않습니다. 민감도 분석은 위험을 한정합니다; 제거하지 않습니다.
-
평균 효과를 추정합니다. 레짬 전체에서 대기열 위치 효과가 급격히 다르면 점 추정은 샘플의 레짐 혼합에 대한 평균입니다. 이질성에는 Interactive Regression Model(
DoubleMLIRM) 또는 인과 포레스트를 사용하세요. -
구조적 모델을 가정합니다. 부분 선형 사양은 처치가 특정 방식으로 결과 방정식에 들어가는 것을 요구합니다. 실제 프로세스가 근본적으로 다르면 DML은 자신 있게 틀립니다.
-
인과 구조를 발견하지 않습니다. DML은 미리 지정된 처치의 효과를 추정합니다. 어떤 변수가 원인인지 말해주지 않습니다.
-
다중 테스트에서 면제하지 않습니다. 가장 자주 건너뛰기 때문에 위의 점을 반복합니다: 직교성은 nuisance 추정을 편향 제거하지만 사양 검색은 편향 제거하지 않습니다.
실용적 노트
샘플 크기. DML은 nuisance 모델이 로 수렴할 것을 요구하며, 실제로는 ML 모델이 와 를 전혀 근사할 충분한 행이 있음을 의미합니다. 정수 임계값을 신뢰하는 대신 다중 심볼 검증이 하는 방식으로 경험적으로 적절성을 확립하세요 — 추정이 인스트루먼트 및 하위 기간 전체에서 유지되는지 확인하고 불안정성을 그것이 신호인 것으로 처리하세요.
Learner 선택. DML 특정 사실은 좁지만 유용합니다: 수렴이 주어지면 learner는 의 효율성(구간 너비)에 영향을 미치지만 일관성에는 영향을 미치지 않습니다. 테이블 시장 데이터에 도달할 가치 있는 learner와 그라디언트 부스팅이 기본인 이유는 이미 스프레드 모델링 및 머신 러닝에서 다룹니다. 가 learner 간에 실질적으로 이동하면 선택할 메뉴가 아닙니다 — nuisance 함수가 잘못 추정되었다는 증거이며 위 섹션에 따라 가장 친숙한 것을 선택하면 운동을 검색으로 바꿉니다.
결론
DML은 블로그에 없던 것을 제공합니다: 좋은 검증 점수를 가진 예측으로서가 아니라 방어할 수 있는 표준 오차를 가진 인과 파라미터로서 시장 마이크로구조 주장을 명확히 하는 방법.
하중을 지탱하는 세 가지 아이디어:
- 점수를 직교화하여 1단계 오차가 2차로 상쇄되도록 합니다.
- 시계열 데이터에서 제거되고 엠바고된 fold로 교차 피팅하여 1단계 과적합이 를 이동할 수 없도록 합니다.
- 사전 지정하여 보고하는 구간이 실제로 얻은 구간이 되도록 합니다.
추정량은 쉬운 부분입니다. 어려운 부분은 변경되지 않습니다: 어떤 교락 변수가 중요한지 결정하고 식별 가정이 유지된다고 주장하며 사양을 한 번 더 실행하려는 충동을 저항하는 것.
참고 문헌
DML의 계보는 짧고 한 줄 가치가 있습니다: 이것은 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.