Микроструктура стакана Si: айсберги, спуфинг и реальные намерения
Объём в стакане Si врёт чаще, чем говорит. Разбираем, как отличить айсберг от наслойки заявок, почему спуфинг живёт на Мосбирже до сих пор и какие сигналы из L2 реально предсказывают движение.
Зачем читать стакан, если есть свечи
Свеча — это результат. Стакан — это намерения, причём
намерения, которые крупные участники активно маскируют. На
фьючерсе Si (USD/RUB) ликвидность сконцентрирована в первых
5–10 уровнях, и почти весь информационный контент о
краткосрочном движении живёт там же.
На дневках Si практически случайно блуждает, потому что
доминирует макро. На таймфрейме «следующие 5–60 секунд»
стакан даёт predative edge, который недоступен через OHLC.
Что вы видите в L2
Стандартный snapshot стакана Si — 50 уровней с каждой стороны,
обновление 25 раз в секунду через QUIK / TRANSAQ или через
FAST-feed на коло. Каждый уровень — это (price, total_qty, n_orders). Разница между qty / n_orders уже даёт первую
информацию: 1 заявка на 5 000 контрактов — это либо очень
уверенный участник, либо блеф.
Order Flow Imbalance (OFI)
Базовая метрика, с которой стоит начинать:
OFI(t) = ΔBid(t) − ΔAsk(t)
где ΔBid — изменение суммы объёма на лучшем биде
(с поправкой на изменение цены лучшего бида). Если bid
подрос или сместился вверх — добавляем; если уменьшился —
вычитаем. Аналогично для ask.
На Si нормированный OFI(1s) объясняет около 18–25%
дисперсии цены на горизонте 5–10 секунд. Это много:
типичные технические индикаторы дают <2% R².
Айсберг-заявки
Айсберг — это заявка, у которой видна только небольшая часть
(disclosed qty), а основной объём срабатывает по мере
исполнения видимой части. На Si айсберги активно выставляют
алгоритмы крупных банков и казначейств для исполнения
конверсионных потоков.
Как опознать айсберг по тейпу
- Уровень цены (например, 87 450) не уходит из стакана
после того, как туда «прилетели» сделки на весь видимый
объём. - Видимая величина после исполнения почти моментально
восстанавливается до того же значения (например, 50
контрактов). - Это повторяется N раз подряд — и только на этом
уровне.
Псевдокод детектора:
def is_iceberg(level_history, min_refills=4, window_ms=2000):
# level_history — список ивентов (timestamp, qty_after_event)
refills = 0
for prev, curr in zip(level_history, level_history[1:]):
drained = prev.qty - curr.qty
refilled = curr.qty - prev.qty
if drained > 0.7 * prev.qty and (curr.timestamp - prev.timestamp) < window_ms:
next_qty = next_qty_after(curr.timestamp, level_history)
if next_qty >= prev.qty * 0.9:
refills += 1
return refills >= min_refills
Что делать с айсбергом. Айсберг на бид — это явная
поддержка: ниже него цене ходить «дорого». Стандартная
тактика — открывать лонг чуть выше уровня айсберга со
стопом сразу под ним. Как только айсберг «съедают»
(видимая часть перестаёт восстанавливаться) — закрывать
позицию, поддержки больше нет.
Спуфинг
Спуфинг — выставление крупной заявки без намерения её
исполнить, чтобы создать иллюзию давления и спровоцировать
реакцию других участников. На MOEX это формально запрещено
(правила недобросовестных практик), но детектируется
сложно, и до сих пор встречается на низколиквидных
подсессиях (вечерка, утренний клиринг).
Признаки
- Большая заявка (>5–10× медианы уровня) появляется на
4-м или 5-м уровне. - Спред в этот момент сужается, и противоположный
рынок начинает двигаться против заявки. - За 50–500 мс до того, как цена дойдёт до уровня заявки,
она снимается. На месте — пусто. - Через секунду цена идёт в обратную сторону от
«давления».
Что не спуфинг
Не путайте спуфинг с обычным cancel-replace, которым
маркетмейкер двигает котировку вслед за рынком. Маркетмейкер
переставляет заявку за ценой; спуфер ставит заявку
перед ценой и снимает в последний момент.
Реальные сигналы из L2
После шумоочистки на Si стабильно работают три:
- OFI z-score > 2σ на окне 5–30 сек → ход цены
в направлении OFI с медианной величиной 30–80 пунктов.
Halflife сигнала — около 8 сек. - Iceberg на бид без съедания > 60 сек → асимметричный
сетап на покупку (R:R обычно 1:3 при стопе под уровень
айсберга). - «Пустой» 2-й уровень (qty < 10% от 1-го) при широком
спреде → высокая вероятность пробоя в сторону пустоты в
ближайшие 1–3 секунды.
Чего НЕ делать
- Торговать стакан без коло-инфраструктуры. Latency-арбитраж
против HFT — заведомо проигранная игра. Уровень комфорта
для ручника — таймфрейм 30 секунд+. - Принимать
total qtyза чистую монету. На Si доля
скрытых заявок (айсберги + hidden orders) на популярных
уровнях достигает 40–60%. Видимый объём — это рекламный
щит, а не баланс. - Использовать L2 как «независимое подтверждение» для
direction-стратегии на дневках. Информация из стакана
живёт секунды; для дневной стратегии она статистически
совпадает с шумом.
Минимальный стек для эксперимента
- Тиковые данные с FORTS (можно купить у MOEX или собрать
через QUIK + DDE на 2-3 недели). - Реконструкция L2: каждое событие (
add,cancel,trade,
replace) применяется к снимку стакана. Дельта-кодирование
экономит 80% места. numpy+numbaдля batch-обсчёта OFI и индикаторов.
Pandas будет тормозить уже на одной торговой сессии.- Backtest на event-driven движке. Bar-based бэктест на L2
данных бесполезен.
Стакан Si — это не магический индикатор, а отдельный
источник информации со своей частотной полосой. На таймфрейме
«секунды» там реальный edge; на таймфрейме «дни» — шум,
замаскированный под edge.