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

Прототипное обучение для классификации рыночных состояний

Прототипное обучение предоставляет интерпретируемый подход к пониманию рыночных условий путём изучения репрезентативных паттернов (прототипов), характеризующих различные состояния рынка. В этой главе реализуется фреймворк “This Looks Like That” (ProtoPNet), адаптированный для анализа финансовых временных рядов и разработки торговых стратегий.

В отличие от моделей “чёрного ящика”, прототипное обучение предлагает прозрачную аргументацию: оно классифицирует рыночные условия, находя сходство с изученными прототипами, позволяя трейдерам понимать, почему был сделан тот или иной прогноз. Такая интерпретируемость критически важна в финансовых приложениях, где понимание поведения модели так же важно, как и точность прогнозов.

Содержание

  1. Введение в прототипное обучение
  2. Математические основы
  3. Классификация рыночных состояний
  4. Реализация
  5. Торговая стратегия
  6. Источники данных
  7. Метрики оценки
  8. Литература

Введение в прототипное обучение

Прототипное обучение — это форма рассуждения на основе прецедентов, где решения о классификации принимаются путём сравнения новых экземпляров с репрезентативными примерами (прототипами), изученными во время обучения. Ключевая идея статьи о ProtoPNet заключается в том, что эти прототипы могут обучаться end-to-end вместе с моделью классификации.

В контексте трейдинга:

  • Прототипы представляют типичные рыночные паттерны — например, консолидация перед прорывом, трендовый импульс, установки на возврат к среднему
  • Классификация интерпретируема — “Этот рынок похож на [изученный прототип бычьего продолжения]”
  • Рассуждения прозрачны — Трейдеры могут проверить, какие паттерны изучила модель

Почему прототипное обучение для трейдинга?

  1. Интерпретируемость: Понимание того, почему модель предсказывает определённое состояние рынка
  2. Регуляторное соответствие: Объяснение решений модели регуляторам и заинтересованным сторонам
  3. Управление рисками: Определение ситуаций, когда рыночные условия не соответствуют ни одному известному прототипу
  4. Совершенствование стратегии: Изучение новых рыночных паттернов из данных, дополняющих человеческую интуицию

Математические основы

Архитектура прототипных сетей

Прототипная сеть состоит из трёх основных компонентов:

  1. Кодировщик признаков $f: \mathbb{R}^{T \times D} \rightarrow \mathbb{R}^{H}$

    • Отображает входной временной ряд длины $T$ с $D$ признаками в латентное представление
    • Использует свёрточные слои для захвата временных паттернов
  2. Слой прототипов, содержащий $K$ обучаемых прототипов ${p_1, p_2, …, p_K}$

    • Каждый прототип $p_k \in \mathbb{R}^H$ представляет характерный рыночный паттерн
    • Прототипы обучаются во время тренировки
  3. Классификационная голова $g: \mathbb{R}^K \rightarrow \mathbb{R}^C$

    • Отображает оценки сходства в вероятности классов
    • Обычно линейный слой с активацией softmax

Функции сходства

Сходство между входным представлением $z = f(x)$ и прототипом $p_k$ вычисляется с помощью:

Квадрат L2-расстояния (преобразованный в сходство): $$s_k(x) = \log\left(\frac{||z - p_k||^2 + 1}{||z - p_k||^2 + \epsilon}\right)$$

Косинусное сходство: $$s_k(x) = \frac{z \cdot p_k}{||z|| \cdot ||p_k||}$$

Целевая функция обучения

Общая функция потерь объединяет:

$$\mathcal{L} = \mathcal{L}{CE} + \lambda_1 \mathcal{L}{clst} + \lambda_2 \mathcal{L}_{sep}$$

Где:

  • $\mathcal{L}_{CE}$: Кросс-энтропийные потери классификации
  • $\mathcal{L}_{clst}$: Потери кластеризации — поощряют прототипы быть ближе к обучающим примерам
  • $\mathcal{L}_{sep}$: Потери разделения — поощряют прототипы разных классов быть удалёнными друг от друга

Классификация рыночных состояний

Определение рыночных состояний

Мы определяем пять основных рыночных состояний для классификации:

СостояниеОписаниеТипичные характеристики
Бычий трендСильный восходящий импульсБолее высокие максимумы, более высокие минимумы, выше MA
Медвежий трендСильный нисходящий импульсБолее низкие максимумы, более низкие минимумы, ниже MA
КонсолидацияРынок в диапазонеНизкая волатильность, цена внутри полос
ПрорывПереход от консолидацииВсплеск объёма, пробой полос
Возврат к среднемуВозврат к равновесиюЭкстремальный RSI, цена на границах полос

Инженерия признаков для прототипов

Входные признаки для прототипного обучения включают:

Признаки на основе цены:

  • Доходности (1-периодная, 5-периодная, 20-периодная)
  • Логарифм цены относительно скользящих средних
  • Позиция в полосах Боллинджера

Индикаторы импульса:

  • RSI (Индекс относительной силы)
  • MACD (Схождение-расхождение скользящих средних)
  • Скорость изменения (ROC)

Признаки волатильности:

  • ATR (Средний истинный диапазон)
  • Ширина полос Боллинджера
  • Историческая волатильность

Признаки объёма:

  • Коэффициент объёма (текущий / средний)
  • Тренд On-Balance Volume
  • Тренд объём-цена

Реализация

Пример кода: реализация на Python

Реализация на Python предоставляет полный пайплайн прототипного обучения:

