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

Глава 269: Прогнозирование ликвидности для трейдинга

1. Введение

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

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

  • Выбирать время для крупных ордеров, исполняя их в предсказуемые окна высокой ликвидности, снижая влияние на рынок.
  • Динамически определять размер ордеров, отправляя более крупные дочерние ордера, когда стакан должен быть глубоким, и меньшие, когда он истончается.
  • Избегать неблагоприятного исполнения, обнаруживая надвигающийся дефицит ликвидности до его наступления.
  • Улучшать стратегии захвата спреда, предсказывая, когда спреды сузятся или расширятся.

В этой главе мы разрабатываем полный конвейер прогнозирования ликвидности на Rust. Мы формализуем три классических измерения ликвидности (глубина, узость, устойчивость), создаём признаки из снимков книги лимитных ордеров (LOB), строим LSTM-прогнозировщик ликвидности, обучаем классификатор режимов ликвидности в стиле XGBoost и демонстрируем оптимальное определение размера ордеров на основе предсказанной ликвидности. Все данные получаются с криптовалютной биржи Bybit через её публичный REST API.


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

2.1 Три измерения ликвидности

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

Узость (Tightness) измеряет стоимость двусторонней сделки. Наиболее распространённый показатель — котируемый спред бид-аск:

$$S_t = P_t^{ask} - P_t^{bid}$$

Относительный спред нормализуется на среднюю цену $m_t = (P_t^{ask} + P_t^{bid}) / 2$:

$$s_t = \frac{S_t}{m_t}$$

На узком рынке $s_t$ мал, что означает, что трейдер может купить и немедленно продать с минимальными потерями на спреде.

Глубина (Depth) измеряет объём, доступный на лучших котировках или вблизи них. Определим кумулятивную глубину на уровне $N$ с каждой стороны:

$$D_t^{bid}(N) = \sum_{i=1}^{N} q_t^{bid,i}, \quad D_t^{ask}(N) = \sum_{i=1}^{N} q_t^{ask,i}$$

где $q_t^{bid,i}$ — объём на $i$-м лучшем уровне бид. Общая глубина вблизи лучших цен:

$$D_t(N) = D_t^{bid}(N) + D_t^{ask}(N)$$

Профиль глубины ${D_t(1), D_t(2), \ldots, D_t(N)}$ даёт многомасштабное представление доступной ликвидности. На глубоких рынках $D_t(N)$ быстро растёт с $N$; на тонких рынках глубина накапливается медленно.

Устойчивость (Resilience) измеряет, как быстро книга ордеров восстанавливается после шока ликвидности (например, крупного рыночного ордера, поглощающего несколько уровней). Определим показатель устойчивости как отношение восстановления глубины за окно $\Delta$:

$$R_t(\Delta) = \frac{D_{t+\Delta}(N)}{D_{t}(N)}$$

где $D_t(N)$ измеряется сразу после крупной сделки. На устойчивом рынке $R_t(\Delta) \approx 1$ или больше за короткий $\Delta$, что указывает на быстрое пополнение израсходованных уровней новыми лимитными ордерами.

2.2 Модель профиля глубины LOB

Мы моделируем кумулятивную глубину как функцию ценового расстояния от средней цены. Пусть $\delta_i$ — ценовое смещение $i$-го уровня от средней цены:

$$\delta_i^{bid} = m_t - P_t^{bid,i}, \quad \delta_i^{ask} = P_t^{ask,i} - m_t$$

Эмпирические исследования показывают, что кумулятивная глубина часто следует степенной или лог-линейной зависимости:

$$\ln D_t(\delta) \approx \alpha + \beta \ln \delta$$

Наклон $\beta$ характеризует концентрацию ликвидности. Высокий $\beta$ указывает на концентрацию ликвидности вблизи лучших цен; низкий $\beta$ означает, что ликвидность распределена по многим уровням.

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

Дисбаланс потока ордеров (OFI) отражает направленное давление на стакан. На каждом снимке:

$$\text{OFI}_t = \frac{D_t^{bid}(N) - D_t^{ask}(N)}{D_t^{bid}(N) + D_t^{ask}(N)}$$

