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

Глава 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 явно моделирует эти взаимосвязи.

Содержание

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

Введение в C-Mamba

Проблема: многомерные временные ряды в финансах

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

  1. Межвременные зависимости: Как прошлые цены актива предсказывают его будущие цены
  2. Межканальные зависимости: Как цены разных активов связаны друг с другом

Традиционные подходы обрабатывают их по-разному:

ПодходМежвременныеМежканальныеОграничения
ARIMA/VARЛинейныеЛинейныеОграниченный захват нелинейностей
LSTM/GRUНелинейныеОграниченныеПоследовательная обработка, медленно
TransformerНелинейныеВниманиеO(n²) сложность
C-MambaНелинейные (SSM)GDD-MLPO(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_t
y_t = C * h_t

Где:

  • Ā = exp(Δ * A) (дискретизированная матрица состояния)
  • B̄ = (Δ * A)⁻¹ * (exp(Δ * A) - I) * Δ * B (дискретизированная входная матрица)
  • A, B, C — обучаемые и зависящие от входа

M-Mamba: модифицированная Mamba для временных рядов

M-Mamba адаптирует Mamba для временных рядов:

  1. Двунаправленное сканирование: Прямая и обратная ветви SSM захватывают прошлый и будущий контекст
  2. Обработка на основе патчей: Вход разбивается на патчи для эффективности
# Двунаправленная M-Mamba
forward_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, CMambaConfig
from 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
# Загрузка исторических данных с Bybit
cargo 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-Mamba
strategy_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

Фреймворк бэктестинга

Компоненты стратегии

  1. Генерация сигналов: Использование прогнозов C-Mamba для ранжирования активов
  2. Размер позиций: Равный вес или с учётом волатильности
  3. Ребалансировка: Еженедельно или при значительном изменении прогноза
  4. Управление рисками: Стоп-лосс, лимиты позиций

Метрики производительности

МетрикаОписание
Коэффициент ШарпаДоходность с учётом риска (годовая)
Коэффициент СортиноДоходность с учётом риска падения
Максимальная просадкаНаибольшее падение от пика до дна
Коэффициент КальмараДоходность / Макс просадка
Доля выигрышныхПроцент прибыльных сделок
Профит-факторВаловая прибыль / Валовой убыток
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

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

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

МодельMSEMAEШарпМакс DD
ARIMA (одномерная)0.00890.0710.54-42%
VAR0.00670.0580.78-35%
LSTM0.00450.0481.12-28%
Transformer0.00380.0421.35-24%
PatchTST0.00310.0391.56-21%
C-Mamba0.00230.0311.82-18%

Ключевые выводы

  1. Лучший захват корреляций: GDD-MLP C-Mamba эффективно моделирует межактивные зависимости
  2. Эффективные вычисления: O(n) сложность позволяет обрабатывать более длинные последовательности
  3. Устойчивость к шуму: Channel Mixup улучшает обобщение
  4. Двунаправленный контекст: Захватывает как опережающие, так и запаздывающие взаимосвязи

Ограничения

  1. Требования к обучающим данным: Необходима достаточная история для паттернов каналов
  2. Стационарность корреляций: Предполагает относительно стабильные корреляции
  3. Вычислительные затраты: Сложнее линейных моделей
  4. Интерпретируемость: Модели глубокого обучения менее интерпретируемы

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

  1. Адаптивный Channel Mixup: Динамическая настройка смешивания в зависимости от рыночного режима

  2. Иерархическая C-Mamba: Многомасштабное моделирование для разных таймфреймов

  3. Онлайн-обучение: Непрерывное обновление модели с потоковыми данными

  4. Количественная оценка неопределённости: Доверительные интервалы для прогнозов

  5. Визуализация внимания: Лучшая интерпретируемость межканальных зависимостей

  6. Несколько классов активов: Расширение на акции, облигации, товары вместе


Литература

  1. Zeng, C., et al. (2024). C-Mamba: Channel Correlation Enhanced State Space Models for Multivariate Time Series Forecasting. arXiv:2406.05316.

  2. Gu, A., & Dao, T. (2023). Mamba: Linear-Time Sequence Modeling with Selective State Spaces. arXiv:2312.00752.

  3. Gu, A., et al. (2022). Efficiently Modeling Long Sequences with Structured State Spaces. ICLR 2022.

  4. Nie, Y., et al. (2023). A Time Series is Worth 64 Words: Long-term Forecasting with Transformers. ICLR 2023.

  5. Zeng, A., et al. (2023). Are Transformers Effective for Time Series Forecasting?. AAAI 2023.

  6. Wu, H., et al. (2023). TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis. ICLR 2023.


Уровень сложности

Продвинутый

Предварительные требования:

  • Основы глубокого обучения (нейронные сети, обратное распространение)
  • Основы анализа временных рядов
  • Понимание моделей пространства состояний
  • Опыт работы с Python/PyTorch
  • Знание финансовых рынков

Рекомендуемые главы для предварительного изучения:

  • Глава 09: Модели временных рядов
  • Глава 28: Определение режимов с HMM
  • Глава 32: Межактивный моментум