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

Глава 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:

  1. Входные признаки:

    • OHLCV данные (нормализованные)
    • Технические индикаторы (RSI, MACD, полосы Боллинджера)
    • Дисбаланс книги ордеров (при наличии)
    • Профиль объёма
  2. Целевые классы:

    • Класс 0: Медвежий (снижение цены > порог)
    • Класс 1: Нейтральный (цена в пределах порога)
    • Класс 2: Бычий (рост цены > порог)
  3. Генерация сигналов:

    • Использование ансамбля из 5 моделей InceptionTime
    • Усреднение предсказаний для робастности
    • Применение порогов уверенности перед торговлей

Преимущество: Почему InceptionTime работает для трейдинга

  1. Обнаружение паттернов на множественных масштабах: Рынки демонстрируют паттерны на разных таймфреймах (секунды — дни)
  2. Устойчивость к шуму: Ансамблевый подход и глубина обеспечивают регуляризацию
  3. Быстрый инференс: Чисто свёрточная архитектура обеспечивает низкую задержку
  4. Отсутствие рекуррентности: Параллелизуемые вычисления, в отличие от 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_filters32Базовое количество фильтров в Inception-модуле
depth6Количество Inception-модулей
kernel_sizes[10, 20, 40]Размеры ядер свёртки
bottleneck_size32Размерность bottleneck-слоя
residual_interval3Добавлять остаточное соединение каждые N модулей
ensemble_size5Количество моделей в ансамбле

Конфигурация обучения

optimizer: Adam
learning_rate: 0.001
batch_size: 64
epochs: 1500
early_stopping_patience: 100
lr_scheduler: ReduceLROnPlateau
lr_decay_factor: 0.5
lr_patience: 50

Предобработка данных

  1. Нормализация: Z-score нормализация по признакам
  2. Окно: Скользящее окно со сдвигом
  3. Кодирование меток: Классификация форвард-доходности
  4. Разбиение 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Общая доля правильных предсказаний
PrecisionTrue positives / (True positives + False positives)
RecallTrue 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

Окно терминала
# Загрузка данных с Bybit
cargo run --bin fetch_data -- --symbol BTCUSDT --interval 15 --days 90
# Обучение ансамбля InceptionTime
cargo 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.87
Sortino Ratio: 2.43
Max Drawdown: -8.34%
Win Rate: 58.3%
Profit Factor: 1.72
Всего сделок: 234
═══════════════════════════════════════════════════════════════

Ссылки

  1. InceptionTime: Finding AlexNet for Time Series Classification

  2. Deep Learning for Time Series Classification

  3. Going Deeper with Convolutions (GoogLeNet)

Лицензия

MIT License — см. файл LICENSE для деталей.

Вклад в проект

Вклады приветствуются! Пожалуйста, ознакомьтесь с руководством по внесению изменений и отправляйте pull requests в основной репозиторий.