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

Глава 266: Классификация сделок с помощью машинного обучения

Введение

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

Большинство бирж не сообщают инициатора сделки в своих публичных потоках данных (хотя некоторые, например Bybit, это делают). Даже когда биржа сообщает сторону агрессора, исследователям часто необходимо классифицировать исторические сделки из наборов данных, где эта информация отсутствует. В этой главе рассматриваются классические методы классификации сделок на основе правил, представлен подход объемной классификации (BVC), а затем строится ансамбль ML, который комбинирует все эти сигналы для повышения точности.

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

Задача определения инициатора сделки

Рассмотрим сделку в момент времени $t$ с ценой $P_t$ и объемом $Q_t$. Текущая котировка bid-ask в момент $t$ составляет $(B_t, A_t)$ с серединой:

$$M_t = \frac{B_t + A_t}{2}$$

Спред равен $S_t = A_t - B_t$. Мы хотим классифицировать каждую сделку как инициированную покупателем (покупатель был агрессором, пересекшим спред) или инициированную продавцом.

Тик-тест

Тик-тест (или тик-правило) — простейший метод классификации. Он использует знак изменения цены:

$$\text{Side}t = \begin{cases} \text{Buy} & \text{если } P_t > P{t-1} \quad (\text{uptick}) \ \text{Sell} & \text{если } P_t < P_{t-1} \quad (\text{downtick}) \ \text{Side}{t-1} & \text{если } P_t = P{t-1} \quad (\text{правило нулевого тика}) \end{cases}$$

Интуиция заключается в том, что сделки, инициированные покупателем, толкают цену вверх, а инициированные продавцом — вниз. Правило нулевого тика переносит предыдущую классификацию при неизменной цене.

Точность: Тик-тест обычно достигает 70-85% точности в зависимости от рынка и класса активов. Он хуже работает на рынках с большим шагом цены относительно спреда.

Правило котировок

Правило котировок использует положение цены сделки относительно середины:

$$\text{Side}_t = \begin{cases} \text{Buy} & \text{если } P_t > M_t \ \text{Sell} & \text{если } P_t < M_t \ \text{Неопределенно} & \text{если } P_t = M_t \end{cases}$$

Логика в том, что покупатель, пересекающий спред, платит цену выше середины (ближе к ask), а продавец получает цену ниже середины (ближе к bid).

Алгоритм Ли-Реди

Ли и Реди (1991) объединили оба подхода. Алгоритм Ли-Реди использует правило котировок как основной классификатор и переключается на тик-тест, когда цена сделки равна середине:

$$\text{LR}t = \begin{cases} \text{QuoteRule}(P_t, M_t) & \text{если } P_t \neq M_t \ \text{TickTest}(P_t, P{t-1}) & \text{если } P_t = M_t \end{cases}$$

Ли и Реди также рекомендовали 5-секундную задержку при сопоставлении котировок (использование котировки за 5 секунд до сделки) для учета задержек отчетности. На современных электронных рынках эта задержка обычно не требуется.

Точность: Ли-Реди обычно достигает 85-93% точности и остается золотым стандартом среди методов на основе правил.

Объемная классификация (BVC)

Исли, Лопес де Прадо и О’Хара (2012) предложили метод Bulk Volume Classification, который работает с агрегированными объемными барами, а не с отдельными сделками. Для каждого бара $i$ с ценой закрытия $P_i$:

$$V^B_i = V_i \cdot \Phi\left(\frac{P_i - P_{i-1}}{\sigma_{\Delta P}}\right)$$

где $\Phi$ — функция распределения стандартного нормального закона, а $\sigma_{\Delta P}$ — стандартное отклонение изменений цены. Доля объема покупок:

$$f^B_i = \Phi\left(\frac{\Delta P_i}{\sigma_{\Delta P}}\right)$$

BVC особенно полезен, когда данные об отдельных сделках недоступны и имеются только данные на уровне баров (OHLCV).

Классификация на основе ML

Подходы машинного обучения рассматривают классификацию сделок как задачу бинарной классификации. Для каждой сделки мы извлекаем вектор признаков:

$$\mathbf{x}_t = \left[\frac{P_t - M_t}{S_t}, \frac{Q_t}{\bar{Q}}, \text{tick}_t, S_t, \frac{B^s_t - A^s_t}{B^s_t + A^s_t}, \Delta t\right]$$

где:

  • $(P_t - M_t) / S_t$ — относительное положение цены внутри спреда
  • $Q_t / \bar{Q}$ — относительный размер сделки
  • $\text{tick}_t \in {-1, 0, +1}$ — направление тика
  • $S_t$ — спред
  • $(B^s_t - A^s_t) / (B^s_t + A^s_t)$ — дисбаланс котировок (объем bid vs ask)
  • $\Delta t$ — время с момента последней сделки

Модель логистической регрессии предсказывает вероятность покупки:

$$P(\text{Buy} | \mathbf{x}_t) = \sigma(\mathbf{w}^T \mathbf{x}_t + b) = \frac{1}{1 + e^{-(\mathbf{w}^T \mathbf{x}_t + b)}}$$

Ансамблевый подход

Наш ансамбль комбинирует ML-предсказание с классическими методами с помощью взвешенного голосования:

$$P_{\text{ensemble}} = \alpha_1 \cdot P_{\text{ML}} + \alpha_2 \cdot V_{\text{LR}} + \alpha_3 \cdot V_{\text{tick}} + \alpha_4 \cdot f^B_{\text{BVC}}$$

