Прототипное обучение для классификации рыночных состояний
Прототипное обучение предоставляет интерпретируемый подход к пониманию рыночных условий путём изучения репрезентативных паттернов (прототипов), характеризующих различные состояния рынка. В этой главе реализуется фреймворк “This Looks Like That” (ProtoPNet), адаптированный для анализа финансовых временных рядов и разработки торговых стратегий.
В отличие от моделей “чёрного ящика”, прототипное обучение предлагает прозрачную аргументацию: оно классифицирует рыночные условия, находя сходство с изученными прототипами, позволяя трейдерам понимать, почему был сделан тот или иной прогноз. Такая интерпретируемость критически важна в финансовых приложениях, где понимание поведения модели так же важно, как и точность прогнозов.
Содержание
- Введение в прототипное обучение
- Математические основы
- Классификация рыночных состояний
- Реализация
- Торговая стратегия
- Источники данных
- Метрики оценки
- Литература
Введение в прототипное обучение
Прототипное обучение — это форма рассуждения на основе прецедентов, где решения о классификации принимаются путём сравнения новых экземпляров с репрезентативными примерами (прототипами), изученными во время обучения. Ключевая идея статьи о ProtoPNet заключается в том, что эти прототипы могут обучаться end-to-end вместе с моделью классификации.
В контексте трейдинга:
- Прототипы представляют типичные рыночные паттерны — например, консолидация перед прорывом, трендовый импульс, установки на возврат к среднему
- Классификация интерпретируема — “Этот рынок похож на [изученный прототип бычьего продолжения]”
- Рассуждения прозрачны — Трейдеры могут проверить, какие паттерны изучила модель
Почему прототипное обучение для трейдинга?
- Интерпретируемость: Понимание того, почему модель предсказывает определённое состояние рынка
- Регуляторное соответствие: Объяснение решений модели регуляторам и заинтересованным сторонам
- Управление рисками: Определение ситуаций, когда рыночные условия не соответствуют ни одному известному прототипу
- Совершенствование стратегии: Изучение новых рыночных паттернов из данных, дополняющих человеческую интуицию
Математические основы
Архитектура прототипных сетей
Прототипная сеть состоит из трёх основных компонентов:
-
Кодировщик признаков $f: \mathbb{R}^{T \times D} \rightarrow \mathbb{R}^{H}$
- Отображает входной временной ряд длины $T$ с $D$ признаками в латентное представление
- Использует свёрточные слои для захвата временных паттернов
-
Слой прототипов, содержащий $K$ обучаемых прототипов ${p_1, p_2, …, p_K}$
- Каждый прототип $p_k \in \mathbb{R}^H$ представляет характерный рыночный паттерн
- Прототипы обучаются во время тренировки
-
Классификационная голова $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Ключевые компоненты:
-
model.py: Реализует архитектуру ProtoPNet с:
- Свёрточным кодировщиком признаков
- Обучаемым слоем прототипов
- Вычислением сходства
- Классификационной головой
-
train.py: Пайплайн обучения с:
- Комбинированной функцией потерь
- Проекцией прототипов (push к ближайшему обучающему примеру)
- Ранней остановкой и сохранением чекпоинтов модели
-
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Торговая стратегия
Генерация сигналов
Торговая стратегия использует сходство с прототипами для генерации сигналов:
- Классификация состояния: Классифицировать текущее состояние рынка на основе сходства с прототипами
- Фильтрация по уверенности: Торговать только когда сходство с выигрывающим прототипом превышает порог
- Размер позиции: Масштабировать размер позиции по уверенности прогноза
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 / Максимальная просадка |
Метрики интерпретируемости
| Метрика | Описание |
|---|---|
| Разнообразие прототипов | Насколько прототипы отличаются друг от друга |
| Разреженность активаций | Как часто каждый прототип “активен” |
| Расстояние до ближайшего примера | Насколько прототипы близки к реальным примерам |
Литература
-
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 для интерпретируемой классификации
-
Interpretable Machine Learning for Financial Risk Management
- Rudin, C. (2019)
- URL: https://arxiv.org/abs/1811.10154
- Обсуждает важность интерпретируемости в финансах
-
Machine Learning for Asset Managers
- López de Prado, M. (2020)
- Cambridge University Press
- Комплексное руководство по ML в финансах
-
Technical Analysis of the Financial Markets
- Murphy, J. J. (1999)
- New York Institute of Finance
- Основа для технических индикаторов, используемых в качестве признаков