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

Глава 280: Обучение с подкреплением для торговли на книге заявок (LOB)

Введение

Книга лимитных заявок (LOB, Limit Order Book) является центральным механизмом современных электронных бирж. Она хранит записи обо всех ожидающих заявках на покупку (bid) и продажу (ask) на различных ценовых уровнях, формируя микроструктуру, через которую осуществляется ценообразование. Торговля в среде LOB представляет уникальные вызовы: частичная наблюдаемость, состязательная динамика, ограничения по задержке и фундаментальное противоречие между качеством исполнения и влиянием на рынок.

Обучение с подкреплением (RL) предлагает естественную основу для торговли на LOB, потому что задача по своей природе является последовательной. Агент наблюдает текущее состояние книги заявок, совершает действия (размещение, изменение или отмена ордеров) и получает вознаграждение на основе торговых результатов. В отличие от подходов обучения с учителем, которые предсказывают будущие цены, RL-агенты обучают политики, которые напрямую оптимизируют торговые цели: прибыль и убыток (PnL), стоимость исполнения или доходность с поправкой на риск.

Три основные задачи торговли на LOB выигрывают от RL:

  1. Маркет-мейкинг: Агент непрерывно выставляет цены покупки и продажи, зарабатывая на спреде при управлении инвентарным риском. Классическая модель Авелланеды-Стоикова даёт аналитические решения при упрощающих предположениях; RL расширяет их до реалистичных, управляемых данными условий.

  2. Оптимальное исполнение: Имея крупный ордер для исполнения в течение временного горизонта, агент должен разделить его на более мелкие дочерние ордера для минимизации рыночного воздействия. Фреймворк Альмгрена-Крисса обеспечивает основу, а RL обучает адаптивные стратегии, реагирующие на рыночные условия в реальном времени.

  3. Статистический арбитраж: Агент выявляет и использует временные ценовые расхождения между связанными инструментами, размещая ордера в LOB и обучаясь паттернам, слишком сложным для ручных правил.

В этой главе разрабатываются математические основы, реализуется полный симулятор LOB с RL-агентами на Rust и демонстрируется интеграция с реальными данными книги заявок Bybit.

Математический аппарат

Пространство состояний LOB

Состояние книги лимитных заявок в момент времени $t$ характеризуется очередями bid и ask. Пусть ${(p_i^b, q_i^b)}{i=1}^{L}$ обозначает $L$ лучших уровней bid, где $p_i^b$ — цена, а $q_i^b$ — количество на уровне $i$. Аналогично, ${(p_j^a, q_j^a)}{j=1}^{L}$ обозначает сторону ask.

Вектор состояния, наблюдаемый RL-агентом:

$$s_t = \left( {p_i^b, q_i^b}{i=1}^{L}, {p_j^a, q_j^a}{j=1}^{L}, I_t, \Delta t, v_t \right)$$

где:

  • $I_t$ — текущая позиция агента по инвентарю
  • $\Delta t$ — оставшееся время в торговом горизонте
  • $v_t$ — недавний объём торгов (прокси для волатильности)

Средняя цена: $m_t = (p_1^b + p_1^a) / 2$, а спред: $s_t = p_1^a - p_1^b$.

Пространство действий

Для маркет-мейкинга пространство действий определяется через смещения спреда. Агент выбирает:

$$a_t = (\delta^b_t, \delta^a_t) \in \mathcal{A}$$

где $\delta^b_t$ и $\delta^a_t$ — расстояния от средней цены, на которых размещаются котировки bid и ask. В дискретном случае $\mathcal{A} = {0.5, 1.0, 1.5, 2.0, 2.5} \times {0.5, 1.0, 1.5, 2.0, 2.5}$ в кратных тикам.

Для оптимального исполнения действие — это доля оставшегося ордера для исполнения:

$$a_t = f_t \in {0, 0.1, 0.2, \ldots, 1.0}$$

Функция вознаграждения

Вознаграждение объединяет PnL со штрафом за инвентарь:

$$r_t = \text{PnL}_t - \lambda \cdot I_t^2$$

где:

  • $\text{PnL}t = \sum{\text{fills}} (\text{sell_price} - \text{buy_price}) \cdot \text{quantity}$ — реализованный PnL от исполнений
  • $\lambda \cdot I_t^2$ — квадратичный штраф за инвентарь, препятствующий большим позициям
  • $\lambda > 0$ — параметр неприятия риска

