Глава 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:
-
fetch_bybit_trades: Получает недавние сделки из/v5/market/recent-trading-records. Bybit удобно сообщает сторону агрессора, что позволяет валидировать алгоритмы классификации. -
fetch_bybit_orderbook: Получает текущий лучший bid/ask из/v5/market/orderbook, предоставляя данные котировок для правила котировок и классификатора Ли-Реди. -
fetch_bybit_klines: Получает свечи OHLCV из/v5/market/klineдля анализа BVC.
Торговый пример загружает реальные данные BTCUSDT с Bybit, классифицирует каждую сделку всеми методами и сравнивает предсказания с метками биржи для вычисления точности.
Запуск кода
cd 266_trade_classification/rust
# Запуск тестовcargo test
# Запуск торгового примера (загружает данные с Bybit)cargo run --example trading_exampleКлючевые выводы
-
Классификация сделок фундаментальна: Многие микроструктурные метрики (OFI, PIN, эффективный спред) зависят от правильной идентификации инициатора сделки.
-
Классические методы удивительно сильны: Ли-Реди достигает 85-93% точности с помощью простых правил. Тик-тест один дает 70-85%.
-
ML улучшает на границах: Машинное обучение может уловить нелинейные зависимости и дополнительные признаки (дисбаланс котировок, паттерны размеров сделок), которые пропускают методы на основе правил.
-
Ансамблевые методы работают лучше всего: Комбинирование ML-предсказаний с классическими правилами дает более устойчивые результаты, чем любой отдельный метод, особенно в краевых случаях.
-
BVC позволяет анализ на уровне баров: Когда данные об отдельных сделках недоступны, BVC предоставляет принципиальный способ оценки объемов покупок/продаж из баров OHLCV.
-
Метки биржи ценны, но не всегда доступны: Bybit сообщает сторону агрессора, что делает его отличной платформой для валидации алгоритмов классификации.
-
Инженерия признаков важна: Относительное положение цены внутри спреда — наиболее информативный признак, за ним следуют направление тика и дисбаланс котировок.
Литература
- 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.