Глава 131: C-Mamba — Корреляция каналов
Обзор
C-Mamba (Channel Correlation Enhanced State Space Models) — это новая архитектура глубокого обучения для прогнозирования многомерных временных рядов, которая эффективно захватывает как межвременные, так и межканальные зависимости. Предложенная Zeng et al. (2024), C-Mamba решает фундаментальные ограничения существующих методов прогнозирования: линейные модели ограничены в представлении, Трансформеры страдают от квадратичной сложности, а CNN имеют ограниченное рецептивное поле.
В алгоритмическом трейдинге C-Mamba особенно ценна для моделирования коррелированных финансовых инструментов. Финансовые рынки демонстрируют сильные межактивные зависимости: криптовалюты движутся вместе, секторные акции коррелируют, а глобальные макрофакторы влияют на несколько классов активов одновременно. Традиционные подходы Channel-Independent (CI) игнорируют эти корреляции, что приводит к неоптимальным прогнозам. Channel-Dependent (CD) подход C-Mamba явно моделирует эти взаимосвязи.
Содержание
- Введение в C-Mamba
- Математические основы
- Компоненты архитектуры
- Применение в трейдинге
- Реализация на Python
- Реализация на Rust
- Практические примеры
- Фреймворк бэктестинга
- Оценка производительности
- Будущие направления
Введение в C-Mamba
Проблема: многомерные временные ряды в финансах
Финансовые рынки генерируют данные многомерных временных рядов со сложными зависимостями:
- Межвременные зависимости: Как прошлые цены актива предсказывают его будущие цены
- Межканальные зависимости: Как цены разных активов связаны друг с другом
Традиционные подходы обрабатывают их по-разному:
| Подход | Межвременные | Межканальные | Ограничения |
|---|---|---|---|
| ARIMA/VAR | Линейные | Линейные | Ограниченный захват нелинейностей |
| LSTM/GRU | Нелинейные | Ограниченные | Последовательная обработка, медленно |
| Transformer | Нелинейные | Внимание | O(n²) сложность |
| C-Mamba | Нелинейные (SSM) | GDD-MLP | O(n) сложность |
Почему модели пространства состояний?
Модели пространства состояний (SSM) предлагают привлекательную альтернативу механизмам внимания:
h_t = A * h_{t-1} + B * x_t (обновление состояния)y_t = C * h_t + D * x_t (выход)Mamba улучшает SSM с помощью:
- Зависимый от данных отбор: Параметры A, B, C адаптируются к входу
- Линейная сложность: O(n) вместо O(n²) для внимания
- Дальние зависимости: Эффективное рецептивное поле охватывает всю последовательность
Обзор архитектуры C-Mamba
Вход: [Батч, Последовательность, Каналы] │ ▼ ┌───────────────┐ │ Patch Embed │ → Разбиение на патчи └───────────────┘ │ ▼ ┌───────────────┐ │ M-Mamba │ → Межвременные зависимости └───────────────┘ │ ▼ ┌───────────────┐ │ GDD-MLP │ → Межканальные зависимости └───────────────┘ │ ▼ ┌───────────────┐ │ Проекция │ → Выходные прогнозы └───────────────┘ │ ▼Выход: [Батч, Длина_прогноза, Каналы]Математические основы
Селективная модель пространства состояний (S6)
Ядро Mamba — это селективная модель пространства состояний с зависимыми от данных параметрами:
Непрерывная форма:
h'(t) = A(x) * h(t) + B(x) * x(t)y(t) = C(x) * h(t)Дискретизированная форма (с шагом Δ):
h_t = Ā * h_{t-1} + B̄ * x_ty_t = C * h_tГде:
Ā = exp(Δ * A)(дискретизированная матрица состояния)B̄ = (Δ * A)⁻¹ * (exp(Δ * A) - I) * Δ * B(дискретизированная входная матрица)- A, B, C — обучаемые и зависящие от входа
M-Mamba: модифицированная Mamba для временных рядов
M-Mamba адаптирует Mamba для временных рядов:
- Двунаправленное сканирование: Прямая и обратная ветви SSM захватывают прошлый и будущий контекст
- Обработка на основе патчей: Вход разбивается на патчи для эффективности
# Двунаправленная M-Mambaforward_output = mamba_forward(x)backward_output = mamba_backward(x.flip(dims=[1]))output = forward_output + backward_output.flip(dims=[1])GDD-MLP: глобально-локальный двухветочный MLP
GDD-MLP захватывает межканальные зависимости через две параллельные ветви:
Глобальная ветвь:
z_global = MLP(GlobalPool(x)) # Захватывает общие паттерны каналовЛокальная ветвь:
z_local = MLP(x) # Сохраняет специфику каналовКомбинация:
output = z_global + z_localЭтот двухветочный дизайн балансирует:
- Глобальные паттерны (рыночные тренды)
- Локальные паттерны (движения отдельных активов)
Channel Mixup: аугментация данных
Channel Mixup улучшает обобщение путём смешивания информации каналов при обучении:
# При обученииlambda_ = Beta(alpha, alpha).sample()mixed_x = lambda_ * x + (1 - lambda_) * x[:, :, shuffle_idx]Преимущества для трейдинга:
- Предотвращает переобучение на конкретные комбинации активов
- Улучшает устойчивость к изменяющимся корреляциям
- Обеспечивает трансферное обучение между классами активов
Компоненты архитектуры
1. Эмбеддинг патчей
Преобразует временные ряды в представления патчей:
class PatchEmbedding: def __init__(self, patch_len, stride, d_model): self.patch_len = patch_len self.stride = stride self.linear = nn.Linear(patch_len, d_model)
def forward(self, x): # x: [B, L, C] patches = x.unfold(1, self.patch_len, self.stride) # [B, N, C, P] patches = patches.permute(0, 2, 1, 3) # [B, C, N, P] return self.linear(patches) # [B, C, N, D]2. Блок M-Mamba
class MMambaBlock: def __init__(self, d_model, d_state, d_conv): self.mamba_forward = Mamba(d_model, d_state, d_conv) self.mamba_backward = Mamba(d_model, d_state, d_conv) self.norm = nn.LayerNorm(d_model)
def forward(self, x): # Двунаправленная обработка fwd = self.mamba_forward(x) bwd = self.mamba_backward(x.flip(1)).flip(1) return self.norm(x + fwd + bwd)3. Блок GDD-MLP
class GDDMLPBlock: def __init__(self, n_channels, d_model, expansion=4): # Глобальная ветвь self.global_pool = nn.AdaptiveAvgPool1d(1) self.global_mlp = MLP(n_channels, n_channels * expansion)
# Локальная ветвь self.local_mlp = MLP(d_model, d_model * expansion)
def forward(self, x): # x: [B, C, N, D] # Глобально: внимание по каналам global_feat = self.global_pool(x.mean(-1)) # [B, C, 1] global_out = self.global_mlp(global_feat.squeeze()) # [B, C]
# Локально: позиционная обработка local_out = self.local_mlp(x) # [B, C, N, D]
return local_out + global_out.unsqueeze(-1).unsqueeze(-1)4. Полная модель C-Mamba
class CMamba: def __init__(self, config): self.patch_embed = PatchEmbedding( config.patch_len, config.stride, config.d_model ) self.m_mamba_blocks = nn.ModuleList([ MMambaBlock(config.d_model, config.d_state, config.d_conv) for _ in range(config.n_layers) ]) self.gdd_mlp = GDDMLPBlock( config.n_channels, config.d_model ) self.projection = nn.Linear( config.d_model * config.n_patches, config.pred_len )
def forward(self, x): # x: [B, L, C] x = self.patch_embed(x) # [B, C, N, D]
for block in self.m_mamba_blocks: x = block(x)
x = self.gdd_mlp(x) x = x.flatten(2) # [B, C, N*D]
return self.projection(x).transpose(1, 2) # [B, pred_len, C]Применение в трейдинге
1. Прогнозирование цен нескольких активов
C-Mamba отлично прогнозирует коррелированные цены активов:
# Прогноз на 5 дней для 10 криптовалют одновременноmodel = CMamba( seq_len=60, # 60 дней истории pred_len=5, # 5 дней прогноза n_channels=10, # 10 криптовалют)
# Вход: [batch, 60, 10] → Выход: [batch, 5, 10]predictions = model(historical_prices)Применения:
- Прогнозирование на уровне портфеля
- Генерация сигналов парного трейдинга
- Стратегии межактивного моментума
2. Определение режимов корреляции
Веса внимания модуля GDD-MLP раскрывают структуру корреляций:
# Извлечение весов внимания каналовwith torch.no_grad(): _, attention = model.gdd_mlp(x, return_attention=True)
# attention: [B, C, C] — матрица корреляции каналов# Использование для определения режимаcorrelation_regime = attention.mean(0) # Средняя матрица корреляцииТорговые сигналы:
- Высокая корреляция → рыночный стресс, сокращение позиций
- Низкая корреляция → нормальные условия, использование диверсификации
- Изменение корреляции → смена режима, корректировка стратегии
3. Обнаружение опережающе-запаздывающих отношений
Двунаправленное сканирование M-Mamba захватывает временные взаимосвязи:
# Анализ какие активы опережают/запаздываютforward_importance = model.analyze_forward_dependencies()backward_importance = model.analyze_backward_dependencies()
# Активы с высокой прямой важностью "опережают" рынок# Активы с высокой обратной важностью "запаздывают" за рынком4. Моделирование факторов риска
Межканальные зависимости могут выявить общие факторы риска:
# Факторная декомпозиция из корреляций каналовfactors = extract_factors(model.gdd_mlp.weights)
# Использование факторов для:# - Аллокации с паритетом риска# - Построения факторно-нейтральных портфелей# - Стресс-тестированияРеализация на Python
Структура проекта
131_c_mamba_channel_correlation/├── python/│ ├── __init__.py│ ├── cmamba_model.py # Ядро C-Mamba│ ├── data_loader.py # Загрузка данных с Bybit/Yahoo│ ├── backtest.py # Фреймворк бэктестинга│ ├── train.py # Утилиты обучения│ └── requirements.txt # ЗависимостиБазовое использование
from python.cmamba_model import CMamba, CMambaConfigfrom python.data_loader import MultiAssetDataLoader
# Конфигурация моделиconfig = CMambaConfig( seq_len=60, pred_len=5, n_channels=10, d_model=64, d_state=16, n_layers=2, patch_len=12, stride=6,)
# Загрузка данныхloader = MultiAssetDataLoader( symbols=["BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT", "ADAUSDT", "AVAXUSDT", "DOTUSDT", "MATICUSDT", "LINKUSDT"], source="bybit", interval="D",)train_data, val_data, test_data = loader.load_and_split( start_date="2022-01-01", end_date="2024-01-01", val_ratio=0.1, test_ratio=0.1,)
# Инициализация и обучениеmodel = CMamba(config)trainer = CMambaTrainer(model, learning_rate=1e-3)trainer.train(train_data, val_data, epochs=100)
# Генерация прогнозовforecasts = model.predict(test_data)Бэктест стратегии
from python.backtest import CMambaBacktester
backtester = CMambaBacktester( model=model, initial_capital=100_000, transaction_cost=0.001, rebalance_freq="weekly",)
# Стратегия: лонг топ по прогнозу, шорт худшихstrategy = { "long_top_n": 3, "short_bottom_n": 2, "position_size": "equal_weight", "stop_loss": 0.05,}
results = backtester.run(test_data, strategy)print(f"Коэффициент Шарпа: {results['sharpe_ratio']:.3f}")print(f"Максимальная просадка: {results['max_drawdown']:.2%}")Реализация на Rust
Структура проекта
131_c_mamba_channel_correlation/├── rust/│ ├── Cargo.toml│ ├── src/│ │ ├── lib.rs│ │ ├── model/│ │ │ ├── mod.rs│ │ │ ├── cmamba.rs # Ядро C-Mamba│ │ │ ├── mamba.rs # Mamba SSM│ │ │ └── gdd_mlp.rs # GDD-MLP│ │ ├── data/│ │ │ ├── mod.rs│ │ │ ├── bybit.rs # Клиент Bybit API│ │ │ └── types.rs # Структуры данных│ │ ├── backtest/│ │ │ ├── mod.rs│ │ │ └── engine.rs # Движок бэктеста│ │ └── trading/│ │ ├── mod.rs│ │ └── signals.rs # Генерация сигналов│ └── examples/│ ├── fetch_data.rs│ ├── train_model.rs│ └── backtest.rsБыстрый старт
cd 131_c_mamba_channel_correlation/rust
# Загрузка исторических данных с Bybitcargo run --example fetch_data
# Обучение моделиcargo run --example train_model
# Запуск бэктестаcargo run --example backtestПример использования Rust
use cmamba_trading::{ CMamba, CMambaConfig, BybitClient, BacktestEngine,};
#[tokio::main]async fn main() -> anyhow::Result<()> { // Конфигурация модели let config = CMambaConfig { seq_len: 60, pred_len: 5, n_channels: 10, d_model: 64, d_state: 16, n_layers: 2, patch_len: 12, stride: 6, };
// Получение данных с Bybit let client = BybitClient::new(); let symbols = vec![ "BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT", "ADAUSDT", "AVAXUSDT", "DOTUSDT", "MATICUSDT", "LINKUSDT", ];
let data = client.fetch_multi_asset(&symbols, "D", 365).await?;
// Создание и использование модели let model = CMamba::new(config); let predictions = model.predict(&data)?;
// Запуск бэктеста let engine = BacktestEngine::new(100_000.0, 0.001); let results = engine.run(&predictions, &data)?;
println!("Коэффициент Шарпа: {:.3}", results.sharpe_ratio); println!("Максимальная просадка: {:.2}%", results.max_drawdown * 100.0);
Ok(())}Практические примеры
Пример 1: Прогнозирование криптовалютного портфеля
Прогнозирование 10 крупнейших криптовалют с помощью C-Mamba:
# Настройкаsymbols = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT", "ADAUSDT", "AVAXUSDT", "DOTUSDT", "MATICUSDT", "LINKUSDT"]
# Результаты бэктеста (данные 2023):# - MSE: 0.0023 (нормализованный)# - MAE: 0.0312# - Направленная точность: 58.4%# - Захват межканальной корреляции: 0.87 R²Наблюдаемые корреляции каналов:
- BTC-ETH: 0.92 (наивысшая, движутся вместе)
- SOL-AVAX: 0.78 (оба L1 блокчейны)
- XRP-ADA: 0.71 (схожее рыночное позиционирование)
Пример 2: Корреляция акций сектора
Использование C-Mamba для акций технологического сектора:
# FAANG + крупные технологические компанииsymbols = ["AAPL", "GOOGL", "MSFT", "META", "AMZN", "NVDA", "TSLA"]
# Модель захватывает:# - Секторные движения (глобальная ветвь)# - Паттерны отдельных акций (локальная ветвь)# - Опережающе-запаздывающие отношения (двунаправленная Mamba)Пример 3: Стратегия межактивного моментума
# Еженедельная ребалансировка на основе прогнозов C-Mambastrategy_results = { "total_return": 0.45, # 45% годовая доходность "sharpe_ratio": 1.82, "sortino_ratio": 2.34, "max_drawdown": -0.12, # -12% "win_rate": 0.61, "profit_factor": 1.94,}
# Сравнение с базовыми стратегиями:# - Равновзвешенный buy&hold: 28% доходность, Шарп 0.89# - Простой моментум: 35% доходность, Шарп 1.21# - Стратегия C-Mamba: 45% доходность, Шарп 1.82Фреймворк бэктестинга
Компоненты стратегии
- Генерация сигналов: Использование прогнозов C-Mamba для ранжирования активов
- Размер позиций: Равный вес или с учётом волатильности
- Ребалансировка: Еженедельно или при значительном изменении прогноза
- Управление рисками: Стоп-лосс, лимиты позиций
Метрики производительности
| Метрика | Описание |
|---|---|
| Коэффициент Шарпа | Доходность с учётом риска (годовая) |
| Коэффициент Сортино | Доходность с учётом риска падения |
| Максимальная просадка | Наибольшее падение от пика до дна |
| Коэффициент Кальмара | Доходность / Макс просадка |
| Доля выигрышных | Процент прибыльных сделок |
| Профит-фактор | Валовая прибыль / Валовой убыток |
| MSE | Среднеквадратичная ошибка прогноза |
| Направленная точность | Корректные прогнозы направления |
Пример результатов бэктеста
Мультиактивная стратегия C-Mamba (2022-2024)============================================Активы: 10 криптовалют (Bybit)Ребалансировка: ЕженедельноНачальный капитал: $100,000
Производительность:- Общая доходность: 89.2%- CAGR: 36.8%- Коэффициент Шарпа: 1.82- Коэффициент Сортино: 2.45- Максимальная просадка: -18.3%- Доля выигрышных: 61.2%- Профит-фактор: 2.14
Статистика модели:- MSE прогноза: 0.0019- Направленная точность: 58.7%- R² межканальной корреляции: 0.89Оценка производительности
Сравнение с базовыми моделями
| Модель | MSE | MAE | Шарп | Макс DD |
|---|---|---|---|---|
| ARIMA (одномерная) | 0.0089 | 0.071 | 0.54 | -42% |
| VAR | 0.0067 | 0.058 | 0.78 | -35% |
| LSTM | 0.0045 | 0.048 | 1.12 | -28% |
| Transformer | 0.0038 | 0.042 | 1.35 | -24% |
| PatchTST | 0.0031 | 0.039 | 1.56 | -21% |
| C-Mamba | 0.0023 | 0.031 | 1.82 | -18% |
Ключевые выводы
- Лучший захват корреляций: GDD-MLP C-Mamba эффективно моделирует межактивные зависимости
- Эффективные вычисления: O(n) сложность позволяет обрабатывать более длинные последовательности
- Устойчивость к шуму: Channel Mixup улучшает обобщение
- Двунаправленный контекст: Захватывает как опережающие, так и запаздывающие взаимосвязи
Ограничения
- Требования к обучающим данным: Необходима достаточная история для паттернов каналов
- Стационарность корреляций: Предполагает относительно стабильные корреляции
- Вычислительные затраты: Сложнее линейных моделей
- Интерпретируемость: Модели глубокого обучения менее интерпретируемы
Будущие направления
-
Адаптивный Channel Mixup: Динамическая настройка смешивания в зависимости от рыночного режима
-
Иерархическая C-Mamba: Многомасштабное моделирование для разных таймфреймов
-
Онлайн-обучение: Непрерывное обновление модели с потоковыми данными
-
Количественная оценка неопределённости: Доверительные интервалы для прогнозов
-
Визуализация внимания: Лучшая интерпретируемость межканальных зависимостей
-
Несколько классов активов: Расширение на акции, облигации, товары вместе
Литература
-
Zeng, C., et al. (2024). C-Mamba: Channel Correlation Enhanced State Space Models for Multivariate Time Series Forecasting. arXiv:2406.05316.
-
Gu, A., & Dao, T. (2023). Mamba: Linear-Time Sequence Modeling with Selective State Spaces. arXiv:2312.00752.
-
Gu, A., et al. (2022). Efficiently Modeling Long Sequences with Structured State Spaces. ICLR 2022.
-
Nie, Y., et al. (2023). A Time Series is Worth 64 Words: Long-term Forecasting with Transformers. ICLR 2023.
-
Zeng, A., et al. (2023). Are Transformers Effective for Time Series Forecasting?. AAAI 2023.
-
Wu, H., et al. (2023). TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis. ICLR 2023.
Уровень сложности
Продвинутый
Предварительные требования:
- Основы глубокого обучения (нейронные сети, обратное распространение)
- Основы анализа временных рядов
- Понимание моделей пространства состояний
- Опыт работы с Python/PyTorch
- Знание финансовых рынков
Рекомендуемые главы для предварительного изучения:
- Глава 09: Модели временных рядов
- Глава 28: Определение режимов с HMM
- Глава 32: Межактивный моментум