Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Как оценить позицию в очереди по данным Level 2

Позиция в очереди определяет вероятность исполнения пассивной заявки. Узнайте, как рассчитать её на основе агрегированных данных биржевого стакана и когда стоит перейти на MBO.

Позиция в очереди — это ваше место среди заявок, ожидающих исполнения по одной цене. На торговых площадках с приоритетом по цене и времени этот показатель определяет, получит ли пассивная заявка спред или не исполнится вовсе. Агрегированные рыночные данные не предоставляют это число: стакан Level 2 показывает лишь общий объем на каждом ценовом уровне, но не его структуру. Ниже описано, как оценить позицию в очереди на основе доступных большинству трейдеров данных и как понять, когда точности этих оценок становится недостаточно.

Почему позиция в очереди — это главное преимущество

Пассивная заявка находится в книге заявок и ожидает, пока кто-то другой не пересечет спред, чтобы исполнить её. Согласно приоритету по цене и времени, торговый движок ранжирует заявки сначала по цене, а затем по времени поступления. Если на покупку по $10.00 уже выставлено 10 000 акций, а вы добавили 100 акций после них, эти 10 000 акций должны быть исполнены или отменены, прежде чем дойдет ваша очередь. Если вы отмените и перевыставите заявку по той же цене, вы снова окажетесь в конце очереди.

Это ранжирование определяет экономику сделки. Находясь в начале очереди, вы торгуете часто и забираете спред плюс любые рибейты за предоставление ликвидности, что является темой комиссий и рибейтов maker-taker. В конце очереди вы торгуете только после того, как все перед вами получили исполнение, что случается при поступлении крупного одностороннего потока заявок. Исполнения в конце очереди происходят в моменты непосредственно перед тем, как цена проходит ваш уровень. Та же цена, та же заявка, противоположный результат.

Что показывают и чего не показывают данные Level 2

Level 1 — это лучшие цены покупки и продажи (bid и offer) с указанием объема на каждой. Level 2, также называемый «рынок по цене» (market by price), добавляет глубину: список ценовых уровней с общим объемом на каждом из них. Оба типа данных являются агрегированными, и в сравнении рыночных данных Level 1 и Level 2 они рассматриваются подробно. Когда объем на покупку по $10.00 падает с 10 000 до 8 500 акций, лента сообщает об исчезновении 1 500 акций. Она не уточняет, были ли они исполнены, была ли это одна заявка или сорок, и где именно в очереди они находились.

Исполнения — это видимая часть: лента фиксирует каждую сделку с указанием объема, поэтому их можно вычесть точно. Остальное — это отмены, и именно здесь начинаются догадки. Ниже приведена панель, сравнивающая количество сообщений на консолидированном верху стакана с количеством сделок в ленте для одной ликвидной акции за обычную сессию в среду, 10 июня 2026 года.

ЗапросСоотношение сообщений в очереди и сделок на ленте, AAPL, 10 июня 2026 г.
Точный SQL-код для каждого числа
SELECT
    q.et_time                            AS et_time,
    q.quote_updates                      AS quote_updates,
    t.trades                             AS trades,
    round(q.quote_updates / t.trades, 1) AS updates_per_trade
FROM
(
    SELECT
        formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
        count() AS quote_updates
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-06-10 12:00:00'
      AND sip_timestamp <  '2026-06-10 20:00:00'
    GROUP BY et_time
) AS q
INNER JOIN
(
    SELECT
        formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS trade_hour,
        count() AS trades
    FROM global_markets.stocks_trades
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-06-10 12:00:00'
      AND sip_timestamp <  '2026-06-10 20:00:00'
    GROUP BY trade_hour
) AS t ON q.et_time = t.trade_hour
ORDER BY et_time
Run this yourself

