Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Jak szacować pozycję w kolejce na podstawie danych L2

Pozycja w kolejce decyduje o tym, czy zlecenie pasywne zarobi na spreadzie. Wyjaśniamy szacowanie na podstawie zagregowanego arkusza oraz zasadność zakupu danych typu MBO.

Dlaczego pozycja w kolejce stanowi o przewadze

Zlecenie pasywne oczekuje w arkuszu na kontrahenta, który „przebije” spread. Zgodnie z zasadą priorytetu ceny i czasu, system transakcyjny szereguje zlecenia najpierw według ceny, a następnie według czasu napłynięcia. Jeśli na poziomie 10,00 USD oczekuje już 10 000 akcji, a Ty dodasz 100 za nimi, te 10 000 akcji musi zostać zrealizowanych lub anulowanych, zanim nadejdzie Twoja kolej. Anulowanie i ponowne złożenie zlecenia po tej samej cenie oznacza powrót na koniec kolejki.

To uszeregowanie determinuje ekonomię transakcji. Będąc blisko początku, realizujesz zlecenia często i pobierasz spread oraz ewentualny rabat za zapewnienie płynności, co jest przedmiotem prowizji i rabatów typu maker-taker. Będąc blisko końca, realizujesz transakcje dopiero wtedy, gdy wszyscy przed Tobą zostali obsłużeni, co dzieje się, gdy napływa duży jednostronny strumień zleceń. Realizacje na końcu kolejki grupują się w momentach tuż przed tym, jak cena przełamuje Twój poziom. Ta sama cena, to samo zlecenie, odwrotny wynik.

Co dane Level 2 mogą, a czego nie mogą pokazać

Level 1 to najlepsza oferta kupna i sprzedaży wraz z wolumenem na każdym z tych poziomów. Level 2, zwany również „market by price”, dodaje głębokość: listę poziomów cenowych z całkowitym wolumenem oczekującym na każdym z nich. Oba typy danych są agregatami, a porównanie danych rynkowych Level 1 i Level 2 omawia je szczegółowo. Gdy oferta kupna na poziomie 10,00 USD spada z 10 000 do 8 500 akcji, feed raportuje zniknięcie 1 500 akcji. Nie informuje jednak, czy zostały one zrealizowane, czy wycofało się jedno zlecenie czy czterdzieści, ani gdzie w kolejce się znajdowały.

Realizacje są widoczną połową obrazu: taśma drukuje każdą transakcję wraz z wolumenem, więc te wartości odejmuje się precyzyjnie. Reszta to anulowania, a to właśnie w nich zaczyna się zgadywanie. Poniższy panel zestawia komunikaty na skonsolidowanym szczycie arkusza z realizacjami na taśmie dla jednej płynnej spółki podczas jednej zwykłej sesji, w środę 10 czerwca 2026 roku.

ZapytanieRelacja zleceń w arkuszu do transakcji (prints), AAPL, 10 czerwca 2026
Dokładny kod SQL dla każdej liczby
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

Godzina 08:00 przypada przed otwarciem sesji: szczyt arkusza zmieniał się tam 0.8 razy na każdą realizację, co oznacza mniej komunikatów niż transakcji. W trakcie regularnej sesji proporcja ta ulega odwróceniu. W godzinie 15:00 szczyt arkusza zmieniał się 1.6 razy na każdą realizację, przy łącznej liczbie 233433 komunikatów w tej godzinie. Większość zdarzeń na poziomie cenowym na otwartym rynku to zlecenia napływające i wycofujące się bez realizacji, a każde z nich zmienia Twoje miejsce w kolejce o wartość, której nie podaje żaden zagregowany feed.

Założenie o równomiernym anulowaniu i dlaczego jest zbyt optymistyczne

Standardowe podejście zakłada, że anulowania rozkładają się równomiernie w całej kolejce. Niech x oznacza Twoją frakcyjną głębokość: liczbę akcji przed Tobą podzieloną przez całkowity wolumen na Twoim poziomie. Model równomierny przyjmuje, że szansa na to, iż anulowana akcja znajdowała się przed Tobą, jest równa x, co zapisuje się jako p(x) = x. Jeśli stoisz w połowie kolejki 10 000 akcji i widzisz, jak 1 000 akcji znika bez realizacji, model przesuwa Cię o 500 miejsc do przodu.

