Перейти к содержимому

Глава 105: Разность-разностей (DiD) для трейдинга

Обзор

Разность-разностей (Difference-in-Differences, DiD) — это квазиэкспериментальный статистический метод, используемый в эконометрике для оценки причинно-следственных эффектов путём сравнения изменений результатов во времени между группой воздействия и контрольной группой. Изначально разработанный для оценки политик, DiD стал мощным инструментом на финансовых рынках для измерения влияния событий, регулирования и политик на цены активов.

В этой главе реализованы методы DiD для торговли криптовалютами на Bybit и анализа фондового рынка, демонстрируя, как техники причинно-следственного вывода могут применяться для выявления торговых возможностей, возникающих в результате регуляторных изменений, политических объявлений и рыночных событий.

Содержание

  1. Теоретические основы
  2. Архитектура DiD
  3. Математическая формулировка
  4. Реализация
  5. Торговая стратегия
  6. Результаты и метрики
  7. Литература

Теоретические основы

Что такое Разность-разностей?

DiD — это исследовательский дизайн, который оценивает причинно-следственные эффекты, сравнивая разницу в результатах во времени между единицами, получившими воздействие, и единицами, которые его не получили. Ключевая идея в том, что взяв «разность разностей», мы можем контролировать неизменяющиеся во времени ненаблюдаемые факторы и общие временные тренды.

Оценка DiD = (Y_воздейств,после - Y_воздейств,до) - (Y_контроль,после - Y_контроль,до)

Предположение о параллельных трендах

Фундаментальное идентифицирующее предположение DiD состоит в том, что в отсутствие воздействия группы воздействия и контроля следовали бы параллельным трендам:

E[Y(0)_t | D=1] - E[Y(0)_{t-1} | D=1] = E[Y(0)_t | D=0] - E[Y(0)_{t-1} | D=0]

Где:

  • Y(0) — потенциальный результат без воздействия
  • D указывает статус воздействия (1 = группа воздействия, 0 = контроль)
  • Подстрочные индексы обозначают временные периоды

Почему DiD для трейдинга?

Финансовые рынки предлагают множество естественных экспериментов для DiD-анализа:

Тип событияГруппа воздействияКонтрольная группаПрименение
Регуляторные измененияЗатронутые активыНезатронутые активыИзмерение затрат на соответствие
Политические объявленияЦелевой секторДругие секторыВыявление рыночного влияния
Листинги на биржахЛистингованный токенПохожие токеныОценка премии листинга
Сюрпризы прибылиОбъявляющая компанияОтраслевые аналогиИзоляция эффекта компании
Макроэкономические событияПодверженные экономикиНеподверженные экономикиКоличественная оценка передачи шока

Преимущества над простыми event studies

Традиционные event studies измеряют аномальную доходность вокруг события, но сталкиваются с:

  • Систематической ошибкой выборки (какие фирмы затронуты часто неслучайно)
  • Смешивающими событиями, происходящими одновременно
  • Общерыночными трендами, не связанными с событием

DiD решает эти проблемы, явно конструируя контрфактуал с использованием контрольных единиц.

Архитектура DiD

Данные до периода Данные после периода
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│Группа воздейств.│ │Группа воздейств.│
│ (Затронутые) │ │ (Затронутые) │
│ Y_В,до │ │ Y_В,после │
└─────────────────┘ └─────────────────┘
│ │
│ Δ_В = Y_В,после - Y_В,до │
└──────────────┬───────────────────┘
┌───────────────┐
│ DiD = Δ_В - Δ_К
│ (Причинный эффект)
└───────────────┘
┌──────────────┴───────────────────┐
│ Δ_К = Y_К,после - Y_К,до │
┌─────────────────┐ ┌─────────────────┐
│Контр. группа │ │Контр. группа │
│ (Незатронутые) │ │ (Незатронутые) │
│ Y_К,до │ │ Y_К,после │
└─────────────────┘ └─────────────────┘

Компоненты

  1. Идентификация воздействия: Определение, какие активы затронуты событием
  2. Выбор контроля: Подбор сопоставимых активов, не затронутых событием
  3. Анализ до-периода: Установление базовых трендов и проверка параллельных трендов
  4. Анализ после-периода: Измерение результатов после воздействия
  5. Оценивание: Расчёт DiD-оценки со стандартными ошибками