Час 08:00 приходится на время до открытия торгов: верх стакана менялся 0.8 раз на одну сделку, сообщений было меньше, чем сделок. В ходе регулярной сессии соотношение меняется. В час 15:00 верх стакана менялся 1.6 раза на сделку, всего за этот час поступило 233433 сообщений. Большая часть событий на ценовом уровне в открытом рынке — это заявки, которые приходят и уходят без исполнения, и каждое такое событие меняет ваше место в очереди на величину, которую не указывает ни один агрегированный поток данных.

Допущение о равномерной отмене и почему оно вам льстит

Стандартный подход предполагает, что отмены распределены по очереди равномерно. Обозначим x как вашу относительную глубину: количество акций перед вами, деленное на общий объем на вашем ценовом уровне. Равномерная модель устанавливает вероятность того, что любая отмененная акция находилась перед вами, равной x, то есть p(x) = x. Если вы находитесь в середине очереди из 10 000 акций и видите, что 1 000 акций отменяются без сделок, модель продвигает вас на 500 позиций вперед.

Реальные очереди имеют перекос. Заявка, которая уже простояла некоторое время, обычно принадлежит тому, кто готов ждать, тогда как заявка, добавленная мгновение назад, скорее всего, является краткосрочной котировкой, которая исчезнет через секунды. Отмены концентрируются ближе к концу очереди, рядом с вами и позади вас. Из тех 1 000 отмененных акций, возможно, лишь 200 находились перед вами, а модель приписала вам 500. Повторяйте это весь день, и симулированная очередь будет продвигаться быстрее реальной. Ошибка всегда односторонняя: больше исполнений в более удачные моменты, чем получают реальные заявки.

Как истощаются очереди

Отмены двигают вас незаметно. Сделки двигают вас заметно, на величину объема в ленте.

ЗапросРаспределение сделок AAPL по объему, 10 июня 2026 г.
Точный SQL-код для каждого числа
SELECT
    multiIf(size < 100,  'under 100 shares',
            size = 100,  'exactly 100 shares',
            size <= 499, '101 to 499 shares',
            size <= 999, '500 to 999 shares',
                         '1000 shares or more')             AS trade_size_group,
    round(100 * count() / sum(count()) OVER (), 1)          AS share_of_prints_pct,
    round(100 * sum(size) / sum(sum(size)) OVER (), 1)      AS share_of_shares_pct
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
  AND sip_timestamp >= '2026-06-10 14:00:00'
  AND sip_timestamp <  '2026-06-10 20:00:00'
GROUP BY trade_size_group
ORDER BY min(size)
Run this yourself

Сделки объемом менее лота составили 90% от общего количества в этой сессии и 42.5% от объема акций. Блоки по тысяче акций и более составили 0.2% от сделок и 19.9% от объема. Очереди истощаются небольшими порциями, поэтому разрыв между позицией 2 000 и 3 500 — это сотни сделок ожидания. Симулятор, который засчитывает исполнение после двух крупных сделок, пропустил большую часть ленты.

Заявка, которую вы не видите

Потоки данных о глубине рынка усечены. Если вы получаете десять ценовых уровней, а ваша заявка находится на одиннадцатом, она вне поля зрения: вы не видите ни объема перед ней, ни заявок, встающих позади. В этот момент вы не оцениваете число, а выдумываете его. Ситуация обычная, а не экзотическая, так как заявка, которая не следует за рынком, быстро отдаляется от спреда.

