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

Глава 290: Активное обучение для трейдинга

Введение

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

Активное обучение решает эту проблему путём интеллектуального выбора того, какие немаркированные образцы должны быть аннотированы следующими. Вместо случайной разметки данных или разметки всего подряд, модель сама определяет образцы, из которых она извлечёт наибольшую пользу. Это позволяет сократить затраты на разметку на 50-90% при сохранении сопоставимого или даже превосходящего качества модели.

В этой главе рассматриваются теоретические основы активного обучения, представлены три основные стратегии запросов (выборка по неопределённости, выборка по разнообразию и запрос комитетом), выводятся математические основы и демонстрируется полная реализация на Rust с интеграцией рыночных данных Bybit.

Теоретические основы

Фреймворк активного обучения

Активное обучение работает в режиме на основе пула. У нас есть:

  • Небольшой размеченный набор $\mathcal{L} = {(x_i, y_i)}_{i=1}^{n_L}$
  • Большой неразмеченный пул $\mathcal{U} = {x_j}_{j=1}^{n_U}$ где $n_U \gg n_L$
  • Модель $f_\theta$, обученная на $\mathcal{L}$
  • Функция приобретения $a(x; f_\theta)$, оценивающая информативность каждого неразмеченного образца

Итеративная процедура:

  1. Обучить $f_\theta$ на текущем $\mathcal{L}$
  2. Оценить все $x \in \mathcal{U}$ с помощью $a(x; f_\theta)$
  3. Выбрать top-$k$ наиболее информативных образцов: $\mathcal{Q} = \arg\max_{S \subset \mathcal{U}, |S|=k} \sum_{x \in S} a(x; f_\theta)$
  4. Получить метки для $\mathcal{Q}$ (от оракула/эксперта)
  5. Переместить: $\mathcal{L} \leftarrow \mathcal{L} \cup \mathcal{Q}$, $\mathcal{U} \leftarrow \mathcal{U} \setminus \mathcal{Q}$
  6. Повторять до исчерпания бюджета на разметку

Почему активное обучение важно для трейдинга

Торговые данные имеют несколько свойств, делающих активное обучение особенно ценным:

  1. Дрифт концепций: Рыночные режимы меняются, делая старые метки менее релевантными. Активное обучение естественно фокусируется на недавних, неопределённых регионах.
  2. Дисбаланс классов: Редкие события (крэши, прорывы) наиболее интересны, но сложнее всего размечать. Выборка по неопределённости естественно тяготеет к неоднозначным граничным случаям.
  3. Стоимость экспертизы: Время квантитативного аналитика стоит $200-500/час. Сокращение количества образцов, требующих ручной проверки, имеет прямой ROI.
  4. Нестационарность: Метки, которые были правильными в прошлом месяце, могут быть неверными сегодня. Активное обучение позволяет эффективно проводить кампании переразметки.

Выборка по неопределённости

Наименьшая уверенность (Least Confidence)

Простейшая мера неопределённости выбирает образец, где наиболее уверенное предсказание класса модели минимально:

$$a_{\text{LC}}(x) = 1 - \max_c P(y = c \mid x; \theta)$$

Для образца, где модель предсказывает вероятности классов [0.51, 0.49], оценка наименьшей уверенности равна $1 - 0.51 = 0.49$ (очень неопределённо). Для [0.99, 0.01] оценка равна $1 - 0.99 = 0.01$ (очень уверенно).

Выборка по марже (Margin Sampling)

Выборка по марже учитывает разрыв между двумя наиболее вероятными классами:

$$a_{\text{margin}}(x) = 1 - \left[ P(y = c_1 \mid x) - P(y = c_2 \mid x) \right]$$

где $c_1$ и $c_2$ — первый и второй наиболее вероятные классы. Малая маржа означает, что модель не может различить две конкурирующие гипотезы.

В трейдинге это особенно полезно для идентификации ценовых уровней, где модель разрывается между “купить” и “держать” или “продать” и “держать” — именно те границы решений, которые важнее всего.

Выборка по энтропии (Entropy Sampling)

Энтропия Шеннона измеряет общую неопределённость полного предсказательного распределения:

$$a_{\text{entropy}}(x) = H[P(y \mid x)] = -\sum_{c=1}^{C} P(y = c \mid x) \log P(y = c \mid x)$$

Энтропия максимальна, когда распределение равномерно (максимальная неопределённость) и минимальна, когда вся вероятностная масса сконцентрирована на одном классе. Для $C$ классов максимальная энтропия равна $\log C$.

Энтропия учитывает всё распределение, а не только верхние классы. Это делает её превосходящей, когда модель распределяет вероятность по многим классам — что часто бывает в задачах мультирежимной классификации.

Сравнение мер неопределённости

МераУчитываетЛучше всего для
Наименьшая уверенностьТолько top-1 классБинарные или почти бинарные задачи
МаржаTop-2 классаУточнение границ решений
ЭнтропияПолное распределениеМультикласс с множеством режимов

Выборка по разнообразию