Расширения

  1. Staggered DiD: Когда воздействие происходит в разное время для разных единиц
  2. Тройная разность (DDD): Добавление третьего измерения дифференцирования
  3. Синтетический контроль DiD: Построение оптимальных контрольных весов
  4. Непрерывный DiD: Когда интенсивность воздействия варьируется

Математическая формулировка

Базовая двухпериодная модель

Для простого дизайна с двумя периодами и двумя группами:

Y_it = α + β·Treat_i + γ·Post_t + δ·(Treat_i × Post_t) + ε_it

Где:

  • Y_it: Результат для единицы i в момент t
  • Treat_i: 1, если единица в группе воздействия, 0 иначе
  • Post_t: 1, если период после воздействия, 0 иначе
  • δ: DiD-оценка (причинный эффект воздействия)
  • ε_it: Ошибка

Обобщённая многопериодная модель

С множеством временных периодов и двусторонними фиксированными эффектами (TWFE):

Y_it = α_i + λ_t + δ·D_it + X_it·β + ε_it

Где:

  • α_i: Фиксированные эффекты единиц (неизменные во времени характеристики)
  • λ_t: Фиксированные эффекты времени (общие тренды)
  • D_it: Индикатор воздействия (1, если единица i под воздействием в момент t)
  • X_it: Изменяющиеся во времени ковариаты
  • δ: Средний эффект воздействия на подвергшихся воздействию (ATT)

Тест параллельных трендов

Для проверки предположения о параллельных трендах оцените:

Y_it = α_i + λ_t + Σ_k δ_k·1(t=k)·Treat_i + ε_it

Где k индексирует время события относительно воздействия. Коэффициенты δ_k до воздействия для k < 0 должны быть статистически неотличимы от нуля.

Стандартные ошибки

Для панельных данных с потенциальной серийной корреляцией кластеризуйте стандартные ошибки на уровне единицы:

V̂(δ) = (X'X)^{-1} (Σ_i X_i' ε̂_i ε̂_i' X_i) (X'X)^{-1}

Реализация

Python

Реализация на Python использует PyTorch и включает:

  • python/model.py: DiD-оценка с регрессионными методами и matching
  • python/data_loader.py: Загрузка данных фондового рынка (yfinance) и криптовалют (Bybit)
  • python/backtest.py: Движок бэктестинга для торговых стратегий на основе DiD
from python.model import DifferenceInDifferences
model = DifferenceInDifferences(
treatment_col='treated',
time_col='post_treatment',
outcome_col='return',
covariates=['volume', 'volatility', 'market_cap'],
cluster_col='asset_id',
n_bootstrap=1000
)
# Обучить модель
results = model.fit(panel_data)
# Сгенерировать торговые сигналы
signals = model.generate_signals(
threshold=0.02, # Минимальный размер эффекта
confidence=0.95, # Уровень доверия
holding_period=5 # Дней удержания позиции
)

Rust

Реализация на Rust предоставляет production-ready версию:

  • src/model/: DiD-оценка с эффективными матричными операциями
  • src/data/: Клиент Bybit API и feature engineering
  • src/trading/: Генерация сигналов и исполнение стратегий
  • src/backtest/: Движок оценки производительности
Окно терминала
# Запустить базовый пример
cargo run --example basic_did
# Запустить торговую стратегию
cargo run --example trading_strategy
# Запустить анализ event study
cargo run --example event_study

Торговая стратегия

Генерация сигналов

Торговая стратегия на основе DiD выявляет возможности из:

  1. Регуляторных событий: Новые правила, затрагивающие конкретные секторы
  2. Листингов на биржах: Криптотокены, добавленные на крупные биржи
  3. Изменений политики: Решения центральных банков, фискальные объявления
  4. Корпоративных событий: Отчётность, M&A, смена менеджмента

Правила входа

  • Long: DiD-оценка > порога И статистически значима (p < 0.05)
  • Short: DiD-оценка < -порога И статистически значима
  • Flat: Эффект не значим или ниже порога

Размер позиции

Размер по принципу критерия Келли на основе величины эффекта и уверенности:

position_size = (DiD_оценка / std_error) × (confidence - 0.5) × scale_factor

Управление рисками

  • Максимальный размер позиции: 15% портфеля на событие
  • Стоп-лосс: 2× оценённая волатильность контрольной группы
  • Тейк-профит: 3× DiD-оценка эффекта
  • Максимум одновременных событий: 5
  • Минимальное окно до-воздействия: 30 дней