Квадратичный штраф мотивирован моделью Авелланеды-Стоикова, где оптимальная резервная цена линейно сдвигается с инвентарём: $r_t = m_t - \gamma \sigma^2 I_t (T - t)$, где $\gamma$ — неприятие риска, а $\sigma$ — волатильность.

Терминальное вознаграждение

В конце горизонта $T$ оставшийся инвентарь ликвидируется по средней цене со штрафом:

$$r_T = I_T \cdot m_T - \alpha \cdot |I_T| \cdot s_T$$

где $\alpha$ учитывает стоимость пересечения спреда для закрытия позиции.

Маркет-мейкинг с RL: Авелланеда-Стоиков встречает DQN

Базовая модель Авелланеды-Стоикова

Классическая модель Авелланеды-Стоикова (AS) предполагает, что средняя цена следует геометрическому броуновскому движению, и выводит оптимальные котировки bid/ask:

$$\delta^{b*} = \frac{1}{\gamma} \ln\left(1 + \frac{\gamma}{\kappa}\right) + \frac{(2I_t + 1)\gamma\sigma^2(T-t)}{2}$$

$$\delta^{a*} = \frac{1}{\gamma} \ln\left(1 + \frac{\gamma}{\kappa}\right) - \frac{(2I_t - 1)\gamma\sigma^2(T-t)}{2}$$

где $\kappa$ — параметр интенсивности поступления ордеров. Это решение элегантно, но предполагает постоянную волатильность, пуассоновские поступления и отсутствие эффектов приоритета в очереди.

Расширение DQN

Глубокие Q-сети заменяют эти предположения выученными представлениями. Q-функция $Q(s_t, a_t; \theta)$ отображает пары состояние-действие в ожидаемое накопленное вознаграждение. Агент выбирает действия через epsilon-жадную стратегию:

$$a_t = \begin{cases} \arg\max_a Q(s_t, a; \theta) & \text{с вероятностью } 1 - \epsilon \ \text{случайное действие} & \text{с вероятностью } \epsilon \end{cases}$$

Сеть обучается минимизацией ошибки временной разности:

$$\mathcal{L}(\theta) = \mathbb{E}\left[\left(r_t + \gamma \max_{a’} Q(s_{t+1}, a’; \theta^-) - Q(s_t, a_t; \theta)\right)^2\right]$$

где $\theta^-$ — параметры целевой сети, обновляемые периодически.

Преимущества над классическими моделями

RL маркет-мейкер обучается:

  1. Адаптировать спреды к текущим режимам волатильности без явной оценки
  2. Расширять котировки перед ожидаемыми крупными сделками (обучено из паттернов потока ордеров)
  3. Управлять инвентарём нелинейно, становясь более агрессивным вблизи лимитов позиции
  4. Учитывать эффекты позиции в очереди, которые аналитические модели игнорируют

Оптимальное исполнение: Альмгрен-Крисс встречает градиент политики

Фреймворк Альмгрена-Крисса

Модель Альмгрена-Крисса минимизирует комбинацию ожидаемой стоимости исполнения и дисперсии стоимости:

$$\min_{{n_k}} \mathbb{E}[C] + \lambda \cdot \text{Var}[C]$$

где $C = \sum_{k=1}^{N} n_k \cdot (\text{временное воздействие} + \text{постоянное воздействие})$ и $n_k$ — количество акций, торгуемых в периоде $k$. Оптимальное решение — детерминированное расписание типа TWAP/VWAP.

Расширение градиента политики

Методы градиента политики обучают стохастическую политику $\pi_\theta(a_t | s_t)$, адаптирующую исполнение к рыночным условиям. Алгоритм REINFORCE обновляет:

$$\theta \leftarrow \theta + \alpha \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot G_t$$

где $G_t = \sum_{k=t}^{T} \gamma^{k-t} r_k$ — будущая доходность. Методы актор-критик снижают дисперсию, обучая базовую линию:

$$\theta \leftarrow \theta + \alpha \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot (G_t - V_\phi(s_t))$$

Обученная политика адаптирует скорость исполнения на основе:

  • Текущего спреда и глубины (исполнять больше при высокой ликвидности)
  • Недавнего ценового импульса (опережать неблагоприятные движения)
  • Паттернов времени суток (использовать предсказуемые циклы ликвидности)

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