Чистая выборка по неопределённости может привести к избыточности — выбору множества похожих образцов из одного и того же неопределённого региона. Выборка по разнообразию решает эту проблему, обеспечивая покрытие выбранными образцами различных регионов пространства признаков.

Обход “самый дальний первый”

Жадный алгоритм “самый дальний первый” поддерживает множество $\mathcal{S}$ выбранных образцов и итеративно добавляет образец, наиболее удалённый от текущего множества:

$$x^* = \arg\max_{x \in \mathcal{U}} \min_{s \in \mathcal{S}} d(x, s)$$

где $d(\cdot, \cdot)$ — метрика расстояния (обычно евклидово или косинусное расстояние).

Это гарантирует, что выбранные образцы формируют хорошо распределённое покрытие входного пространства. Алгоритм является 2-аппроксимацией оптимальной задачи k-центров.

Применение в трейдинге

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

  • Периоды высокой волатильности vs. спокойные периоды
  • Различные профили объёма (тонкие vs. глубокие стаканы)
  • Различные паттерны тренда (импульс, разворот, боковик)

Запрос комитетом (Query by Committee, QBC)

Несогласие ансамбля

QBC поддерживает комитет из $M$ моделей ${f_1, \ldots, f_M}$, каждая обученная на текущем размеченном наборе, но с различными случайными инициализациями (или архитектурами). Функция приобретения измеряет несогласие:

$$a_{\text{QBC}}(x) = H\left[\frac{1}{M}\sum_{m=1}^{M} \mathbb{1}[f_m(x) = c]\right]$$

Это энтропия голосования — энтропия распределения предсказанных классов среди членов комитета.

Консенсусная энтропия

Более уточнённая мера использует среднюю дивергенцию КЛ каждого члена от консенсуса:

$$a_{\text{KL}}(x) = \frac{1}{M}\sum_{m=1}^{M} D_{\text{KL}}\left(P_m(y \mid x) ;|; \bar{P}(y \mid x)\right)$$

где $\bar{P}(y \mid x) = \frac{1}{M}\sum_{m=1}^{M} P_m(y \mid x)$ — консенсусное распределение.

Интерпретация в трейдинге

В трейдинге несогласие комитета часто сигнализирует о:

  • Переходах режимов: Некоторые модели адаптировались к новому режиму, другие — нет
  • Неоднозначном ценовом действии: Например, прорыв, который может быть реальным или ложным
  • Проблемах качества данных: Необычные спреды или объёмы, которые сбивают с толку некоторые модели

Обзор реализации на Rust

Архитектура

Реализация состоит из пяти основных компонентов:

  1. SimpleClassifier: Однослойный линейный классификатор (y = softmax(Wx + b)), обучаемый SGD. В продакшене его следует заменить глубокой нейронной сетью, но линейная модель достаточна для демонстрации механики активного обучения.

  2. UncertaintySampler: Реализует все три стратегии неопределённости (наименьшая уверенность, маржа, энтропия). Метод select() оценивает каждый образец в пуле и возвращает top-k индексов.

  3. DiversitySampler: Реализует жадный обход “самый дальний первый”. Поддерживает вектор минимальных расстояний для избежания повторных вычислений.

  4. QueryByCommittee: Поддерживает вектор экземпляров SimpleClassifier. Предоставляет функции приобретения vote_entropy() и consensus_entropy().

  5. ActiveLearningPipeline: Оркестратор, управляющий разделением размеченного/неразмеченного, выполняющий раунды запросов, обучающий модели и отслеживающий историю точности.

Ключевые детали реализации

SimpleClassifier использует стандартный градиент кросс-энтропии для SGD:

gradient_j = P(y=j|x) - 1{j == label}
W[j,f] -= lr * gradient_j * x[f]
b[j] -= lr * gradient_j

Сэмплер разнообразия избегает пересчёта расстояний O(n*k) путём инкрементального обновления минимальных расстояний:

для каждой новой выбранной точки s:
для каждой оставшейся точки x в пуле:
min_distance[x] = min(min_distance[x], dist(x, s))
next_selected = argmax(min_distance)

Торговые признаки извлекаются из сырых данных OHLCV:

  • Лог-доходность: ln(close_t / close_{t-1}) — фиксирует импульс цены
  • Коэффициент тела: |close - open| / (high - low) — измеряет убедительность свечи
  • Коэффициенты теней: Верхний и нижний фитили относительно диапазона — измеряет отвержение
  • Изменение объёма: Относительное изменение объёма — индикатор участия

Интеграция с Bybit

Торговый пример получает свечи OHLCV в реальном времени из Bybit V5 API:

GET /v5/market/kline?category=spot&symbol=BTCUSDT&interval=60&limit=200

Ответ парсится в Vec<Candle> и обрабатывается через конвейер инженерии признаков. Метки генерируются из форвардных доходностей с настраиваемым порогом и периодом упреждения.

Экспериментальные результаты

Пример сравнивает пять стратегий на часовых данных BTCUSDT:

СтратегияТипичная финальная точностьИспользовано данных
Случайный базелайн~35-40%50 образцов
Неопределённость (Энтропия)~40-50%50 образцов
Неопределённость (Маржа)~38-48%50 образцов
Неопределённость (Наим. уверенность)~38-48%50 образцов
Разнообразие~37-45%50 образцов
Полный набор данных~40-50%~140 образцов

