The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem
Có hai cách khác nhau về mặt cấu trúc khiến một phép hồi quy đánh lừa bạn, và cho đến nay blog này mới chỉ tấn công một trong số đó.
Thứ nhất là thiên lệch chọn mẫu trong quá trình tìm kiếm: bạn chạy mười nghìn backtest, giữ lại kết quả tốt nhất, và con số đang nhìn thấy là cực đại của một phân phối nhiễu chứ không phải một hiệu ứng. Đó là chủ đề của tỷ lệ Sharpe đã khử lạm phát và công trình tổng kết kết quả phủ định trung thực. Cách sửa là định giá quá trình tìm kiếm.
Thứ hai là thiên lệch trong chính hệ số, trên một phép hồi quy duy nhất mà bạn chưa từng tìm kiếm qua nhiều lựa chọn. Nếu biến hồi quy tương quan với số hạng sai số, OLS sẽ chệch và không nhất quán — và khác với nhiễu lấy mẫu, điều này không thu nhỏ khi kích thước mẫu tăng. Nhiều dữ liệu hơn chỉ làm con số sai trở nên chặt chẽ hơn. Không bootstrap, walk-forward hay khử lạm phát nào có thể xử lý điều đó, vì không phương pháp nào trong số chúng đặt câu hỏi về tính nhận dạng, mà chỉ đặt câu hỏi về việc lựa chọn.
Bài viết này nói về thất bại thứ hai, và đây không phải mối quan tâm trừu tượng. Bài viết hiệu chỉnh Almgren-Chriss khớp tác động vĩnh viễn bằng cách hồi quy thay đổi giá giữa trên 5 phút theo dòng lệnh taker ròng, thu được vài phần trăm và một hệ số thay đổi 2-5 lần giữa các ngày, đồng thời gọi nội sinh là lý do cấu trúc đầu tiên: "Dòng lệnh phản ứng với giá cũng nhiều như giá phản ứng với dòng lệnh. Các nhà giao dịch động lượng mua vì giá đã tăng; một OLS ngây thơ của lợi suất theo dòng lệnh sẽ nắm bắt phản ứng của họ và quy nó cho tác động." Bài viết cũng nêu cách sửa sạch — các lệnh khớp của chính bạn, ngoại sinh theo cách xây dựng.
Đây là một bài toán biến công cụ với một công cụ đã được gọi tên và dữ liệu đã có sẵn trong nội bộ. Dưới đây là bộ ước lượng, các chẩn đoán và thí nghiệm.
Nội sinh trong một đoạn

OLS chỉ ước lượng nhân quả trong khi . Ba điều có thể phá vỡ điều kiện này. Thiên lệch do biến bị bỏ sót: nếu thúc đẩy cả và nhưng không được quan sát, nó nằm trong sai số, , và buộc — trong cấu trúc vi mô, thông tin đến không quan sát được đồng thời thúc đẩy khối lượng và biến động. Sai số đo lường: với một biến đại diện nhiễu , , luôn bị thu hẹp về phía 0 — dòng aggTrades ròng là biến đại diện cho dòng lệnh có dấu thực qua một thị trường phân mảnh, và phần bạn không bao giờ thấy chính là sai số đo lường. Tính đồng thời: đã được trình bày rõ hơn và cụ thể hơn trong hiệu chỉnh tác động Almgren-Chriss, là bài toán tạo động lực cho toàn bộ phần dưới đây.
Lời giải IV

Một công cụ phải thỏa mãn hai điều kiện:
- Tính liên quan: . Có thể kiểm định, và bạn phải kiểm định nó.
- Điều kiện loại trừ: — chỉ tác động đến thông qua . Không thể kiểm định. Không bao giờ. Đây là một lập luận kinh tế, không phải một thống kê.
Với một công cụ và một biến hồi quy nội sinh, bộ ước lượng là tỷ số của hai tác động dạng rút gọn (bộ ước lượng Wald):
Khi có biến kiểm soát và nhiều công cụ, dùng 2SLS. Giai đoạn 1: hồi quy biến nội sinh theo các công cụ và biến kiểm soát, , rồi giữ các giá trị khớp — theo cách xây dựng, chúng chỉ chứa biến thiên ngoại sinh do công cụ thúc đẩy. Giai đoạn 2: chạy . Ở dạng ma trận, với :
Cái bẫy bắt được tất cả những ai tự viết thủ công: nếu bạn thực sự chạy hai lệnh lstsq, sai số chuẩn ở giai đoạn 2 sẽ sai. là một biến hồi quy được tạo ra, và phương sai phần dư phải được tính từ ban đầu, không phải từ biến đã khớp. Sai số chuẩn hai bước ngây thơ quá nhỏ, nên các thống kê quá lớn và bạn sẽ bác bỏ quá nhiều giả thuyết. Hãy dùng một triển khai IV thực sự:
from linearmodels.iv import IV2SLS
import pandas as pd
def iv_regression(df, dep_var, endog_var, instruments, controls=None):
"""2SLS with correct generated-regressor standard errors."""
y = df[dep_var]
endog = df[[endog_var]]
instr = df[instruments]
const = pd.Series(1, index=df.index, name="const")
exog = pd.concat([const, df[controls]], axis=1) if controls else const
res = IV2SLS(dependent=y, exog=exog, endog=endog,
instruments=instr).fit(cov_type="robust")
print(res.summary)
return res
Thí nghiệm: Gamma OLS so với Gamma 2SLS