Реализация предоставляет полную среду симуляции LOB и обучения RL:

// Основные типы LOB
pub struct OrderBook {
bids: BTreeMap<OrderedFloat<f64>, f64>, // цена -> количество
asks: BTreeMap<OrderedFloat<f64>, f64>,
}
// RL-агент с DQN
pub struct DQNMarketMaker {
q_table: HashMap<StateKey, Vec<f64>>, // табличный Q для вычислимости
inventory: f64,
pnl: f64,
risk_aversion: f64,
}

Ключевые компоненты:

  1. Симулятор LOB: Поддерживает очереди bid/ask, обрабатывает лимитные и рыночные ордера, выполняет сопоставление ордеров с приоритетом цена-время
  2. Агент маркет-мейкинга: Котирует bid/ask вокруг средней цены, управляет инвентарём с квадратичным штрафом, обучает оптимальный спред через Q-обучение
  3. Обучение DQN: Epsilon-жадное исследование, буфер воспроизведения опыта, периодическое обновление целей
  4. Интеграция с Bybit: Получает снимки книги заявок BTCUSDT в реальном времени через REST API

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

Реализация получает данные книги заявок в реальном времени из публичного API Bybit:

pub async fn fetch_bybit_orderbook(symbol: &str, limit: usize) -> Result<OrderBook> {
let url = format!(
"https://api.bybit.com/v5/market/orderbook?category=spot&symbol={}&limit={}",
symbol, limit
);
// Парсинг уровней bid/ask в структуру OrderBook
}

Это позволяет:

  • Бэктестинг на реалистичных данных: Использование исторических снимков для обучения агентов
  • Симуляция в реальном времени: Подача реальных состояний книги заявок обученному агенту
  • Анализ спредов: Сравнение котируемых агентом спредов с реальными рыночными спредами
  • Оценка волатильности: Вывод реализованной волатильности из динамики книги заявок

Конвейер обучения

Полный конвейер обучения работает следующим образом:

  1. Сбор данных: Получение снимков книги заявок или генерация синтетических данных LOB
  2. Настройка среды: Инициализация симулятора LOB с реалистичными параметрами
  3. Цикл эпизодов: Для каждого эпизода сброс среды и запуск агента на $T$ шагов
  4. Выбор действия: Агент наблюдает состояние, выбирает смещения спреда через epsilon-жадную стратегию
  5. Шаг среды: Симулятор обрабатывает котировки агента и входящие рыночные ордера
  6. Вычисление вознаграждения: Расчёт PnL от исполнений минус штраф за инвентарь
  7. Обновление Q: Обновление Q-значений через обучение временной разностью
  8. Оценка: Периодическая оценка обученной политики относительно базовых стратегий

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

  1. RL естественно подходит для торговли на LOB, потому что задача по своей природе последовательна с отложенными вознаграждениями. Действия (размещение ордеров) имеют длительное влияние на инвентарь и позицию в очереди.

  2. Представление состояния имеет огромное значение. Включение нескольких уровней LOB, дисбаланса потока ордеров и инвентаря в состояние позволяет агенту обучать тонкие стратегии, которые не могут поддерживать простые признаки.

  3. Формирование вознаграждения через штраф за инвентарь необходимо. Без него агенты склонны накапливать большие направленные позиции, подвергая себя неблагоприятным ценовым движениям. Квадратичный штраф $\lambda I^2$ естественно поощряет возврат инвентаря к среднему.

  4. Классические модели обеспечивают сильные базовые линии. Авелланеда-Стоиков для маркет-мейкинга и Альмгрен-Крисс для исполнения — это не просто бенчмарки, но и источники структурных прозрений, информирующих архитектуру RL.

  5. Точность симуляции — узкое место. Разрыв между симулированной и реальной динамикой LOB (распределения поступления ордеров, неблагоприятный отбор, задержка) определяет, насколько хорошо политики RL переносятся на реальную торговлю.

  6. Компромисс исследования и эксплуатации особенно сложен в торговле на LOB, потому что исследование (размещение неоптимальных ордеров) имеет реальную стоимость. Техники оптимистичной инициализации и исследования на основе подсчёта помогают.

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