Ключевое наблюдение: активное обучение с 50 размеченными образцами (36% данных) часто достигает точности, сопоставимой с обучением на полном наборе из 140 образцов.

Продвинутые техники

Гибридные функции приобретения

На практике комбинирование неопределённости и разнообразия даёт лучшие результаты. Метод BADGE (Batch Active learning by Diverse Gradient Embeddings) выбирает разнообразные образцы в пространстве градиентных вложений, естественно комбинируя оба сигнала:

$$a_{\text{BADGE}}(x) = \text{kmeans++}\left(\nabla_\theta \ell(f_\theta(x), \hat{y})\right)$$

Ожидаемое изменение модели

Вместо измерения неопределённости в предсказании, можно измерить, насколько изменятся параметры модели, если разметить конкретный образец:

$$a_{\text{EMC}}(x) = \left| \mathbb{E}{y \sim P(y|x)} \left[ \nabla\theta \ell(f_\theta(x), y) \right] \right|$$

Образцы, которые вызвали бы наибольшее обновление параметров, являются наиболее информативными.

Байесовское активное обучение через несогласие (BALD)

BALD использует взаимную информацию между предсказаниями и параметрами модели:

$$a_{\text{BALD}}(x) = I(y; \theta \mid x) = H[P(y \mid x)] - \mathbb{E}_{P(\theta)}[H[P(y \mid x, \theta)]]$$

Это различает алеаторическую неопределённость (присущий шум — например, рыночная случайность) и эпистемическую неопределённость (незнание модели — устранимое большим количеством данных). Для активного обучения полезна только эпистемическая неопределённость.

Применения в трейдинге

1. Разметка режимов

Активное обучение может эффективно идентифицировать рыночные режимы. Эксперт размечает небольшое начальное множество явно трендовых/рейнджевых периодов. Затем модель выбирает неоднозначные переходные периоды для экспертной проверки, быстро строя комплексный классификатор режимов.

2. Обнаружение событий

Для обнаружения событий, таких как флеш-крэши или шорт-сквизы, активное обучение фокусирует внимание эксперта на пограничных случаях — было ли это падение на 2% за 5 минут “флеш-крэшем” или нормальной волатильностью? Эти пограничные случаи — именно то, что модели нужно выучить.

3. Классификация потока ордеров

Классификация сделок как информированных vs. неинформированных дорога (требует сопоставления с новостями, инсайдерскими документами и т.д.). Активное обучение выбирает сделки, где классификация наиболее неоднозначна, максимизируя ценность каждого ручного исследования.

4. Разметка тональности

Тональность финансовых новостей субъективна и требует человеческого суждения. Активное обучение выбирает статьи, где автоматизированные NLP-модели не согласны друг с другом или неуверены, гарантируя, что эксперты-аннотаторы сосредоточены на действительно неоднозначном контенте.

Ключевые выводы

  1. Активное обучение сокращает затраты на разметку на 50-90% при сохранении качества модели. В трейдинге, где экспертные метки дороги, это транслируется в значительный ROI.

  2. Выборка по неопределённости — простейшая и часто наиболее эффективная стратегия. Энтропийная выборка предпочтительна для мультиклассовых задач; маржинальная выборка превосходна для бинарных границ решений.

  3. Выборка по разнообразию предотвращает избыточность и обеспечивает покрытие пространства признаков. Комбинируйте с неопределённостью для лучших результатов.

  4. Запрос комитетом естественно фиксирует эпистемическую неопределённость через несогласие ансамбля. Требует обучения нескольких моделей, но обеспечивает робастные сигналы приобретения.

  5. Специфика трейдинга: Нестационарность означает, что цикл активного обучения должен быть непрерывным — поступают новые данные, старые метки могут устаревать, и модель должна постоянно определять, что нуждается в переаннотации.

  6. Реализация на Rust обеспечивает производительность продакшен-уровня. Линейный классификатор можно заменить любой моделью, выдающей оценки вероятностей; инфраструктура активного обучения остаётся той же.

Запуск кода

Окно терминала
cd 290_active_learning_trading/rust
cargo test # Запустить 15 модульных тестов
cargo run --example trading_example # Полная демо с интеграцией Bybit

Литература

  1. Settles, B. (2009). “Active Learning Literature Survey.” Computer Sciences Technical Report 1648, University of Wisconsin-Madison.
  2. Gal, Y., Islam, R., & Ghahramani, Z. (2017). “Deep Bayesian Active Learning with Image Data.” ICML.
  3. Ash, J. T., et al. (2020). “Deep Batch Active Learning by Diverse, Uncertain Gradient Lower Bounds.” ICLR.
  4. Houlsby, N., et al. (2011). “Bayesian Active Learning for Classification and Preference Learning.” arXiv:1112.5745.
  5. Sener, O. & Savarese, S. (2018). “Active Learning for Convolutional Neural Networks: A Core-Set Approach.” ICLR.