OFI изменяется от $-1$ (вся глубина на стороне аск) до $+1$ (вся глубина на стороне бид). Устойчивый положительный OFI предполагает давление покупателей и потенциальное движение цены вверх; отрицательный OFI предполагает давление продавцов.

2.4 LSTM для прогнозирования временных рядов ликвидности

Мы используем сеть LSTM для прогнозирования будущих метрик ликвидности на основе исторических последовательностей. Дан вектор признаков $x_t \in \mathbb{R}^d$ в момент времени $t$, содержащий спред, глубину на нескольких уровнях, OFI и признаки объёма. LSTM обрабатывает окно обратного просмотра ${x_{t-L+1}, \ldots, x_t}$ и производит прогноз:

$$\hat{y}{t+1} = W{out} \cdot h_t + b_{out}$$

где $h_t$ — конечное скрытое состояние. Уравнения ячейки LSTM представляют стандартную формулировку с четырьмя вентилями:

$$f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)$$ $$i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)$$ $$\tilde{C}t = \tanh(W_C [h{t-1}, x_t] + b_C)$$ $$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}t$$ $$o_t = \sigma(W_o [h{t-1}, x_t] + b_o)$$ $$h_t = o_t \odot \tanh(C_t)$$

Для прогнозирования ликвидности целевая переменная $y_{t+1}$ может быть общей глубиной на следующий период $D_{t+1}(N)$, спредом $s_{t+1}$ или композитной оценкой ликвидности.

2.5 XGBoost для классификации режимов ликвидности

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

$$\text{Regime}t = \begin{cases} \text{High} & \text{если } D_t(N) > P{67}(D) \ \text{Medium} & \text{если } P_{33}(D) \le D_t(N) \le P_{67}(D) \ \text{Low} & \text{если } D_t(N) < P_{33}(D) \end{cases}$$

Мы реализуем упрощённый ансамбль деревьев с градиентным бустингом (пеньки) для демонстрации концепции на чистом Rust без зависимостей от внешних ML-фреймворков.

2.6 Оптимальное определение размера ордера при прогнозируемой ликвидности

При прогнозируемой глубине $\hat{D}_{t+1}(N)$ и целевом объёме исполнения $Q$ оптимальный размер дочернего ордера $q^*$ минимизирует ожидаемое влияние на рынок:

$$q^* = \min\left(Q, \gamma \cdot \hat{D}_{t+1}(N)\right)$$

где $\gamma \in (0, 1)$ — ограничение участия (например, 10% от прогнозируемой доступной глубины). Это гарантирует, что ордер не потребляет более определённой доли ожидаемого стакана, ограничивая неблагоприятное влияние на цену.

Ожидаемое проскальзывание при проходе по стакану приблизительно равно:

$$\text{Slippage}(q) \approx \frac{q^2}{2 \cdot D_t(N)} \cdot \bar{\delta}$$

где $\bar{\delta}$ — средний ценовой разрыв на уровень. Эта квадратичная зависимость подчёркивает важность точного прогнозирования глубины: недооценка глубины приводит к излишне малым ордерам (упущенная выгода), а переоценка — к чрезмерному влиянию на рынок.


3. Модели машинного обучения

3.1 LSTM-прогнозировщик ликвидности

LSTM-модель принимает на вход последовательность векторов признаков за окно обратного просмотра. Каждый вектор признаков включает:

ПризнакОписание
spreadОтносительный спред бид-аск $s_t$
depth_1Общая глубина на 1-м уровне
depth_5Общая глубина на 5 уровнях
depth_10Общая глубина на 10 уровнях
ofiДисбаланс потока ордеров
volumeНедавний объём торгов
volatilityСкользящее стандартное отклонение цены

Выход — прогнозируемая общая глубина на 5 уровнях для следующего периода. Модель обучается минимизацией MSE-функции потерь с обратным распространением через время. В нашей реализации на Rust используется LSTM-ячейка, построенная с нуля, с инициализацией весов по Ксавье.

3.2 XGBoost-классификатор режимов ликвидности

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