Phép hồi quy được kiểm định là mô hình tác động vĩnh viễn từ bài viết Almgren-Chriss:
là biến nội sinh theo lập luận về tính đồng thời ở trên. Công cụ là các lệnh khớp của chính bạn trong cửa sổ: các lệnh khớp maker của bạn được kích hoạt bởi lịch báo giá và chính sách tồn kho của bạn, không phải bởi đường đi của giá thị trường, nên chúng là nguồn biến thiên dòng lệnh có khả năng không tương quan với thành phần phản ứng theo động lượng trong sai số. Điều kiện loại trừ — rằng các lệnh khớp của bạn chỉ làm dịch chuyển giá giữa thông qua phần đóng góp của chúng vào dòng lệnh ròng — là giả định cần tranh luận, và nó yếu nhất đúng khi việc báo giá của bạn cũng dựa trên tín hiệu. Nếu báo giá của bạn phụ thuộc vào dự báo giá trong chân trời ngắn, công cụ bị nhiễm và thiết kế này thất bại. Các lệnh khớp từ một chính sách thuần quản lý tồn kho hoặc thu chênh lệch là trường hợp sạch.
Dữ liệu lệnh khớp đến từ bản ghi TCA được mô tả trong implementation shortfall và TCA tự xây dựng — cùng nhật ký cung cấp mẫu khớp cho đường cong trượt giá từ các lệnh khớp của chính bạn. Biến kiểm soát: trễ và biến động thực hiện trong cửa sổ.
ols = IV2SLS(dependent=df.dS, exog=df[["const", "dS_lag", "rv"]],
endog=None, instruments=None).fit(cov_type="robust")
tsls = iv_regression(df, "dS", "q_net", ["q_own"], ["dS_lag", "rv"])
Bốn con số quyết định liệu việc này có đáng làm hay không: của OLS, của 2SLS, giai đoạn một và khoảng cách giữa hai hệ số — tức phần của ước lượng OLS là phản ứng theo động lượng thay vì tác động.
Nếu giai đoạn một thấp hơn 10, đó chính là kết quả: các lệnh khớp của chính bạn chiếm tỷ lệ quá nhỏ trong dòng lệnh ròng ở độ phân giải 5 phút để nhận dạng , và cách viết trung thực là một kết quả phủ định theo phong cách kết quả phủ định trung thực. Một kết quả phủ định do công cụ yếu là một phát hiện có thật — nó cho bạn biết tính nội sinh trong mô hình Gamma không thể sửa ở kích thước mẫu và chân trời này, đồng thời các ước lượng chi phí trước giao dịch dựa trên OLS mang thiên lệch tăng không thể loại bỏ.
Chẩn đoán