ЗапросЛучшая цена покупки и уровни цен, AAPL, 15-минутные интервалы
Точный SQL-код для каждого числа
SELECT
    formatDateTime(toStartOfFifteenMinutes(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
    round(avg(toFloat64(bid_price)), 2) AS best_bid,
    uniqExact(bid_price)                AS bid_levels_touched
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
  AND sip_timestamp >= '2026-06-10 14:00:00'
  AND sip_timestamp <  '2026-06-10 20:00:00'
  AND bid_price > 0
GROUP BY et_time
ORDER BY et_time
Run this yourself

В интервале 10:00 лучшая цена покупки составляла в среднем $290.29 и посетила 187 различных цен за пятнадцать минут. Каждая из этих цен — отдельный уровень для акции, котируемой в центах, поэтому обзор десяти уровней охватывает десять центов стакана. Заявка, оставленная на одной цене в течение такой сессии, может долго находиться ниже самого глубокого уровня, который видит её владелец.

Где позиция в очереди наиболее важна

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

ЗапросСредний котируемый спред и время нахождения на уровне одного цента, середина дня 10 июня 2026 г.
Точный SQL-код для каждого числа
SELECT
    ticker                                                AS symbol,
    round(avg(toFloat64(ask_price - bid_price)) * 100, 2) AS avg_spread_cents,
    round(100 * countIf(round(toFloat64(ask_price - bid_price) * 100) <= 1) / count(), 1) AS one_cent_pct
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'KO', 'NVDA', 'MSFT', 'BKNG')
  AND sip_timestamp >= '2026-06-10 15:00:00'
  AND sip_timestamp <  '2026-06-10 19:00:00'
  AND bid_price > 0
  AND ask_price > bid_price
GROUP BY ticker
ORDER BY avg_spread_cents
Run this yourself

За четыре полуденных часа той же сессии самый узкий из шести инструментов, KO, имел средний спред 1.18 цента и показывал спред в один цент на 82.5% обновлений. Самый широкий, MSFT, имел средний спред 8.46 центов, с одноцентовым спредом на 1.1% обновлений. Модель очереди, откалиброванная на первом инструменте, бесполезна для второго. Заявки, которые остаются между котировками, описанные в midpoint peg orders, формируют свою собственную очередь по тем же правилам.

Четыре диагностических метода для вашего бэктеста

  1. Сравните симулированный уровень исполнения с реальным уровнем исполнения по тем же инструментам за те же часы. Симулятор, который исполняет 70% заявок, когда в реальности исполняется 40%, описывает ваше допущение, а не рынок.
  2. Разделите симулированные исполнения на две группы: те, где ценовой уровень сохранился после сделки, и те, что произошли только при полном исчерпании уровня. Группа, смещенная ко второму типу, означает, что симулятор дает вам исполнения ровно в момент, когда цена проходит ваш уровень.
  3. Ограничьте допущение. Запустите тест, предполагая, что все отмены происходят из начала очереди, а затем — что все из конца. Эти два прогона показывают честные границы погрешности для любого выбранного вами p(x).
  4. Измерьте, как часто ваша цена находилась вне глубины, которую передает ваш поток данных. Исполнения там были выдуманы. Look-ahead bias в бэктестинге описывает ту же ошибку с другой стороны: результат, основанный на информации, которой стратегия никогда не обладала.

Когда прекратить моделирование и купить данные по заявкам

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

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

Площадки с пропорциональным распределением меняют вопрос

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

Часто задаваемые вопросы

Что такое позиция в очереди в трейдинге?

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

Можно ли рассчитать позицию в очереди по данным Level 2?

Неточно. Level 2 показывает общий объем на ценовом уровне без идентификации заявок, поэтому, когда объем исчезает без сделки, невозможно сказать, находились ли эти акции перед вами или позади. Вы можете оценить число и задать границы этой оценки. Точное значение требует данных по каждой заявке.

Почему результаты бэктестов по уровню исполнения обычно завышены?

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

Что такое MBO-данные?

Данные Market-by-order предоставляют сообщения по каждой отдельной заявке, от поступления до исполнения или отмены. Это поток, в котором ваше место в очереди можно посчитать, а не моделировать, что наиболее важно для стратегий, работающих на спреде в один тик.

Важна ли позиция в очереди на площадках с пропорциональным распределением?

Меньше. Пропорциональное распределение делит входящую заявку между ожидающими по объему, поэтому первое место дает мало преимуществ, а котируемый объем выполняет основную работу. Проверка модели распределения площадки должна предшествовать любому моделированию очереди.


Каждая панель здесь содержит SQL-код, который её создал. Измените тикер, дату и задайте тот же вопрос по инструментам, которыми вы торгуете в терминале Strasmore.