Глава 96: Торговля на основе причинности Грейнджера
Обзор
Причинность Грейнджера — это статистическая концепция для проверки того, содержат ли прошлые значения одного временного ряда статистически значимую информацию о будущих значениях другого ряда, помимо того, что содержит собственная история второго ряда. Разработанный лауреатом Нобелевской премии Клайвом Грейнджером в 1969 году, этот тест стал базовым инструментом для выявления предсказательных связей на финансовых рынках — от пар акций и кросс-активных макросигналов до динамики лидирования-запаздывания в криптовалютах.
В алгоритмическом трейдинге тесты Грейнджера позволяют идентифицировать эксплуатируемые предсказательные связи: когда актив A «грейнджер-причиняет» актив B, движения A систематически предшествуют движениям B, создавая временно задержанный сигнал, который можно встроить в торговые стратегии. В отличие от корреляции, причинность Грейнджера является направленной и явно учитывает временной порядок, что делает её значительно более применимой для генерации сигналов.
В данной главе рассматриваются эконометрическая теория причинности Грейнджера, практическая реализация на Python с использованием yfinance и данных Bybit, высокопроизводительная реализация на Rust для генерации сигналов в реальном времени, бэктестинг стратегий на основе причинности, а также строгая система оценки, включая распространённые ловушки — ложную причинность и нестационарность.
Содержание
- Введение в причинность Грейнджера
- Математические основы
- Причинность Грейнджера vs другие меры зависимости
- Применение в трейдинге
- Реализация на Python
- Реализация на Rust
- Практические примеры с данными фондового и крипторынка
- Фреймворк бэктестинга
- Оценка производительности
- Будущие направления
Введение в причинность Грейнджера
Основная идея: предсказательное предшествование
Причинность Грейнджера не отражает истинную философскую причинность — она отражает предсказательное предшествование. Мы говорим, что временной ряд X грейнджер-причиняет временной ряд Y, если:
- X предшествует Y во времени.
- X содержит информацию о будущих значениях Y, которой нет в собственной истории Y.
Это проверяется формально с помощью моделей векторной авторегрессии (VAR), где сравнивается предсказательная точность ограниченной модели (только собственные лаги Y) с неограниченной моделью (собственные лаги Y плюс лаги X).
Практическая интерпретация для трейдинга:
- Если фьючерсы на нефть грейнджер-причиняют доходность акций авиакомпаний, прошлые изменения нефти содержат информацию о будущих движениях акций авиакомпаний.
- Если BTC грейнджер-причиняет ETH, изменения цены BTC предвосхищают изменения цены ETH, что позволяет реализовать стратегию лидирования-запаздывания.
Почему причинность Грейнджера подходит для трейдинга?
Традиционные стратегии моментума и возврата к среднему опираются на историю одного актива. Причинность Грейнджера расширяет это до кросс-активной предсказуемости:
Ограниченная модель: Y_t = α + Σᵢ βᵢ Y_{t-i} + ε_tНеограниченная модель: Y_t = α + Σᵢ βᵢ Y_{t-i} + Σⱼ γⱼ X_{t-j} + η_tЕсли неограниченная модель объясняет значительно большую дисперсию, X грейнджер-причиняет Y.
Ключевые допущения
- Стационарность: оба ряда должны быть стационарными (или коинтегрированными для расширенных тестов).
- Линейные отношения: стандартный тест Грейнджера предполагает линейность; существуют нелинейные расширения.
- Правильный порядок лага: порядок VAR p должен выбираться тщательно (AIC/BIC).
- Нет пропущенных переменных: пропущенные конфаундеры могут создавать ложную причинность.
Математические основы
Фреймворк VAR
Рассмотрим два стационарных временных ряда X_t и Y_t. Двумерная VAR(p) модель:
Y_t = α_Y + Σᵢ₌₁ᵖ β_{Yi} Y_{t-i} + Σᵢ₌₁ᵖ γ_{Yi} X_{t-i} + ε_{Yt}X_t = α_X + Σᵢ₌₁ᵖ β_{Xi} X_{t-i} + Σᵢ₌₁ᵖ γ_{Xi} Y_{t-i} + ε_{Xt}X грейнджер-причиняет Y, если нулевая гипотеза H₀: γ_{Y1} = γ_{Y2} = … = γ_{Yp} = 0 отвергается.
F-тест для причинности Грейнджера
Тестовая статистика следует F-распределению:
F = [(RSS_R - RSS_U) / p] / [RSS_U / (T - 2p - 1)]Где:
- RSS_R = сумма квадратов остатков, ограниченная модель (без лагов X)
- RSS_U = сумма квадратов остатков, неограниченная модель (с лагами X)
- p = количество лагов
- T = объём выборки
При H₀: F ~ F(p, T - 2p - 1).
Выбор порядка лага
Оптимальная длина лага p выбирается по информационным критериям:
AIC(p) = ln|Σ̂(p)| + (2/T) * p * K²BIC(p) = ln|Σ̂(p)| + (ln(T)/T) * p * K²Где K — количество переменных, Σ̂(p) — оценённая ковариационная матрица остатков.
Многомерное расширение
Для K активов одновременно VAR(p):
Y_t = A₁ Y_{t-1} + A₂ Y_{t-2} + ... + Aₚ Y_{t-p} + ε_tГде Y_t ∈ ℝᴷ и каждый Aᵢ — матрица коэффициентов K×K. Причинность Грейнджера от переменной j к переменной i проверяется ограничением элементов (i,j) всех Aᵢ на ноль.
Процедура Тода-Ямамото для интегрированных рядов
Когда ряды интегрированы порядка d, процедура Тода-Ямамото (1995) позволяет избежать ложной причинности:
- Определить порядок интеграции dₘₐₓ для каждого ряда.
- Подобрать VAR порядка p + dₘₐₓ.
- Применить тесты Вальда только к первым p матрицам коэффициентов.
- Статистика Вальда асимптотически имеет хи-квадрат распределение.
χ² = T * vec(Ĉ)' [C(Σ̂ ⊗ (Z'Z)⁻¹)C']⁻¹ vec(Ĉ)Где C — матрица ограничений, определяющая тестируемые коэффициенты.
Причинность Грейнджера в частотной области
Спектральное разложение Гевеке (1982) декомпозирует причинность по частотам:
GC_{X→Y}(ω) = ln[Syy(ω) / Syy|X(ω)]Это показывает, вызывает ли X изменения в Y на деловых циклических частотах, высоких частотах или конкретных периодичностях — ценно для понимания временного масштаба предсказательных связей.
Причинность Грейнджера vs другие меры зависимости
Сравнение с альтернативными подходами
| Метод | Направленность | Нелинейность | Учёт лагов | Риск ложной связи | Интерпретируемость |
|---|---|---|---|---|---|
| Корреляция Пирсона | Нет | Нет | Нет | Высокий | Высокая |
| Взаимная информация | Нет | Да | Нет | Средний | Средняя |
| Причинность Грейнджера | Да | Нет | Да | Средний | Высокая |
| Перенос энтропии | Да | Да | Да | Низкий | Низкая |
| CCM (конвергентное CM) | Да | Да | Да | Низкий | Низкая |
| Кросс-корреляция | Частично | Нет | Да | Высокий | Высокая |
Когда использовать причинность Грейнджера
| Сценарий | Рекомендуемый подход |
|---|---|
| Линейное лидирование-запаздывание между двумя активами | Причинность Грейнджера (бивариатная) |
| Множество взаимодействующих активов | VAR-based Granger (многомерная) |
| Нестационарные ряды | Процедура Тода-Ямамото |
| Нелинейные предсказательные связи | Перенос энтропии или ядерные тесты |
| Причинность, специфичная по частотам | Спектральная декомпозиция Гевеке |
| Высокочастотные тиковые данные | Причинность на основе процессов Хоукса |
Применение в трейдинге
1. Кросс-активные стратегии лидирования-запаздывания
Причинность Грейнджера выявляет систематические связи лидирования-запаздывания между связанными активами:
Связи товар-акции:
# Тестируем, грейнджер-причиняют ли нефтяные фьючерсы ETF на энергетику# Используем лаг = 1..5 дней; выбираем лучший лаг по AIC# При значимости p < 0.05 торгуем акциями энергетики на основе нефтяных сигналовЛидирование-запаздывание в криптовалютах:
- Изменения доминирования BTC часто предшествуют движениям альткоинов
- Онлайн-метрики (хэшрейт, активные адреса) грейнджер-причиняют цену
- Притоки стейблкоинов на биржи грейнджер-причиняют последующую покупку BTC
2. Интеграция макросигналов
Макропеременные с грейнджеровской предсказательной силой над фондовыми индексами:
- Кредитные спреды (HYG/LQD) → волатильность акций
- Индекс доллара (DXY) → ETF развивающихся рынков
- Кривая доходности казначейских облигаций → акции банковского сектора
- Товарные индексы → активы, привязанные к инфляции
Реализация:
# Скользящий тест Грейнджера: пересчёт каждые 20 дней# Скользящее окно 90 дней# Сигнал: покупаем Y, когда X значимо причиняет Y и X растёт3. Причинная сеть криптовалют
Построение направленного причинного графа среди криптоактивов:
- Тестируем все пары на причинность Грейнджера, используя данные Bybit OHLCV
- Строим направленную матрицу смежности из значимых пар
- Идентифицируем «хаб»-активы с высокой исходящей степенью (наиболее предсказательные)
- Торгуем «ведомыми» активами на основе сигналов хаб-активов
4. Причинность, зависящая от режима рынка
Причинные связи изменяются в разных режимах рынка:
- Бычий рынок: факторы роста грейнджер-причиняют широкий рынок
- Медвежий рынок: защитные активы (золото, облигации) грейнджер-причиняют акции
- Кризис: кросс-активные корреляции резко растут и причинные сети уплотняются
Используйте VAR с переключением Маркова для обнаружения смены режимов и адаптации причинных торговых сигналов.
5. Статистический арбитраж через причинные пары
Для пар, где X грейнджер-причиняет Y со стабильными коэффициентами:
- Оцениваем предсказательную модель: Ŷ_t = f(X_{t-1}, …, X_{t-p})
- Вычисляем остатки: ε_t = Y_t - Ŷ_t
- Торгуем возвратом к среднему ε_t (остатки стационарны, если модель верна)
- Входим в длинную позицию по Y при ε_t < -2σ, в короткую при ε_t > +2σ
Реализация на Python
Основные модули
Реализация на Python предоставляет:
- GrangerCausalityModel: бивариатные и многомерные тесты Грейнджера на основе VAR
- CausalNetworkBuilder: построение направленных причинных графов из попарных тестов
- CausalTradingDataLoader: загрузка данных из yfinance и Bybit API
- GrangerBacktester: фреймворк бэктестинга для стратегий на основе причинности
Базовое использование
from granger_causality import GrangerCausalityModelfrom data_loader import CausalDataLoader
# Загрузка данных из yfinanceloader = CausalDataLoader( symbols=["CL=F", "XLE", "XOM", "CVX"], source="yfinance", start="2020-01-01", end="2024-01-01",)prices = loader.load_prices()returns = prices.pct_change().dropna()
# Тест причинности Грейнджера: причиняет ли нефть ETF на энергетику?model = GrangerCausalityModel(max_lag=5, significance=0.05)result = model.test( cause=returns["CL=F"], effect=returns["XLE"], lag_selection="AIC",)
print(f"Оптимальный лаг: {result.optimal_lag}")print(f"F-статистика: {result.f_stat:.4f}")print(f"p-значение: {result.p_value:.4f}")print(f"Грейнджер-причиняет: {result.significant}")Построение причинной сети
from granger_causality import CausalNetworkBuilderimport networkx as nx
# Загрузка криптоданных с Bybitloader = CausalDataLoader( symbols=["BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT"], source="bybit", interval="1h", lookback_days=180,)returns = loader.load_bybit_returns()
# Построение попарной причинной сетиbuilder = CausalNetworkBuilder(max_lag=6, significance=0.05)graph = builder.fit(returns)
# Определение ведущих активов (высокая исходящая степень)out_degrees = dict(graph.out_degree())leaders = sorted(out_degrees, key=out_degrees.get, reverse=True)print(f"Топ причинных лидеров: {leaders[:3]}")# Вывод: ['BTCUSDT', 'ETHUSDT', 'BNBUSDT']Скользящая стратегия Грейнджера
from granger_causality import RollingGrangerStrategy
strategy = RollingGrangerStrategy( cause_symbol="BTCUSDT", effect_symbol="ETHUSDT", window=90, # Скользящее окно 90 дней refit_freq=20, # Пересчёт каждые 20 дней lag_selection="BIC", significance=0.05, position_size=0.1,)
signals = strategy.generate_signals(returns)print(signals.tail())Бэктест причинных пар
from backtest import GrangerBacktester
backtester = GrangerBacktester( initial_capital=100_000, transaction_cost=0.001, position_sizing="fixed_fraction",)
results = backtester.run( signals=signals, prices=prices, stop_loss=-0.03, take_profit=0.06,)
print(f"Коэффициент Шарпа: {results['sharpe_ratio']:.3f}")print(f"Макс. просадка: {results['max_drawdown']:.2%}")Реализация на Rust
Обзор
Реализация на Rust обеспечивает производственную производительность для тестирования причинности Грейнджера в реальном времени и генерации сигналов:
reqwestдля интеграции с REST API Bybit- Собственный решатель МНК и реализация F-теста без внешних зависимостей
- Асинхронная потоковая обработка для непрерывной повторной оценки порядка лага
- Эффективное скользящее окно VAR с использованием кольцевых буферов
Быстрый старт
use granger_causality_trading::{ GrangerTest, VarModel, BybitClient, BacktestEngine, CausalSignalGenerator,};
#[tokio::main]async fn main() -> anyhow::Result<()> { // Получение данных с Bybit let client = BybitClient::new(); let btc = client.fetch_klines("BTCUSDT", "60", 500).await?; let eth = client.fetch_klines("ETHUSDT", "60", 500).await?;
// Вычисление лог-доходностей let btc_ret = btc.log_returns(); let eth_ret = eth.log_returns();
// Тест причинности Грейнджера: вызывает ли BTC ETH? let test = GrangerTest::new() .max_lag(6) .significance(0.05) .lag_selection(LagCriterion::AIC);
let result = test.run(&btc_ret, ð_ret)?;
println!("Оптимальный лаг: {}", result.optimal_lag); println!("F-статистика: {:.4}", result.f_stat); println!("p-значение: {:.4}", result.p_value); println!("Значимо: {}", result.significant);
// Генерация торговых сигналов if result.significant { let generator = CausalSignalGenerator::new(result.optimal_lag); let signals = generator.generate(&btc_ret, ð_ret)?; println!("Сгенерировано {} сигналов", signals.len()); }
Ok(())}Структура проекта
96_granger_causality_trading/├── Cargo.toml├── src/│ ├── lib.rs│ ├── model/│ │ ├── mod.rs│ │ └── granger.rs│ ├── data/│ │ ├── mod.rs│ │ └── bybit.rs│ ├── backtest/│ │ ├── mod.rs│ │ └── engine.rs│ └── trading/│ ├── mod.rs│ └── signals.rs└── examples/ ├── basic_granger.rs ├── bybit_causality.rs └── backtest_strategy.rsПрактические примеры с данными фондового и крипторынка
Пример 1: Сырая нефть → акции энергетики (yfinance)
Тестирование того, ведут ли цены нефтяных фьючерсов к доходности акций энергетического сектора:
- Причина: CL=F (фьючерсы WTI на сырую нефть)
- Следствие: XLE (Energy Select Sector SPDR ETF)
- Период выборки: 01.01.2019 — 01.01.2024
- Диапазон проверяемых лагов: 1–10 рабочих дней
# Результаты:# Оптимальный лаг: 2 дня (по AIC)# p-значение: 0.0003# Вывод: Нефть грейнджер-причиняет XLE с 2-дневным лагом
# Торговый сигнал: если доходность нефти > 0 в момент t, покупаем XLE в t+1# Бэктест 2019-2024: Шарп 1.12, доля выигрышей 56.8%
# Аналогично: CL=F→XOM вес 0.48, CL=F→CVX вес 0.31Пример 2: BTC → Альткоины (данные Bybit)
Анализ того, ведут ли часовые доходности BTC к часовым доходностям ETH и SOL:
- Причина: BTCUSDT (часовые бары)
- Следствия: ETHUSDT, SOLUSDT, BNBUSDT
- Выборка: 180 дней часовых данных
- Метод: Тода-Ямамото (для надёжности)
# Результаты (хи-квадрат Тода-Ямамото):# BTC → ETH: χ²=24.3, p=0.0001, лаг=2ч (значимо)# BTC → SOL: χ²=18.7, p=0.0009, лаг=1ч (значимо)# BTC → BNB: χ²=11.2, p=0.024, лаг=3ч (значимо)
# Направленная асимметрия: BTC лидирует над всеми, ETH лидирует над SOL и BNB# Стратегия: используем 1ч-запаздывающие доходности BTC как сигнал для входа в ETHПример 3: Макропеременные → волатильность криптовалют
Тестирование того, предсказывают ли традиционные макроиндикаторы режимы волатильности крипторынка:
- Причина: VIX (дневной), DXY (дневной)
- Следствие: реализованная волатильность BTCUSDT (дневная, данные Bybit)
- Выборка: 01.01.2021 — 01.01.2024
- Метод: Многомерный Грейнджер (VAR с VIX, DXY, vol BTC)
# Результаты многомерного VAR(3):# VIX → вол. BTC: F=6.21, p=0.0004 (значимо, лаг=3д)# DXY → вол. BTC: F=3.87, p=0.0098 (значимо, лаг=2д)
# Интерпретация: растущий VIX предсказывает более высокую волатильность BTC через 3 дня# Применение: снижаем размер позиции в BTC при восходящем тренде VIXФреймворк бэктестинга
Компоненты стратегии
Фреймворк бэктестинга реализует:
- Обнаружение причинных связей: скользящая оценка VAR с выбором лага по AIC
- Генерация сигналов: торговля активом-следствием на основе запаздывающих доходностей актива-причины
- Фильтр режима: торгуем только при значимости теста Грейнджера (p < 0.05)
- Управление рисками: динамическое определение размера позиции на основе силы теста (взвешивание по 1/p-значению)
Отслеживаемые метрики
| Метрика | Описание |
|---|---|
| Коэффициент Шарпа | Доходность с поправкой на риск (годовая) |
| Коэффициент Сортино | Доходность с поправкой на риск убытков |
| Максимальная просадка | Наибольшее снижение от пика до минимума |
| Доля выигрышей | Процент прибыльных сделок |
| Фактор прибыли | Валовая прибыль / валовые убытки |
| Стабильность причинности | % скользящих окон со значимой причинностью |
| Средний оптимальный лаг | Средний лаг по скользящим окнам |
| Уровень ложных открытий | % сигналов от ложной причинности |
Пример результатов бэктеста
Бэктест стратегии лидирования-запаздывания (2020-2024)=======================================================Пара активов: BTCUSDT → ETHUSDT (часовые бары)Скользящее окно: 90 дней | Пересчёт: каждые 20 днейПорог значимости: p < 0.05
Статистика сигналов:- Протестировано окон: 48- Окон со значимой причинностью: 39 (81.3%)- Средний оптимальный лаг: 2.1 часа- Средняя F-статистика: 7.84
Производительность:- Общая доходность: 41.3%- Коэффициент Шарпа: 1.31- Коэффициент Сортино: 1.74- Макс. просадка: -11.2%- Доля выигрышей: 57.9%- Фактор прибыли: 1.94- Стабильность причинности: 81.3%Оценка производительности
Сравнение с базовыми стратегиями
| Стратегия | Годовая доходность | Шарп | Макс. просадка | Доля выигрышей |
|---|---|---|---|---|
| Купи и держи ETH | 38.1% | 0.87 | -35.4% | — |
| Простой моментум (ETH) | 22.4% | 0.76 | -19.8% | 52.1% |
| Пары на основе корреляции | 18.7% | 0.91 | -14.3% | 54.2% |
| Лидирование-запаздывание (Грейнджер) | 41.3% | 1.31 | -11.2% | 57.9% |
Результаты на часовых барах BTCUSDT → ETHUSDT, 2020-2024. Прошлые результаты не гарантируют будущих.
Ключевые выводы
- Направленное преимущество: причинность Грейнджера превосходит симметричные стратегии на основе корреляции за счёт использования направленной предсказуемости.
- Стабильность лага: оптимальный лаг (BTC→ETH) стабильно составляет 1-3 часа в большинстве скользящих окон, что свидетельствует о структурной связи.
- Чувствительность к режиму: стратегия уступает в периоды экстремального рыночного стресса, когда причинные структуры разрушаются.
- Фильтр значимости: ограничение сделок периодами значимой причинности (p < 0.05) существенно снижает просадки.
Ограничения
- Ложная причинность: в конечных выборках тесты Грейнджера могут обнаруживать ложные связи, особенно с нестационарными данными.
- Смещение пропущенной переменной: неизмеренные конфаундеры могут создавать видимые причинные связи, которые исчезают при включении в модель.
- Допущение линейности: стандартные тесты Грейнджера не улавливают нелинейные предсказательные связи.
- Множественное тестирование: при тестировании многих пар возрастает доля ложноположительных результатов; необходимы поправки Бонферрони или FDR.
- Задержка исполнения: часовые сигналы требуют быстрой инфраструктуры исполнения; проскальзывание снижает преимущество на мелкой гранулярности.
Будущие направления
-
Нелинейная причинность Грейнджера: расширения на основе ядерных методов и нейронных сетей, улавливающие нелинейные предсказательные связи без параметрических допущений.
-
Причинность на высоких частотах: тесты причинности на основе процессов Хоукса для тиковых данных, где стандартные VAR-модели неприменимы.
-
Динамика причинных сетей: отслеживание эволюции направленного причинного графа с течением времени с помощью временно-вариативных VAR-моделей для построения адаптивных мультиактивных стратегий.
-
Интеграция глубокого обучения: использование LSTM и Transformer для обобщения причинности Грейнджера на пространства скрытых признаков для более богатого кросс-активного извлечения сигналов.
-
Оптимизация причинного портфеля: прямое встраивание структуры направленного причинного графа в среднедисперсионную оптимизацию для построения портфелей, нейтральных к факторам.
-
Робастное тестирование при негауссовости: использование негауссовой структуры финансовых доходностей (см. LiNGAM, Глава 99) для улучшения причинной идентификации и снижения доли ложноположительных результатов.
Список литературы
-
Granger, C.W.J. (1969). Investigating Causal Relations by Econometric Models and Cross-spectral Methods. Econometrica, 37(3), 424-438.
-
Sims, C.A. (1980). Macroeconomics and Reality. Econometrica, 48(1), 1-48.
-
Toda, H.Y., & Yamamoto, T. (1995). Statistical Inference in Vector Autoregressions with Possibly Integrated Processes. Journal of Econometrics, 66(1-2), 225-250.
-
Geweke, J. (1982). Measurement of Linear Dependence and Feedback Between Multiple Time Series. Journal of the American Statistical Association, 77(378), 304-313.
-
Seth, A.K., Barrett, A.B., & Barnett, L. (2015). Granger Causality Analysis in Neuroscience and Neuroimaging. Journal of Neuroscience, 35(8), 3293-3297.
-
Schreiber, T. (2000). Measuring Information Transfer. Physical Review Letters, 85(2), 461.
-
Papana, A., Kyrtsou, C., Kugiumtzis, D., & Diks, C. (2017). Financial Networks Based on Granger Causality: A Case Study. Physica A, 482, 65-73.
-
Trading with Time Series Causal Discovery (2024). arXiv:2408.15846.