python/
├── __init__.py
├── model.py # Архитектура модели ProtoPNet
├── train.py # Пайплайн обучения
├── backtest.py # Фреймворк бэктестинга
├── data_loader.py # Утилиты загрузки данных
└── notebooks/
└── prototype_learning_example.ipynb

Ключевые компоненты:

  1. model.py: Реализует архитектуру ProtoPNet с:

    • Свёрточным кодировщиком признаков
    • Обучаемым слоем прототипов
    • Вычислением сходства
    • Классификационной головой
  2. train.py: Пайплайн обучения с:

    • Комбинированной функцией потерь
    • Проекцией прототипов (push к ближайшему обучающему примеру)
    • Ранней остановкой и сохранением чекпоинтов модели
  3. backtest.py: Бэктестинг с:

    • Генерацией сигналов на основе сходства с прототипами
    • Размером позиции на основе уверенности
    • Расчётом метрик производительности

См. prototype_learning_example.ipynb для полного руководства.

Пример кода: реализация на Rust

Реализация на Rust обеспечивает высокопроизводительный инференс для продакшена:

rust/
├── Cargo.toml
├── src/
│ ├── lib.rs
│ ├── api/
│ │ ├── mod.rs
│ │ └── bybit.rs # Клиент API Bybit
│ ├── data/
│ │ ├── mod.rs
│ │ ├── processor.rs # Предобработка данных
│ │ └── features.rs # Инженерия признаков
│ ├── models/
│ │ ├── mod.rs
│ │ └── prototype.rs # Инференс прототипной сети
│ └── metrics/
│ ├── mod.rs
│ ├── classification.rs
│ └── trading.rs
└── examples/
├── fetch_data.rs
├── prototype_classification.rs
└── live_trading.rs

Торговая стратегия

Генерация сигналов

Торговая стратегия использует сходство с прототипами для генерации сигналов:

  1. Классификация состояния: Классифицировать текущее состояние рынка на основе сходства с прототипами
  2. Фильтрация по уверенности: Торговать только когда сходство с выигрывающим прототипом превышает порог
  3. Размер позиции: Масштабировать размер позиции по уверенности прогноза
def generate_signal(similarities, threshold=0.7):
max_similarity = similarities.max()
predicted_state = similarities.argmax()
if max_similarity < threshold:
return 0 # Нет чёткого сигнала
if predicted_state in [MarketState.BULLISH, MarketState.BREAKOUT_UP]:
return 1 # Длинная позиция
elif predicted_state in [MarketState.BEARISH, MarketState.BREAKOUT_DOWN]:
return -1 # Короткая позиция
else:
return 0 # Нейтрально

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

Фреймворк бэктестинга оценивает производительность стратегии:

  • Walk-forward оптимизация: Обучение на скользящих окнах
  • Транзакционные издержки: Включение проскальзывания и комиссий
  • Управление рисками: Уровни стоп-лосс и тейк-профит
  • Атрибуция производительности: Анализ того, какие прототипы обеспечивают доходность

Источники данных

Данные фондового рынка

Данные фондового рынка загружаются с помощью yfinance:

import yfinance as yf
# Загрузка дневных данных для нескольких символов
symbols = ['SPY', 'QQQ', 'IWM', 'AAPL', 'MSFT']
data = yf.download(symbols, start='2020-01-01', end='2024-01-01')

Криптовалютные данные (Bybit)

Криптовалютные данные загружаются из API биржи Bybit:

from python.data_loader import BybitDataLoader
loader = BybitDataLoader()
btc_data = loader.get_klines(
symbol='BTCUSDT',
interval='1h',
start_time='2023-01-01',
end_time='2024-01-01'
)

Реализация на Rust обеспечивает эффективную загрузку данных:

use prototype_learning::api::BybitClient;
let client = BybitClient::new();
let klines = client.get_klines("BTCUSDT", Interval::Hour1, Some(1000), None, None)?;

Метрики оценки

Метрики классификации

МетрикаОписание
AccuracyОбщая точность классификации
F1-ScoreГармоническое среднее точности и полноты
Матрица ошибокДетальная производительность по классам
Чистота прототиповНасколько хорошо прототипы представляют свой класс

Торговые метрики

МетрикаОписание
Коэффициент ШарпаДоходность с учётом риска
Коэффициент СортиноДоходность с учётом нисходящего риска
Максимальная просадкаНаибольшее падение от пика к минимуму
Win RateПроцент прибыльных сделок
Profit FactorВаловая прибыль / Валовый убыток
Коэффициент КальмараCAGR / Максимальная просадка

Метрики интерпретируемости

МетрикаОписание
Разнообразие прототиповНасколько прототипы отличаются друг от друга
Разреженность активацийКак часто каждый прототип “активен”
Расстояние до ближайшего примераНасколько прототипы близки к реальным примерам

Литература

  1. This Looks Like That: Deep Learning for Interpretable Image Recognition

    • Chen, C., Li, O., Tao, D., Barnett, A., Rudin, C., & Su, J. K. (2019)
    • URL: https://arxiv.org/abs/1806.10574
    • Представляет архитектуру ProtoPNet для интерпретируемой классификации
  2. Interpretable Machine Learning for Financial Risk Management

  3. Machine Learning for Asset Managers

    • López de Prado, M. (2020)
    • Cambridge University Press
    • Комплексное руководство по ML в финансах
  4. Technical Analysis of the Financial Markets

    • Murphy, J. J. (1999)
    • New York Institute of Finance
    • Основа для технических индикаторов, используемых в качестве признаков