Cross-Modal Contrastive Learning для трейдинга
Эта глава реализует Cross-Modal Contrastive Learning (кросс-модальное контрастивное обучение) для финансовых временных рядов и связанных с ними текстовых данных (новости, отчёты, твиты). Подход переносит фундаментальные принципы архитектуры CLIP (Contrastive Language-Image Pretraining) от OpenAI в сферу алгоритмического трейдинга: Contrastive Language-Timeseries Pretraining.
Поддерживает как данные фондового рынка (AAPL, S&P 500), так и криптовалютные данные (Bybit: BTCUSDT, ETHUSDT).
Основная концепция
Движение цены не происходит в вакууме. Внезапное падение графика на 5% ($x_{price}$) часто напрямую связано с событием в реальном мире, описанным текстом ($x_{text}$), например: “Компания не оправдала ожидания по выручке” или “Флеш-крэш BTCUSDT на Bybit из-за ликвидации крупного игрока”.
Кросс-модальное обучение выравнивает эти два совершенно разных источника информации (модальности) в едином общем скрытом пространстве (Shared Latent Space).
- Позитивная пара: Окно графика цены и новостной заголовок, который вышел в этот же самый момент времени.
- Негативные пары: Тот же график цены, но сопоставленный со случайными новостями за другие дни или для других активов.
Обучая сеть максимизировать косинусное сходство между истинными парами (Цена, Текст) и минимизировать его для всех ложных комбинаций в батче, модель выучивает богатое семантическое представление рынка.
Математическая формулировка
Для батча из $N$ пар, матрица сходства $S$:
$$S_{i,j} = \frac{v_{price}^{(i)} \cdot v_{text}^{(j)}}{||v_{price}^{(i)}|| \cdot ||v_{text}^{(j)}||}$$
Симметричный CLIP лосс:
$$\mathcal{L}{CLIP} = \frac{1}{2} \left[ \frac{1}{N}\sum{i} \mathcal{L}{P \rightarrow T}^{(i)} + \frac{1}{N}\sum{j} \mathcal{L}_{T \rightarrow P}^{(j)} \right]$$
где каждый член — это кросс-энтропия с температурным масштабированием по строкам/столбцам матрицы сходства.
Преимущества для трейдинга
- Zero-Shot поиск паттернов: Вы можете ввести текстовый запрос (например, “внезапный обвал на Bybit”) и найти все похожие исторические графики в базе данных, даже если вы никогда не обучали классификатор конкретно на этот паттерн.
- Семантическое понимание графиков: Энкодер временных рядов начинает понимать, что означают паттерны в реальном мире, а не просто запоминает их геометрическую форму.
- Сигнал расхождения (Divergence Trading): Проецируя текущий график и текущую новость в одно пространство, вы можете измерить их “расхождение”. Если цена падает, но эмбеддинг новостей кричит “жёсткий бычий пробой”, это может быть сигналом манипуляции или скорого разворота.
- Кросс-рыночный перенос: Общее скрытое пространство позволяет сравнивать паттерны между акциями (AAPL) и криптовалютами (BTCUSDT), находя структурное сходство на разных рынках.
Структура проекта
164_cross_modal_contrastive/├── README.md # Основное описание (English)├── README.ru.md # Этот файл (Русский)├── readme.simple.md # Упрощённое объяснение (English)├── readme.simple.ru.md # Упрощённое объяснение (Русский)├── python/│ ├── model.py # TimeSeriesEncoder, TextEncoder, CLIPLoss, SymmetricCLIPLoss│ ├── data.py # Генерация данных: синтетика, крипто Bybit, фондовый рынок│ ├── train.py # Скрипт обучения (тест на переобучение + режим рыночных данных)│ ├── evaluate.py # Оценка zero-shot поиска│ └── requirements.txt # Python зависимости├── rust/│ ├── Cargo.toml # Rust зависимости│ └── src/│ └── lib.rs # Высокопроизводительный поиск по эмбеддингам└── docs/ └── ru/ └── theory.md # Теоретический разборБыстрый старт
Python
cd pythonpip install -r requirements.txt
# Режим 1: Тест на переобучение (проверка архитектуры)python train.py --mode overfitpython evaluate.py --mode overfit
# Режим 2: Обучение на крипто (Bybit) + фондовых данныхpython train.py --mode marketpython evaluate.py --mode marketRust
cd rustcargo testИсточники данных
Криптовалюты Bybit (симуляция)
- BTCUSDT: Бессрочные фьючерсы на Bitcoin с событиями: памп, крэш, шорт-сквиз, ралли, дамп
- ETHUSDT: Бессрочные фьючерсы на Ethereum с аналогичной таксономией событий
Фондовый рынок (симуляция)
- AAPL: Apple Inc. с событиями: превышение ожиданий по прибыли, повышение ставки ФРС, секторальное ралли, скандал с CEO
Все данные генерируются синтетически внутри этой главы для обеспечения воспроизводимости и автономности.
Архитектура
TimeSeriesEncoder (1D-CNN)
- 3 свёрточных блока с BatchNorm + ReLU
- Адаптивный средний пулинг → проекционная голова
- Вход:
(B, 1, 128)→ Выход:(B, 32)
TextEncoder (Embedding + Mean Pooling)
- Обучаемые эмбеддинги токенов с маской паддинга
- LayerNorm → проекционная голова
- Вход:
(B, 8)→ Выход:(B, 32)
Функции потерь
- CLIPLoss: CosineEmbeddingLoss с явными позитивными/негативными парами
- SymmetricCLIPLoss: Полный NxN InfoNCE с обучаемой температурой (рекомендуется)
Ссылки
- Radford, A., et al. “Learning Transferable Visual Models From Natural Language Supervision” (CLIP, OpenAI, 2021). arXiv:2103.00020
- Oord, A. van den, et al. “Representation Learning with Contrastive Predictive Coding” (CPC, 2018). arXiv:1807.03748