The Other Way a Regression Lies: Endogeneity, 2SLS, and the Gamma Calibration Problem
Есть два структурно разных способа, которыми регрессия может вас обмануть, и до сих пор этот блог атаковал только один из них.
Первый — смещение отбора в поиске: вы провели десять тысяч бэктестов, оставили лучший, а рассматриваемое число оказалось максимумом распределения шума, а не эффектом. Этому посвящены дефлированный коэффициент Sharpe и его итоговый материал честный отрицательный результат. Исправление — учесть стоимость поиска.
Второй — смещение самого коэффициента в одной-единственной регрессии, которую вы вообще не перебирали в поиске. Если регрессор коррелирует с членом ошибки, OLS смещен и несостоятелен — и, в отличие от ошибки выборки, это не уменьшается с ростом объема данных. Дополнительные данные делают неправильное число лишь точнее. Никакие бутстрэп, скользящая проверка по времени или дефляция этого не исправят, потому что ни один из этих методов не ставит под вопрос идентификацию, а проверяет только отбор.
Эта статья посвящена второй ошибке, и здесь это не абстрактная проблема. В статье о калибровке Almgren-Chriss постоянное воздействие оценивается регрессией пятиминутных изменений средней цены на чистый поток тейкеров; получается в несколько процентов и коэффициент, меняющийся между днями в 2–5 раз. Эндогенность названа первой структурной причиной: "Поток реагирует на цену так же, как цена реагирует на поток. Трейдеры импульса покупают потому, что цена выросла; наивная OLS-регрессия доходностей на поток подхватывает их реакцию и приписывает ее воздействию." Там же назван чистый способ исправления — ваши собственные исполнения, экзогенные по построению.
Это задача инструментальных переменных с конкретным инструментом и данными, которые уже есть внутри системы. Ниже приведены оцениватель, диагностика и эксперимент.
Эндогенность в одном абзаце

OLS оценивает причинный в только при условии . Это нарушают три явления. Смещение из-за пропущенной переменной: если влияет и на , и на , но не наблюдается, она попадает в ошибку, , а заставляет — в микроструктуре ненаблюдаемое поступление информации одновременно двигает объем и волатильность. Ошибка измерения: при шумном приближении значение всегда затухает к нулю — агрегированный поток aggTrades является приближением к истинному знаковому потоку ордеров на фрагментированном рынке, а невидимая часть — это ошибка измерения. Одновременность: уже сформулирована точнее и конкретнее в калибровке воздействия Almgren-Chriss, которая и является мотивирующей задачей для всего дальнейшего.
Решение с инструментальными переменными

Инструмент должен удовлетворять двум условиям:
- Релевантность: . Это проверяемо, и вы обязаны это проверить.
- Ограничение исключения: — влияет на только через . Непроверяемо. Никогда. Это экономический аргумент, а не статистика.
Для одного инструмента и одного эндогенного регрессора оцениватель представляет собой отношение двух эффектов приведенной формы (оцениватель Вальда):
При наличии контролей и нескольких инструментов используется 2SLS. Первый этап: регрессируйте эндогенную переменную на инструменты и контролирующие переменные, , и сохраните подогнанные значения — по построению они содержат только экзогенную вариацию, вызванную инструментами. Второй этап: выполните регрессию . В матричной форме, при :
Ловушка, в которую попадают все, кто реализует это вручную: если буквально выполнить два вызова lstsq, стандартные ошибки второго этапа будут неверными. — сгенерированный регрессор, а дисперсию остатков нужно считать по исходному , а не по подогнанному. Наивные стандартные ошибки двухэтапной процедуры слишком малы, поэтому ваши -статистики слишком велики и вы будете слишком часто отвергать нулевую гипотезу. Используйте настоящую реализацию IV:
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
Эксперимент: gamma OLS против gamma 2SLS