Детали реализации

  1. Обнаружение событий: Мониторинг новостных лент, регуляторных документов, объявлений бирж
  2. Построение контроля: Использование propensity score matching или синтетического контроля
  3. Валидация до-трендов: Проверка параллельных трендов перед торговлей
  4. Непрерывный мониторинг: Обновление оценок по мере поступления новых данных

Результаты и метрики

Метрики оценки

МетрикаОписание
RMSE / MAEТочность предсказания величины эффекта
Coverage RateПокрытие доверительного интервала
Sharpe RatioДоходность с учётом риска
Sortino RatioДоходность с учётом нисходящего риска
Maximum DrawdownХудшее падение от пика до дна
Hit RateПроцент правильных предсказаний направления
Profit FactorВаловая прибыль / Валовой убыток

Сравнение с базовыми моделями

Подход DiD сравнивается с:

  • Простым event study (аномальная доходность)
  • Propensity score matching без DiD
  • Buy-and-hold бенчмарком
  • Рыночно-нейтральной стратегией

Эмпирические применения

Примеры использования, включённые в эту главу:

  1. Листинги на криптобиржах: Измерение влияния на цену при листинге токенов на Binance/Bybit
  2. Регулирование акций: Влияние принудительных действий SEC на связанные акции
  3. Денежно-кредитная политика: Эффект объявлений FOMC на секторные ETF
  4. ESG события: Реакция рынка на изменения рейтингов устойчивости

Структура проекта

105_diff_in_diff_trading/
├── README.md # Этот файл (English)
├── README.ru.md # Перевод на русский
├── readme.simple.md # Упрощённое объяснение (English)
├── readme.simple.ru.md # Упрощённое объяснение (Russian)
├── Cargo.toml # Конфигурация проекта Rust
├── python/
│ ├── __init__.py
│ ├── model.py # Модель DiD-оценки
│ ├── data_loader.py # Загрузка данных акций и крипты
│ ├── backtest.py # Фреймворк бэктестинга
│ └── requirements.txt # Python зависимости
├── src/
│ ├── lib.rs # Корень библиотеки Rust
│ ├── model/
│ │ ├── mod.rs # Модуль модели
│ │ └── did.rs # Реализация DiD
│ ├── data/
│ │ ├── mod.rs # Модуль данных
│ │ ├── bybit.rs # Клиент Bybit API
│ │ └── features.rs # Feature engineering
│ ├── trading/
│ │ ├── mod.rs # Модуль торговли
│ │ ├── signals.rs # Генерация сигналов
│ │ └── strategy.rs # Торговая стратегия
│ └── backtest/
│ ├── mod.rs # Модуль бэктеста
│ └── engine.rs # Движок бэктестинга
└── examples/
├── basic_did.rs # Базовый пример DiD
├── event_study.rs # Анализ event study
└── trading_strategy.rs # Полная торговая стратегия

Литература

  1. Goodman-Bacon, A. (2021). Difference-in-Differences with Variation in Treatment Timing. Journal of Econometrics, 225(2), 254-277. https://www.sciencedirect.com/science/article/pii/S0304407621001445

  2. Roth, J., Sant’Anna, P. H. C., Bilinski, A., & Poe, J. (2023). What’s Trending in Difference-in-Differences? A Synthesis of the Recent Econometrics Literature. Journal of Econometrics, 235(2), 2218-2244. https://arxiv.org/abs/2201.01194

  3. de Chaisemartin, C., & D’Haultfœuille, X. (2020). Two-Way Fixed Effects Estimators with Heterogeneous Treatment Effects. American Economic Review, 110(9), 2964-2996.

  4. Callaway, B., & Sant’Anna, P. H. C. (2021). Difference-in-Differences with Multiple Time Periods. Journal of Econometrics, 225(2), 200-230.

  5. Abadie, A. (2005). Semiparametric Difference-in-Differences Estimators. Review of Economic Studies, 72(1), 1-19.

  6. Baker, A. C., Larcker, D. F., & Wang, C. C. (2022). How Much Should We Trust Staggered Difference-In-Differences Estimates? Journal of Financial Economics, 144(2), 370-395.

  7. Sun, L., & Abraham, S. (2021). Estimating Dynamic Treatment Effects in Event Studies with Heterogeneous Treatment Effects. Journal of Econometrics, 225(2), 175-199.

  8. MacKinlay, A. C. (1997). Event Studies in Economics and Finance. Journal of Economic Literature, 35(1), 13-39.

  9. De Prado, M. L. (2018). Advances in Financial Machine Learning. Wiley.

Лицензия

MIT