Глава 354: InceptionTime для трейдинга — Классификация временных рядов с помощью Inception-сетей
Обзор
InceptionTime — это современная архитектура глубокого обучения, специально разработанная для классификации временных рядов. Впервые представленная Fawaz et al. (2019), она адаптирует концепцию Inception-модуля из компьютерного зрения (GoogLeNet/InceptionNet) к темпоральным данным. В трейдинге InceptionTime превосходно справляется с:
- Классификацией рыночных режимов (бычий, медвежий, боковой)
- Генерацией торговых сигналов (покупка, продажа, удержание)
- Прогнозированием состояния волатильности (высокая, средняя, низкая)
- Распознаванием паттернов (голова-плечи, двойные вершины и т.д.)
Ключевая инновация
В отличие от традиционных CNN, использующих ядра фиксированного размера, InceptionTime применяет множественные параллельные свёртки с разными размерами ядер внутри каждого Inception-модуля. Это позволяет модели захватывать паттерны на множественных временных масштабах одновременно — от краткосрочных сигналов микроструктуры до долгосрочных трендов.
Архитектура
Inception-модуль для временных рядов
Входной временной ряд │ ├──► MaxPooling(3) ──► Conv1D(1) ─────────────┐ │ │ ├──► Conv1D(kernel=10) ──────────────────────►│ │ │ Конкатенация ├──► Conv1D(kernel=20) ──────────────────────►│ │ │ └──► Conv1D(kernel=40) ──────────────────────►│ │ BatchNorm + ReLU │ ВыходПолная сеть InceptionTime
┌─────────────────────────────────────────────────────────────────┐│ Входной слой ││ (batch, sequence_length, features) │└─────────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────────┐│ Inception-модуль 1 ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │MaxPool+ │ │ Conv1D │ │ Conv1D │ │ Conv1D │ ││ │ Conv1D │ │ k=10 │ │ k=20 │ │ k=40 │ ││ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ ││ └────────────┴────────────┴────────────┘ ││ │ Concat ││ ▼ ││ BatchNorm + ReLU │└─────────────────────────────────────────────────────────────────┘ │ (Повтор 5x) │ ▼┌─────────────────────────────────────────────────────────────────┐│ Global Average Pooling │└─────────────────────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────────────┐│ Dense + Softmax ││ (num_classes выходов) │└─────────────────────────────────────────────────────────────────┘Остаточные соединения
Каждый третий Inception-модуль включает остаточное (skip) соединение:
Вход ──────────────┐ │ │ ▼ │Inception 1 │ │ │ ▼ │Inception 2 │ │ │ ▼ │Inception 3 │ │ │ ▼ │ + ◄─────────────┘ (Остаточное соединение с 1x1 Conv при необходимости) │ ▼ВыходТорговая стратегия
Подход: Мульти-таймфреймовый ансамбль сигналов
Основная торговая стратегия использует мультимасштабное извлечение признаков InceptionTime:
-
Входные признаки:
- OHLCV данные (нормализованные)
- Технические индикаторы (RSI, MACD, полосы Боллинджера)
- Дисбаланс книги ордеров (при наличии)
- Профиль объёма
-
Целевые классы:
- Класс 0: Медвежий (снижение цены > порог)
- Класс 1: Нейтральный (цена в пределах порога)
- Класс 2: Бычий (рост цены > порог)
-
Генерация сигналов:
- Использование ансамбля из 5 моделей InceptionTime
- Усреднение предсказаний для робастности
- Применение порогов уверенности перед торговлей
Преимущество: Почему InceptionTime работает для трейдинга
- Обнаружение паттернов на множественных масштабах: Рынки демонстрируют паттерны на разных таймфреймах (секунды — дни)
- Устойчивость к шуму: Ансамблевый подход и глубина обеспечивают регуляризацию
- Быстрый инференс: Чисто свёрточная архитектура обеспечивает низкую задержку
- Отсутствие рекуррентности: Параллелизуемые вычисления, в отличие от LSTM
Математическая формулировка
Inception-модуль
Для входного тензора $X \in \mathbb{R}^{T \times C_{in}}$:
$$\text{InceptionModule}(X) = \text{BN}\left(\text{ReLU}\left(\text{Concat}\left[ \begin{array}{l} \text{Conv}{1 \times 1}(\text{MaxPool}(X)) \ \text{Conv}{k_1}(X) \ \text{Conv}{k_2}(X) \ \text{Conv}{k_3}(X) \end{array} \right]\right)\right)$$
Где:
- $k_1, k_2, k_3$ — разные размеры ядер (по умолчанию: 10, 20, 40)
- BN = Batch Normalization (пакетная нормализация)
- ReLU = Rectified Linear Unit (выпрямленная линейная единица)
Функция потерь
Для $N$-классовой классификации с весами классов $w_c$:
$$\mathcal{L} = -\frac{1}{N}\sum_{i=1}^{N} \sum_{c=1}^{C} w_c \cdot y_{i,c} \cdot \log(\hat{y}_{i,c})$$
Ансамблевое предсказание
Для $K$ моделей в ансамбле:
$$\hat{y}{ensemble} = \frac{1}{K}\sum{k=1}^{K} \hat{y}_k$$
Детали реализации
Гиперпараметры
| Параметр | По умолчанию | Описание |
|---|---|---|
num_filters | 32 | Базовое количество фильтров в Inception-модуле |
depth | 6 | Количество Inception-модулей |
kernel_sizes | [10, 20, 40] | Размеры ядер свёртки |
bottleneck_size | 32 | Размерность bottleneck-слоя |
residual_interval | 3 | Добавлять остаточное соединение каждые N модулей |
ensemble_size | 5 | Количество моделей в ансамбле |
Конфигурация обучения
optimizer: Adamlearning_rate: 0.001batch_size: 64epochs: 1500early_stopping_patience: 100lr_scheduler: ReduceLROnPlateaulr_decay_factor: 0.5lr_patience: 50Предобработка данных
- Нормализация: Z-score нормализация по признакам
- Окно: Скользящее окно со сдвигом
- Кодирование меток: Классификация форвард-доходности
- Разбиение Train/Val/Test: 70/15/15 без заглядывания вперёд
Фреймворк бэктестинга
Пайплайн сигнал-сделка
┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌────────────┐│ Сырые │ ─► │ Feature │ ─► │ InceptionTime│ ─► │ Размер ││ рыночные │ │ Engineering │ │ Ансамбль │ │ позиции ││ данные │ │ │ │ │ │ │└─────────────┘ └──────────────┘ └─────────────┘ └────────────┘ │ ▼┌─────────────┐ ┌──────────────┐ ┌─────────────┐│ Аналитика │ ◄─ │ Управление │ ◄─ │ Исполнение ││ результатов │ │ рисками │ │ ордеров │└─────────────┘ └──────────────┘ └─────────────┘Размер позиции
На основе уверенности предсказания и волатильности:
$$\text{PositionSize} = \frac{\text{RiskPerTrade} \times \text{Confidence}}{\text{ATR} \times \text{Multiplier}}$$
Управление рисками
- Лимит максимальной просадки: 15%
- Дневной лимит убытков: 3%
- Лимит позиции: 20% портфеля на сделку
- Стоп-лосс: Динамический на основе ATR
Метрики производительности
Метрики классификации
| Метрика | Описание |
|---|---|
| Accuracy | Общая доля правильных предсказаний |
| Precision | True positives / (True positives + False positives) |
| Recall | True positives / (True positives + False negatives) |
| F1-Score | Гармоническое среднее precision и recall |
| Cohen’s Kappa | Согласованность сверх случайной |
Торговые метрики
| Метрика | Цель | Описание |
|---|---|---|
| Sharpe Ratio | > 1.5 | Доходность с учётом риска |
| Sortino Ratio | > 2.0 | Доходность с учётом нижнего риска |
| Max Drawdown | < 15% | Максимальное падение от пика |
| Win Rate | > 55% | Процент прибыльных сделок |
| Profit Factor | > 1.5 | Валовая прибыль / Валовой убыток |
| Calmar Ratio | > 1.0 | Годовая доходность / Max drawdown |
Структура проекта
354_inception_time_trading/├── README.md # Основной файл (English)├── README.ru.md # Этот файл (Русский)├── readme.simple.md # Простое объяснение├── readme.simple.ru.md # Простое объяснение (Русский)├── README.specify.md # Техническая спецификация│└── rust/ # Реализация на Rust ├── Cargo.toml # Манифест пакета ├── config/ │ └── default.toml # Конфигурация по умолчанию │ └── src/ ├── lib.rs # Точка входа библиотеки ├── main.rs # Основной исполняемый файл │ ├── data/ │ ├── mod.rs # Модуль данных │ ├── bybit_client.rs # Клиент API Bybit │ ├── ohlcv.rs # Структуры данных OHLCV │ ├── features.rs # Feature engineering │ └── dataset.rs # Загрузка датасета │ ├── model/ │ ├── mod.rs # Модуль модели │ ├── inception.rs # Inception-модуль │ ├── network.rs # Полная сеть InceptionTime │ └── ensemble.rs # Методы ансамблирования │ ├── training/ │ ├── mod.rs # Модуль обучения │ ├── trainer.rs # Цикл обучения │ ├── losses.rs # Функции потерь │ └── metrics.rs # Метрики оценки │ ├── strategy/ │ ├── mod.rs # Модуль стратегии │ ├── signals.rs # Генерация сигналов │ ├── position.rs # Управление позицией │ └── risk.rs # Управление рисками │ ├── backtest/ │ ├── mod.rs # Модуль бэктеста │ ├── engine.rs # Движок бэктестинга │ └── analytics.rs # Аналитика производительности │ └── utils/ ├── mod.rs # Модуль утилит ├── config.rs # Конфигурация └── logging.rs # Настройка логированияПримеры использования
Rust CLI
# Загрузка данных с Bybitcargo run --bin fetch_data -- --symbol BTCUSDT --interval 15 --days 90
# Обучение ансамбля InceptionTimecargo run --bin train -- --config config/default.toml
# Запуск бэктестаcargo run --bin backtest -- --model models/inception_ensemble.pt --data data/btcusdt.csv
# Живое предсказание (бумажная торговля)cargo run --bin predict -- --symbol BTCUSDT --interval 15Пример вывода
InceptionTime Trading System v0.1.0═══════════════════════════════════════════════════════════════
[DATA] Загрузка BTCUSDT 15m данных с Bybit...[DATA] Загружено 8640 свечей (90 дней)[FEATURES] Сгенерировано 15 технических индикаторов[TRAIN] Обучение ансамбля из 5 моделей...
Модель 1/5: Эпоха 100/1500, Loss: 0.8234, Val Acc: 0.523Модель 1/5: Эпоха 200/1500, Loss: 0.7123, Val Acc: 0.568...Модель 5/5: Обучение завершено. Лучший Val Acc: 0.612
[ENSEMBLE] Точность ансамбля: 0.634[BACKTEST] Запуск бэктеста на тестовом наборе...
═══════════════════════════════════════════════════════════════ РЕЗУЛЬТАТЫ БЭКТЕСТА═══════════════════════════════════════════════════════════════
Общая доходность: +34.21%Sharpe Ratio: 1.87Sortino Ratio: 2.43Max Drawdown: -8.34%Win Rate: 58.3%Profit Factor: 1.72Всего сделок: 234
═══════════════════════════════════════════════════════════════Ссылки
-
InceptionTime: Finding AlexNet for Time Series Classification
- Авторы: Fawaz, H. I., Lucas, B., Forestier, G., Pelletier, C., et al.
- Год: 2019
- URL: https://arxiv.org/abs/1909.04939
-
Deep Learning for Time Series Classification
- Авторы: Fawaz, H. I., et al.
- Год: 2019
- URL: https://arxiv.org/abs/1809.04356
-
Going Deeper with Convolutions (GoogLeNet)
- Авторы: Szegedy, C., et al.
- Год: 2015
- URL: https://arxiv.org/abs/1409.4842
Лицензия
MIT License — см. файл LICENSE для деталей.
Вклад в проект
Вклады приветствуются! Пожалуйста, ознакомьтесь с руководством по внесению изменений и отправляйте pull requests в основной репозиторий.