где $V_{\text{LR}}, V_{\text{tick}} \in {0, 0.5, 1}$ — голоса Ли-Реди и тик-теста (0.5 для неопределенных случаев), а $\alpha_1 + \alpha_2 + \alpha_3 + \alpha_4 = 1$.

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

1. Дисбаланс потока ордеров

Классификация сделок — первый шаг в вычислении дисбаланса потока ордеров (OFI), мощного предиктора краткосрочных ценовых движений:

$$\text{OFI}t = \sum{i \in \text{window}} Q_i \cdot \mathbb{1}[\text{Side}i = \text{Buy}] - \sum{i \in \text{window}} Q_i \cdot \mathbb{1}[\text{Side}_i = \text{Sell}]$$

2. Вероятность информированной торговли (PIN)

Модель PIN требует подсчета сделок, инициированных покупателями и продавцами, за период. Ошибки классификации напрямую искажают оценки PIN.

3. Декомпозиция эффективного спреда

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

$$\text{EffectiveSpread}_t = 2 \cdot d_t \cdot (P_t - M_t)$$

где $d_t = +1$ для покупок и $d_t = -1$ для продаж.

4. Стратегии маркет-мейкинга

Маркет-мейкер, правильно определяющий агрессора, может оценить свои издержки неблагоприятного отбора и оптимизировать стратегию котирования.

Описание реализации на Rust

Наша реализация в rust/src/lib.rs содержит пять основных компонентов:

Структуры данных

Мы определяем Trade, Quote, TradeSide и вспомогательные структуры. Каждая сделка имеет временную метку, цену, объем и опциональную сторону (которая может быть неизвестна и требует классификации).

TickTestClassifier

Тик-тест последовательно перебирает сделки, сравнивая цену каждой с предыдущей. Переменная last_side обеспечивает правило нулевого тика.

QuoteRuleClassifier и LeeReadyClassifier

Правило котировок сравнивает цену каждой сделки с текущей серединой. Ли-Реди комбинирует оба метода, используя quote_class.or(tick_class) для переключения на тик-тест при неопределенности правила котировок.

BulkVolumeClassifier

BVC использует логистическую аппроксимацию нормальной CDF для эффективности:

$$\Phi(x) \approx \frac{1}{1 + e^{-1.7x}}$$

Это позволяет избежать полной реализации нормальной CDF при сохранении хорошей точности.

EnsembleClassifier

Ансамбль запускает все четыре метода параллельно и комбинирует их выходы с весами: ML 40%, Ли-Реди 30%, тик-тест 15%, BVC 15%.

Извлечение признаков

Функция extract_features вычисляет шестимерный вектор признаков для каждой сделки, обрабатывая краевые случаи.

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

Реализация включает три эндпоинта Bybit API:

  1. fetch_bybit_trades: Получает недавние сделки из /v5/market/recent-trading-records. Bybit удобно сообщает сторону агрессора, что позволяет валидировать алгоритмы классификации.

  2. fetch_bybit_orderbook: Получает текущий лучший bid/ask из /v5/market/orderbook, предоставляя данные котировок для правила котировок и классификатора Ли-Реди.

  3. fetch_bybit_klines: Получает свечи OHLCV из /v5/market/kline для анализа BVC.

Торговый пример загружает реальные данные BTCUSDT с Bybit, классифицирует каждую сделку всеми методами и сравнивает предсказания с метками биржи для вычисления точности.

Запуск кода

Окно терминала
cd 266_trade_classification/rust
# Запуск тестов
cargo test
# Запуск торгового примера (загружает данные с Bybit)
cargo run --example trading_example

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

  1. Классификация сделок фундаментальна: Многие микроструктурные метрики (OFI, PIN, эффективный спред) зависят от правильной идентификации инициатора сделки.

  2. Классические методы удивительно сильны: Ли-Реди достигает 85-93% точности с помощью простых правил. Тик-тест один дает 70-85%.

  3. ML улучшает на границах: Машинное обучение может уловить нелинейные зависимости и дополнительные признаки (дисбаланс котировок, паттерны размеров сделок), которые пропускают методы на основе правил.

  4. Ансамблевые методы работают лучше всего: Комбинирование ML-предсказаний с классическими правилами дает более устойчивые результаты, чем любой отдельный метод, особенно в краевых случаях.

  5. BVC позволяет анализ на уровне баров: Когда данные об отдельных сделках недоступны, BVC предоставляет принципиальный способ оценки объемов покупок/продаж из баров OHLCV.

  6. Метки биржи ценны, но не всегда доступны: Bybit сообщает сторону агрессора, что делает его отличной платформой для валидации алгоритмов классификации.

  7. Инженерия признаков важна: Относительное положение цены внутри спреда — наиболее информативный признак, за ним следуют направление тика и дисбаланс котировок.

Литература

  • Lee, C.M.C. and Ready, M.J. (1991). “Inferring Trade Direction from Intraday Data.” Journal of Finance, 46(2), 733-746.
  • Easley, D., Lopez de Prado, M., and O’Hara, M. (2012). “Bulk Classification of Trading Activity.” Johnson School Research Paper Series, No. 8-2012.
  • Ellis, K., Michaely, R., and O’Hara, M. (2000). “The Accuracy of Trade Classification Rules: Evidence from Nasdaq.” Journal of Financial and Quantitative Analysis, 35(4), 529-551.
  • Chakrabarty, B., Li, B., Nguyen, V., and Van Ness, R.A. (2007). “Trade Classification Algorithms for Electronic Communications Network Trades.” Journal of Banking & Finance, 31(12), 3806-3821.