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

Глава 110: Контрфактическая торговля

Обзор

Контрфактическая торговля — это продвинутый подход к алгоритмической торговле, использующий контрфактическое рассуждение из каузального вывода для оценки торговых решений. В отличие от традиционного бэктестинга, который рассматривает только то, что произошло, контрфактический анализ спрашивает: “Что БЫ произошло, если бы я принял другое решение?”

Эта методология позволяет трейдерам:

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

Ключевое понимание в том, что мы можем оценить контрфактические исходы с помощью структурных каузальных моделей, что позволяет отвечать на вопросы типа “Какой была бы моя прибыль, если бы я НЕ совершил эту сделку?” или “Что если бы я использовал другой размер позиции?”

Содержание

  1. Введение в контрфактическое рассуждение
  2. Контрфактуалы в контексте торговли
  3. Математические основы
  4. Методы оценки контрфактуалов
  5. Применение в торговле
  6. Реализация на Python
  7. Реализация на Rust
  8. Практические примеры с данными акций и криптовалют
  9. Фреймворк бэктестинга
  10. Оценка производительности
  11. Будущие направления
  12. Литература

Введение в контрфактическое рассуждение

Что такое контрфактуалы?

Контрфактуал — это утверждение “что, если” об альтернативном сценарии, который на самом деле не произошёл:

  • Факт: “Я купил акцию X и заработал $100”
  • Контрфактуал: “Сколько бы я заработал, если бы НЕ купил акцию X?”
Временная линия:
─────────────────────────────────────────────────────────
t=0 t=1 t=2
│ │ │
▼ ▼ ▼
Решение: Результат: Итог:
Купить X Цена +5% P&L = +$100
Контрфактический мир:
─────────────────────────────────────────────────────────
t=0 t=1 t=2
│ │ │
▼ ▼ ▼
Решение: Результат: Итог:
Не покупать Цена +5% P&L = $0
(та же цена) (нет позиции)

Фундаментальная проблема каузального вывода

Мы никогда не можем наблюдать оба исхода для одного и того же субъекта в одно и то же время — это называется “фундаментальная проблема каузального вывода”. В торговле:

  • Если вы совершили сделку, вы не можете знать, что было бы без неё
  • Если вы не торговали, вы не можете знать, что было бы, если бы торговали

Фреймворк потенциальных исходов

Фреймворк потенциальных исходов Неймана-Рубина формализует контрфактуалы:

  • Y(1): Исход при воздействии (например, совершённая сделка)
  • Y(0): Исход без воздействия (например, без сделки)
  • Индивидуальный эффект воздействия (ITE): τᵢ = Yᵢ(1) - Yᵢ(0)

Мы наблюдаем:

Yᵢ = Tᵢ · Yᵢ(1) + (1 - Tᵢ) · Yᵢ(0)
где Tᵢ ∈ {0, 1} — индикатор воздействия

Контрфактуалы в контексте торговли

Торговля как назначение воздействия

В торговле мы можем представить решения как назначения воздействия:

Торговый концептКаузальный концепт
Исполнение сделкиВоздействие
Без сделкиКонтроль
ДоходностиИсход
Рыночные условияКовариаты
Торговая стратегияПолитика воздействия

Ключевые контрфактические вопросы в торговле

  1. Атрибуция сделки: “Сколько моей доходности было благодаря ЭТОЙ конкретной сделке vs. движению рынка?”

  2. Оценка стратегии: “Какую доходность показал бы мой портфель, если бы я использовал Стратегию B вместо Стратегии A?”

  3. Размер позиции: “Что если бы я удвоил размер позиции?”

  4. Тайминг: “Что если бы я вошёл на день раньше/позже?”

  5. Риск-менеджмент: “Что произошло бы, если бы я не использовал стоп-лоссы?”


Математические основы

Структурные каузальные модели (SCM)

SCM M = (U, V, F) состоит из:

  • U: Экзогенные (внешние) переменные
  • V: Эндогенные (внутренние) переменные
  • F: Структурные уравнения Vᵢ = fᵢ(PAᵢ, Uᵢ)

Три уровня каузальной иерархии

Каузальная иерархия Пёрла (Лестница причинности):

Уровень 3: КОНТРФАКТУАЛЫ (Воображение)
─────────────────────────────────────────────
"Каким был бы Y, если бы X был другим?"
P(Yₓ | X=x', Y=y')
Требуется: Полная спецификация SCM
Уровень 2: ИНТЕРВЕНЦИИ (Действие)
─────────────────────────────────────────────
"Что произойдёт, если я сделаю X?"
P(Y | do(X))
Требуется: Каузальный граф + данные
Уровень 1: АССОЦИАЦИИ (Наблюдение)
─────────────────────────────────────────────
"Что, если я увижу X?"
P(Y | X)
Требуется: Только данные

Вычисление контрфактуалов: три шага

Шаг 1: Абдукция — Использовать свидетельства для определения значений экзогенных переменных U

Шаг 2: Действие — Модифицировать модель согласно интервенции

Шаг 3: Предсказание — Вычислить контрфактический исход


Методы оценки контрфактуалов

Метод 1: Twin Networks (Двойниковые сети)

Создаём “двойника” наблюдаемого субъекта в контрфактическом мире:

Наблюдаемый мир: Контрфактический мир:
U U (тот же!)
│ │
▼ ▼
X ─────→ Y X' ─────→ Y'
(наблюдаемый) (контрфактический)

Метод 2: Сопоставление (Matching)

Найти похожие субъекты, которые получили разное воздействие.

Метод 3: Регрессия исходов

Моделировать исход как функцию воздействия и ковариат:

Y = f(T, X) + ε
Контрфактуал:
Ŷ(t') = f(t', X) для любого значения воздействия t'

Метод 4: Дважды робастная оценка

Комбинирует оценки склонности и регрессию исходов для большей устойчивости к ошибкам спецификации модели.


Применение в торговле

1. Контрфактическая атрибуция сделок

Разложить доходности на каузальные компоненты:

Общая доходность = Рыночный эффект + Эффект стратегии + Остаток
Где:
- Рыночный эффект = E[Y | do(Рынок), без сделки]
- Эффект стратегии = Y_{наблюдаемый} - Y_{контрфактуал: без сделки}
- Остаток = Необъяснённая вариация

2. Обучение оптимальной политики

Использовать контрфактические исходы для обучения оптимальных торговых политик:

π*(x) = argmax_a E[Y(a) | X = x]

3. Анализ “Что-если”

Оценка альтернативных стратегий и сценариев.

4. Минимизация сожалений

Сожаление(t) = max_a Y_t(a) - Y_t(A_t)
где:
- Y_t(a) = контрфактическая доходность при действии a
- A_t = действие, которое было предпринято

Реализация на Python

Основной класс оценщика

from model import CounterfactualEstimator
import numpy as np
import pandas as pd
# Подготовка данных
features = compute_market_features(prices)
treatment = (signals != 0).astype(int)
outcome = signals * returns
# Обучение модели
estimator = CounterfactualEstimator(method='doubly_robust')
estimator.fit(features, treatment, outcome)
# Оценка контрфактуала
result = estimator.estimate_counterfactual(
features_today, treatment=1, observed_outcome=0.02
)
print(f"Наблюдаемый исход: {result.observed_outcome:.4f}")
print(f"Контрфактический исход: {result.counterfactual_outcome:.4f}")
print(f"Эффект воздействия: {result.treatment_effect:.4f}")

Бэктестинг с контрфактуалами

from backtest import CounterfactualBacktester
backtester = CounterfactualBacktester(transaction_cost=0.001)
result = backtester.run(prices, signals, train_ratio=0.5)
print(f"Общая доходность: {result.total_return:.2%}")
print(f"Контрфактическая доходность: {result.counterfactual_return:.2%}")
print(f"Альфа стратегии: {result.strategy_alpha:.2%}")
print(f"Коэффициент Шарпа: {result.sharpe_ratio:.2f}")

Реализация на Rust

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

110_counterfactual_trading/rust/
├── Cargo.toml
├── src/
│ └── lib.rs
└── examples/
└── counterfactual_demo.rs

Использование

use counterfactual_trading::DoublyRobustEstimator;
let mut estimator = DoublyRobustEstimator::new();
estimator.fit(&x_train, &treatment_train, &outcome_train);
let ate = estimator.estimate_ate(&x_test, &treatment_test, &outcome_test);
println!("Средний эффект воздействия: {:.4}", ate.ate);

Практические примеры

Пример 1: Анализ акций

import yfinance as yf
data = yf.download('AAPL', start='2020-01-01', end='2024-01-01')
# ... подготовка данных и анализ

Пример 2: Криптовалюты (Bybit)

data = fetch_bybit_data("BTCUSDT", "D", 500)
# ... контрфактический анализ криптовалют

Оценка производительности

Сводка метрик

МетрикаОписаниеЦелевое значение
Альфа стратегииДоходность от торговых решений> 0
t-статистика альфыСтатистическая значимость> 2.0
Контрфактическое сожалениеНасколько лучше могли сделатьМинимизировать
Коэффициент ШарпаДоходность с поправкой на риск> 1.0
Win Rate решений% решений с положительным эффектом> 50%

Будущие направления

  1. Глубокие контрфактические модели: Нейронные сети для сложной контрфактической оценки
  2. Изменяющиеся во времени эффекты: Гетерогенные эффекты по рыночным режимам
  3. Многодействийные контрфактуалы: Помимо бинарного воздействия (размер позиции)
  4. Контрфактическое обучение с подкреплением: Комбинация с RL для оптимального исполнения

Литература

  1. Pearl, J. (2009). Causality: Models, Reasoning, and Inference. Cambridge University Press.
  2. Imbens, G. W., & Rubin, D. B. (2015). Causal Inference for Statistics, Social, and Biomedical Sciences.
  3. Athey, S., & Imbens, G. W. (2017). The State of Applied Econometrics: Causality and Policy Evaluation.
  4. Chernozhukov, V., et al. (2018). Double/Debiased Machine Learning for Treatment and Structural Parameters.

Запуск примеров

Python

Окно терминала
cd 110_counterfactual_trading/python
pip install -r requirements.txt
python model.py # Тест контрфактической оценки
python backtest.py # Запуск контрфактического бэктеста

Rust

Окно терминала
cd 110_counterfactual_trading/rust
cargo build --release
cargo run --example counterfactual_demo