Rzeczywiste kolejki są niesymetryczne. Zlecenie, które oczekuje już jakiś czas, zazwyczaj należy do kogoś, kto chce czekać, podczas gdy zlecenie dodane przed chwilą jest znacznie częściej ulotną ofertą, która znika w ciągu sekund. Anulowania koncentrują się w tylnej części kolejki, blisko Ciebie i za Tobą. Z tych 1 000 anulowanych akcji być może 200 znajdowało się przed Tobą, podczas gdy model przypisał Ci 500. Powtarzaj to przez cały dzień, a symulowana kolejka przesuwa się szybciej niż rzeczywista. Błąd działa w jedną stronę: więcej realizacji w lepszych momentach, niż otrzymują zlecenia rzeczywiste.

Jak kolejki ulegają wyczerpaniu

Anulowania przesuwają Cię w sposób niewidoczny. Transakcje przesuwają Cię w sposób widoczny, poprzez wolumeny na taśmie.

ZapytanieStruktura wielkości transakcji AAPL, 10 czerwca 2026
Dokładny kod SQL dla każdej liczby
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

Realizacje poniżej jednostki standardowej (round lot) stanowiły 90% liczby transakcji na tej sesji i 42.5% wolumenu. Bloki tysiąca akcji lub większe stanowiły 0.2% transakcji i 19.9% wolumenu. Kolejki wyczerpują się małymi porcjami, więc różnica między pozycją 2 000 a 3 500 to setki transakcji oczekiwania. Symulator, który przyznaje realizację po dwóch dużych transakcjach, pominął większość taśmy.

Zlecenie, którego nie widzisz

Feedy głębokości są ucinane. Jeśli otrzymujesz dziesięć poziomów cenowych, a Twoje zlecenie znajduje się na jedenastym, jest ono poza danymi: nie znasz wolumenu przed nim ani zleceń dołączających za nim. W tym momencie wymyślasz liczbę, zamiast ją szacować. Sytuacja ta jest typowa, a nie egzotyczna, ponieważ zlecenie, które nie „goni” rynku, szybko oddala się od najlepszej ceny.

ZapytanieNajlepsza oferta kupna (best bid) i poziomy cenowe, AAPL, interwały 15-minutowe
Dokładny kod SQL dla każdej liczby
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

W koszyku 10:00 najlepsza oferta kupna wynosiła średnio 290.29 USD i odwiedziła 187 różnych cen w ciągu piętnastu minut. Każda z tych cen to osobny poziom dla akcji kwotowanych w centach, więc widok dziesięciu poziomów obejmuje dziesięć centów arkusza. Zlecenie pozostawione na jednym poziomie podczas takiej sesji może spędzić długie okresy poniżej najgłębszego poziomu, jaki widzi jego właściciel.

Gdzie pozycja w kolejce jest najcenniejsza

Pozycja w kolejce jest najcenniejsza tam, gdzie poprawa ceny jest niemożliwa. Akcje z jednocentowym spreadem nie dają miejsca na przeskoczenie kolejki lepszą ceną: wszyscy ustawiają się na tym samym poziomie, a o wszystkim decyduje czas napłynięcia. Tam, gdzie spread wynosi kilka centów, trader może wyprzedzić całą kolejkę o jeden cent, a decyzja cenowa ma pierwszeństwo przed kolejką.

ZapytanieŚredni spread kwotowany i czas trwania spreadu 1 centa, południe 10 czerwca 2026
Dokładny kod SQL dla każdej liczby
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

W ciągu czterech południowych godzin tej samej sesji, najwęższy z sześciu instrumentów, KO, miał średni spread 1.18 centa i pokazywał jednocentowy spread w 82.5% przypadków aktualizacji. Najszerszy, MSFT, miał średnio 8.46 centa, z jednocentowym spreadem w 1.1% przypadków. Model kolejki skalibrowany dla pierwszego instrumentu nie mówi nic użytecznego o drugim. Zlecenia pozostawione między kwotowaniami, omówione w zleceniach typu midpoint peg, tworzą własną linię według tych samych zasad.

