Глава 110: Контрфактическая торговля
Обзор
Контрфактическая торговля — это продвинутый подход к алгоритмической торговле, использующий контрфактическое рассуждение из каузального вывода для оценки торговых решений. В отличие от традиционного бэктестинга, который рассматривает только то, что произошло, контрфактический анализ спрашивает: “Что БЫ произошло, если бы я принял другое решение?”
Эта методология позволяет трейдерам:
- Оценивать истинное влияние торговых решений
- Определять оптимальные действия в ретроспективе с правильной каузальной корректировкой
- Строить более устойчивые торговые стратегии через понимание каузальных механизмов
- Избегать конфаундеров, которые преследуют традиционную атрибуцию результатов
Ключевое понимание в том, что мы можем оценить контрфактические исходы с помощью структурных каузальных моделей, что позволяет отвечать на вопросы типа “Какой была бы моя прибыль, если бы я НЕ совершил эту сделку?” или “Что если бы я использовал другой размер позиции?”
Содержание
- Введение в контрфактическое рассуждение
- Контрфактуалы в контексте торговли
- Математические основы
- Методы оценки контрфактуалов
- Применение в торговле
- Реализация на Python
- Реализация на Rust
- Практические примеры с данными акций и криптовалют
- Фреймворк бэктестинга
- Оценка производительности
- Будущие направления
- Литература
Введение в контрфактическое рассуждение
Что такое контрфактуалы?
Контрфактуал — это утверждение “что, если” об альтернативном сценарии, который на самом деле не произошёл:
- Факт: “Я купил акцию 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} — индикатор воздействияКонтрфактуалы в контексте торговли
Торговля как назначение воздействия
В торговле мы можем представить решения как назначения воздействия:
| Торговый концепт | Каузальный концепт |
|---|---|
| Исполнение сделки | Воздействие |
| Без сделки | Контроль |
| Доходности | Исход |
| Рыночные условия | Ковариаты |
| Торговая стратегия | Политика воздействия |
Ключевые контрфактические вопросы в торговле
-
Атрибуция сделки: “Сколько моей доходности было благодаря ЭТОЙ конкретной сделке vs. движению рынка?”
-
Оценка стратегии: “Какую доходность показал бы мой портфель, если бы я использовал Стратегию B вместо Стратегии A?”
-
Размер позиции: “Что если бы я удвоил размер позиции?”
-
Тайминг: “Что если бы я вошёл на день раньше/позже?”
-
Риск-менеджмент: “Что произошло бы, если бы я не использовал стоп-лоссы?”
Математические основы
Структурные каузальные модели (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 CounterfactualEstimatorimport numpy as npimport 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% |
Будущие направления
- Глубокие контрфактические модели: Нейронные сети для сложной контрфактической оценки
- Изменяющиеся во времени эффекты: Гетерогенные эффекты по рыночным режимам
- Многодействийные контрфактуалы: Помимо бинарного воздействия (размер позиции)
- Контрфактическое обучение с подкреплением: Комбинация с RL для оптимального исполнения
Литература
- Pearl, J. (2009). Causality: Models, Reasoning, and Inference. Cambridge University Press.
- Imbens, G. W., & Rubin, D. B. (2015). Causal Inference for Statistics, Social, and Biomedical Sciences.
- Athey, S., & Imbens, G. W. (2017). The State of Applied Econometrics: Causality and Policy Evaluation.
- Chernozhukov, V., et al. (2018). Double/Debiased Machine Learning for Treatment and Structural Parameters.
Запуск примеров
Python
cd 110_counterfactual_trading/pythonpip install -r requirements.txtpython model.py # Тест контрфактической оценкиpython backtest.py # Запуск контрфактического бэктестаRust
cd 110_counterfactual_trading/rustcargo build --releasecargo run --example counterfactual_demo