Этот подход ценен для алгоритмов исполнения, которые переключаются между агрессивными и пассивными стратегиями в зависимости от режима ликвидности.


4. Применения

4.1 Оптимальное определение размера ордеров

Основное применение прогнозирования ликвидности — динамическое определение размера ордеров. Алгоритм TWAP или VWAP обычно делит родительский ордер на равные дочерние ордера. Обуславливая размер дочернего ордера прогнозируемой ликвидностью:

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

Этот адаптивный подход снижает общую стоимость влияния на рынок по сравнению с наивным равномерным разделением.

4.2 Выбор времени для крупных сделок

Институциональные трейдеры, исполняющие крупные блочные ордера, выигрывают от планирования исполнения во время предсказуемых окон ликвидности. LSTM-прогнозировщик определяет внутридневные паттерны ликвидности (например, более глубокий стакан во время пересечения торговых сессий, меньшая глубина в нерабочие часы) и соответственно адаптирует расписание исполнения.

4.3 Прогнозирование спреда для маркет-мейкинга

Маркет-мейкеры могут использовать прогнозы ликвидности для корректировки стратегии котирования. Когда модель прогнозирует расширение спредов (низкая ликвидность), маркет-мейкер должен расширить свои котировки, чтобы избежать неблагоприятного отбора. Когда прогнозируются узкие спреды, более узкие котировки привлекают больше потока.


5. Реализация на Rust

Реализация на Rust в rust/src/lib.rs предоставляет:

  1. LiquidityMetrics — Вычисляет глубину на N уровнях, относительный спред, дисбаланс потока ордеров и композитную оценку ликвидности из сырых данных стакана.

  2. LstmCell и LstmForecaster — Реализация LSTM с нуля для прогнозирования временных рядов ликвидности. Прогнозировщик обрабатывает последовательность векторов признаков и выводит прогнозируемую глубину на следующий период.

  3. LiquidityRegimeClassifier — Ансамбль пеньков с градиентным бустингом, классифицирующий рынок по режимам: Высокий, Средний или Низкий.

  4. OptimalOrderSizer — Вычисляет рекомендуемый размер дочернего ордера на основе прогнозируемой глубины и ограничения участия.

  5. BybitClient — Получает снимки стакана в реальном времени из REST API Bybit.

Реализация минимально зависима от внешних библиотек, используя только ndarray для линейной алгебры, reqwest для HTTP и serde для десериализации JSON.


6. Интеграция данных Bybit

Мы используем публичный REST API Bybit V5 для получения данных стакана в реальном времени:

GET https://api.bybit.com/v5/market/orderbook?category=linear&symbol=BTCUSDT&limit=50

Ответ содержит массивы пар [цена, объём] для бидов и асков. Наша структура BybitClient разбирает их в структурированный OrderbookSnapshot, который напрямую подаётся в конвейер вычисления метрик ликвидности.

Для исторического анализа множественные снимки собираются через регулярные интервалы (например, каждую 1 секунду) и сохраняются как временные ряды векторов признаков для обучения LSTM.


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

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

  2. Сети LSTM хорошо подходят для прогнозирования ликвидности, поскольку захватывают как быстрые внутридневные паттерны, так и более медленные смены режимов в динамике стакана.

  3. Классификация режимов (Высокая/Средняя/Низкая ликвидность) даёт дискретный сигнал, на который алгоритмы исполнения могут напрямую реагировать, переключаясь между агрессивными и пассивными стратегиями.

  4. Оптимальный размер ордера линейно масштабируется с прогнозируемой глубиной, а влияние на рынок масштабируется квадратично с размером ордера относительно глубины — что делает точное прогнозирование глубины высокоценным.

  5. Данные стакана в реальном времени с бирж типа Bybit предоставляют сырьё для прогнозирования ликвидности. Даже простые признаки (спред, глубина на N уровнях, OFI) содержат значительный прогностический сигнал.

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

  7. Ограничения участия ($\gamma$) обеспечивают механизм безопасности, предотвращающий потребление алгоритмами исполнения слишком большой доли доступной ликвидности, даже когда прогнозы чрезмерно уверены.