Cztery diagnostyki dla Twojego backtestu

  1. Porównaj symulowany wskaźnik realizacji ze swoim rzeczywistym wskaźnikiem realizacji dla tych samych instrumentów w tych samych godzinach. Symulator, który realizuje 70% zleceń, podczas gdy w rzeczywistości realizuje się 40%, opisuje Twoje założenie, a nie rynek.
  2. Podziel symulowane realizacje na dwie grupy: te, po których poziom cenowy przetrwał, oraz te, które nastąpiły dopiero w momencie całkowitego wyczyszczenia poziomu. Grupa z przewagą drugiego typu oznacza, że symulator przyznaje Ci realizacje dokładnie wtedy, gdy cena przełamuje Twój poziom.
  3. Określ granice założenia. Uruchom ponownie symulację, zakładając, że każde anulowanie pochodzi z przodu kolejki, a następnie, że każde pochodzi z końca. Te dwa przebiegi wyznaczają uczciwe marginesy błędu dla dowolnego wybranego p(x).
  4. Zmierz, jak często Twoja cena znajdowała się poza głębokością, którą dostarcza Twój feed. Realizacje w tym obszarze zostały zmyślone. Błąd look-ahead w backtestingu opisuje tę samą porażkę z innej perspektywy: wynik oparty na informacjach, których strategia nigdy nie posiadała.

Kiedy przestać modelować i kupić dane o zleceniach

Dane typu „market-by-order” (MBO) zawierają komunikat dla każdego pojedynczego zlecenia, od momentu napłynięcia do momentu realizacji lub anulowania, każde z własnym identyfikatorem. Odtwórz ten feed, a Twoje miejsce w kolejce stanie się liczbą, a nie szacunkiem, po założeniu realistycznego opóźnienia dotarcia Twojego zlecenia na rynek. Kosztuje to więcej niż feed głębokości i wymaga znacznie większej przestrzeni dyskowej.

Diagnostyka nr 3 jest regułą decyzyjną. Jeśli oba skrajne założenia (przód i tył kolejki) czynią strategię zyskowną, założenie pośrednie będzie wystarczające. Jeśli strategia zarabia przy jednym założeniu, a traci przy drugim, model kolejki jest samą strategią, a zakup feedu typu „order-by-order” jest tańszy niż obrona błędnego szacunku.

Rynki typu pro-rata zmieniają pytanie

Niektóre rynki kontraktów terminowych i opcji dzielą napływające zlecenie między zlecenia oczekujące na danym poziomie proporcjonalnie do ich wielkości, a nie według kolejności napłynięcia. Czas ma tam znacznie mniejsze znaczenie, a kluczowym czynnikiem staje się kwotowany wolumen: podwojenie wielkości zlecenia mniej więcej podwaja Twój udział w każdej realizacji. Tryb awarii przesuwa się wraz z tym w stronę kwotowania większego wolumenu, niż faktycznie chce się posiadać. Dlaczego zlecenia opcyjne nie są realizowane omawia, jak wygląda to z perspektywy inwestora detalicznego w arkuszu opcji.

FAQ

Czym jest pozycja w kolejce w tradingu?

Pozycja w kolejce to Twoje miejsce wśród zleceń oczekujących po tej samej cenie na tym samym rynku. W arkuszu z priorytetem ceny i czasu zlecenia przed Tobą muszą zostać zrealizowane lub anulowane, zanim Twoje zlecenie będzie mogło zostać zrealizowane.

Czy można obliczyć pozycję w kolejce z danych Level 2?

Nie dokładnie. Level 2 pokazuje całkowity wolumen na poziomie cenowym bez identyfikacji zleceń, więc gdy wolumen znika bez transakcji, nie można stwierdzić, czy akcje te znajdowały się przed Tobą, czy za Tobą. Można oszacować tę liczbę i wyznaczyć jej granice. Dokładna wartość wymaga danych typu „order-by-order”.

Dlaczego wskaźniki realizacji w backtestach są zazwyczaj zbyt wysokie?

Powszechne założenie zakłada równomierne rozłożenie anulowań w kolejce, podczas gdy w rzeczywistości anulowania koncentrują się w tylnej części. Model równomierny przesuwa Twoje symulowane zlecenie szybciej, niż porusza się rzeczywista kolejka, co objawia się większą liczbą realizacji i lepszymi wynikami, niż w rzeczywistym handlu.

Czym są dane MBO?

Dane typu „market-by-order” dostarczają komunikat dla każdego pojedynczego zlecenia, od napłynięcia po realizację lub anulowanie. Jest to feed, w którym Twoje miejsce w kolejce jest policzalne, a nie modelowane, co ma największe znaczenie dla strategii działających na spreadzie o szerokości jednego ticka.

Czy pozycja w kolejce ma znaczenie na rynkach typu pro-rata?

W mniejszym stopniu. Alokacja pro-rata dzieli napływające zlecenie między zlecenia oczekujące według wielkości, więc bycie pierwszym daje niewiele, a liczy się kwotowany wolumen. Sprawdzenie, jaki model alokacji stosuje rynek, powinno poprzedzać jakiekolwiek modelowanie kolejki.