Проверяемая регрессия — оценка постоянного воздействия из статьи Almgren-Chriss:
эндогенен по приведенному выше аргументу об одновременности. Инструмент — ваши собственные исполнения в окне: ваши мейкерские исполнения запускаются вашим расписанием котирования и политикой управления запасом, а не ценовой траекторией рынка, поэтому они являются источником вариации потока ордеров, который, вероятно, не коррелирует с компонентом ошибки, связанным с реакцией на импульс. Ограничение исключения — что ваши исполнения двигают среднюю цену только через свой вклад в чистый поток — является допущением, которое нужно обсуждать, и оно слабее всего именно тогда, когда ваши котировки сами зависят от сигнала. Если котировки используют прогноз цены на коротком горизонте, инструмент загрязнен и эта схема не работает. Исполнения от чистой политики управления запасом или захвата спрэда — чистый случай.
Данные об исполнениях берутся из записи TCA, описанной в статье о проскальзывании и самостоятельном TCA — из того же журнала, который поставляет выборку для кривых проскальзывания по собственным исполнениям. Контроли: лагированное и реализованная волатильность в окне.
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"])
Четыре числа решают, стоило ли это делать: OLS , 2SLS , первого этапа и разница между двумя коэффициентами — доля оценки OLS, которая была реакцией на импульс, а не воздействием.
Если первого этапа окажется меньше 10, это и есть результат: собственные исполнения составляют слишком малую долю чистого потока на пятиминутном горизонте, чтобы идентифицировать , а честное изложение — отрицательный результат в стиле честного отрицательного результата. Отрицательный результат со слабым инструментом — настоящее открытие: он показывает, что эндогенность в оценке gamma нельзя исправить при таком размере выборки и горизонте, а оценки издержек до сделки, построенные на OLS , несут неустранимое восходящее смещение.
Диагностика

F первого этапа (слабые инструменты). Эвристика Staiger-Stock: . Критические значения Stock-Yogo для одного эндогенного регрессора строже: при максимальном размере IV 10% — с одним инструментом, 19.93 с двумя, 22.30 с тремя; при размере 15% — 8.96 / 11.59 / 12.83; при 20% — 6.66 / 8.75 / 9.54.
Durbin-Wu-Hausman (нужен ли вообще IV). Если OLS состоятелен, он также эффективнее, поэтому проверьте это до перехода. Практическая форма — с добавлением остатков: выполните первый этап, сохраните , затем выполните структурную OLS-регрессию, добавив как регрессор. Значимый коэффициент при свидетельствует об эндогенности.
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 (переидентификация). При инструментах можно проверить совместную валидность: , где получается из регрессии остатков 2SLS на все инструменты и экзогенные контролирующие переменные. Оговорка важнее статистики: Sargan обнаруживает только инструменты, недействительные разными способами. Если каждый инструмент коррелирует с одной и той же пропущенной переменной, тест проходит чисто и ничего вам не сообщает.
Инструменты, существующие в криптомикроструктуре

Найти валидный инструмент — главная трудность, а стандартные инструменты фондовых рынков и корпоративных финансов (аналитическое покрытие, налоговые щиты, непредвиденный денежный поток) здесь не работают. На практике применимы два класса:
| Эндогенная переменная | Инструмент | Обоснование |
|---|---|---|
| Чистый поток тейкеров | Ваши собственные исполнения | Формируется вашим котированием и политикой управления запасом, а не ценовой траекторией рынка — экзогенен по построению если ваши котировки не зависят от сигнала |
| Совокупный поток / объем | Механические потоки биржи: ребалансировка индекса, окна расчетов финансирования, запланированные каскады ликвидаций | Время задается правилами биржи, а не поступлением информации |
Подводные камни

Слабые инструменты не проваливаются явно. При слабом первом этапе 2SLS в конечной выборке смещен в сторону OLS, примерно
При вы сохраняете 25% смещения OLS, одновременно сообщая "причинную" оценку. Средства исправления — LIML, который лучше ведет себя на конечных выборках, или тест Anderson-Rubin, валидный независимо от силы инструмента.
Смещение из-за множества инструментов. . Добавление лагов всего подряд в ради повышения первого этапа возвращает оценку прямо к OLS. Если не пренебрежимо мало, используйте LIML, jackknife IV (JIVE) или регуляризованный первый этап.
Ограничение исключения нельзя проверить. Ни через Sargan, ни вообще никак. Его защищают рассуждениями о предметной области, а честная форма такой защиты — анализ чувствительности: насколько большим должно быть нарушение, чтобы опровергнуть вывод?
Выводы

- Дефляция исправляет смещение от поиска. Она ничего не делает со смещением коэффициента. Это разные ошибки, требующие разных инструментов.
- Смещение из-за эндогенности не исчезает с ростом выборки. Даже точный, хорошо проверенный бутстрэпом и скользящей проверкой по времени коэффициент может систематически быть неверным.
- Регрессия gamma в калибровке Almgren-Chriss — реальный внутренний пример с названным инструментом (собственные исполнения) и данными, уже записанными конвейером TCA.
- Сообщайте первого этапа до коэффициента 2SLS. Если он меньше 10, коэффициент не является доказательством, и именно это следует честно опубликовать.
Авторы
Инженер торговых систем
Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.