F giai đoạn một (công cụ yếu). Quy tắc kinh nghiệm Staiger-Stock: . Các giá trị tới hạn Stock-Yogo cho một biến hồi quy nội sinh nghiêm ngặt hơn — với kích thước IV cực đại 10%, khi có một công cụ, 19.93 khi có hai, 22.30 khi có ba; với kích thước 15%, 8.96 / 11.59 / 12.83; với 20%, 6.66 / 8.75 / 9.54.
Durbin-Wu-Hausman (có thực sự cần IV không). Nếu OLS nhất quán thì nó cũng hiệu quả hơn, vì vậy hãy kiểm định trước khi chuyển đổi. Dạng bổ sung phần dư là dạng thực tế: chạy giai đoạn 1, giữ , sau đó chạy hồi quy cấu trúc OLS với được thêm làm biến hồi quy. Hệ số có ý nghĩa trên là bằng chứng của tính nội sinh.
def durbin_wu_hausman(df, dep, endog, instruments, controls):
"""Augmented-regression form of the DWH endogeneity test."""
import statsmodels.api as sm
X1 = sm.add_constant(df[instruments + controls])
v_hat = df[endog] - sm.OLS(df[endog], X1).fit().fittedvalues
X2 = sm.add_constant(df[[endog] + controls].assign(v_hat=v_hat))
res = sm.OLS(df[dep], X2).fit(cov_type="HC1")
return res.tvalues["v_hat"], res.pvalues["v_hat"]
Sargan-Hansen (nhận dạng quá mức). Với công cụ, bạn có thể kiểm định tính hợp lệ chung: , trong đó đến từ việc hồi quy phần dư 2SLS theo tất cả công cụ và các biến kiểm soát ngoại sinh. Điều cần lưu ý quan trọng hơn cả thống kê: Sargan chỉ phát hiện các công cụ không hợp lệ theo những cách khác nhau. Nếu mọi công cụ đều tương quan với cùng một biến bị bỏ sót, kiểm định vẫn trôi qua sạch sẽ và không nói cho bạn điều gì.
Các công cụ tồn tại trong cấu trúc vi mô của tiền mã hóa

Tìm một công cụ hợp lệ là toàn bộ khó khăn, và những công cụ thường dùng trong tài chính doanh nghiệp-cổ phiếu (mức độ bao phủ của nhà phân tích, lá chắn thuế, dòng tiền bất ngờ) không hoạt động ở đây. Thực tế có hai nhóm áp dụng được:
| Biến nội sinh | Công cụ | Lý do |
|---|---|---|
| Dòng lệnh taker ròng | Các lệnh khớp của chính bạn | Được thúc đẩy bởi báo giá và chính sách tồn kho của bạn, không phải đường đi của giá thị trường — ngoại sinh theo cách xây dựng nếu báo giá của bạn không phụ thuộc vào tín hiệu |
| Dòng lệnh / khối lượng tổng hợp | Các dòng lệnh theo cơ chế sàn: tái cân bằng chỉ số, các cửa sổ thanh toán funding, các đợt thanh lý theo lịch | Thời điểm được đặt bởi quy tắc của sàn, không phải bởi thông tin đến |
Cạm bẫy

Công cụ yếu không thất bại một cách ồn ào. Với giai đoạn một yếu, 2SLS bị chệch về phía OLS trong các mẫu hữu hạn, xấp xỉ
Ở , bạn vẫn giữ 25% thiên lệch OLS trong khi báo cáo một ước lượng "nhân quả". Cách khắc phục là LIML, có hành vi tốt hơn trong mẫu hữu hạn, hoặc kiểm định Anderson-Rubin, hợp lệ bất kể độ mạnh của công cụ.
Nhiều công cụ gây thiên lệch. . Đưa các độ trễ của mọi thứ vào để tăng giai đoạn một sẽ kéo ước lượng thẳng trở lại OLS. Nếu không thể bỏ qua, hãy dùng LIML, IV jackknife (JIVE) hoặc một giai đoạn một được điều chuẩn.
Không thể kiểm định điều kiện loại trừ. Không bằng Sargan, cũng không bằng bất cứ thứ gì. Điều kiện này được bảo vệ bằng lập luận miền, và dạng trung thực của sự bảo vệ đó là phân tích độ nhạy: cần một vi phạm lớn đến mức nào để đảo ngược kết luận?
Kết luận chính

- Khử lạm phát sửa thiên lệch do quá trình tìm kiếm. Nó không làm gì với thiên lệch trong hệ số. Đây là hai thất bại khác nhau và cần các công cụ khác nhau.
- Thiên lệch nội sinh không biến mất khi kích thước mẫu tăng. Một hệ số chặt chẽ, được bootstrap tốt và xác thực bằng walk-forward vẫn có thể sai một cách có hệ thống.
- Hồi quy Gamma trong hiệu chỉnh Almgren-Chriss là một trường hợp thực tế ngay trong nội bộ, với một công cụ đã được gọi tên (các lệnh khớp của chính bạn) và dữ liệu đã được đường ống TCA ghi lại.
- Hãy báo cáo giai đoạn một trước hệ số 2SLS. Dưới 10, hệ số không phải là bằng chứng, và nói rõ điều đó chính là kết quả có thể công bố.
Tác Giả
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.