Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Dlaczego animatorzy rynku tracą pieniądze

Selekcja negatywna jako główna przyczyna strat animatorów rynku. Analiza krzywych markout, ryzyka zapasów oraz kosztów pozycji w kolejce zleceń w profesjonalnym tradingu.

Animatorzy rynku tracą pieniądze na selekcji negatywnej: inwestor, który realizuje zlecenie po wystawionej cenie, często posiada wiedzę o tym, że oferta jest już nieaktualna. Każda transakcja otwiera się z niewielkim kredytem, wynoszącym w przybliżeniu połowę spreadu, a kolejne sekundy decydują o tym, jaka część tego kredytu zostanie zachowana. Narzędziem pomiarowym jest markout, czyli znakowana zmiana ceny w określonym horyzoncie czasowym po wykonaniu zlecenia. Poniższe panele tworzą rzeczywiste krzywe markout na podstawie zarejestrowanych transakcji i kwotowań. Nasz artykuł towarzyszący na temat w jaki sposób animatorzy rynku zarabiają pieniądze omawia stronę przychodową tego samego zestawienia.

Czym jest selekcja negatywna w tradingu?

Animator rynku wystawia jednocześnie dwie ceny: bid (kupno) oraz offer (sprzedaż), każdą dla określonej wielkości zlecenia. Luka między nimi to bid-ask spread, a działalność ta opiera się na arytmetyce. Kupno po cenie bid, sprzedaż po cenie offer, powtarzane dziesiątki tysięcy razy dziennie – średni wynik pełnego cyklu transakcyjnego pozwala uzyskać kwotę zbliżoną do spreadu.

Ta arytmetyka zakłada, że obie strony napływają w równowadze. Tak jednak nie jest. Oczekujące kwotowanie to wystawiona opcja, którą każdy może zrealizować w wybranym przez siebie momencie, a inwestorzy zwracający największą uwagę wybierają najlepsze okazje. Fundusz realizujący duże zlecenie nadrzędne kupuje, dopóki oferta pozostaje tania. System, który odnotował ruch skorelowanego instrumentu, zajmuje stronę, która nie została jeszcze wyceniona na nowo.

Selekcja negatywna to nazwa dla odchylenia w tym miksie: zlecenia realizowane przez animatora są ważone w stronę inwestorów, którym zależało na nich najbardziej. Symptomem jest luka między spreadem kwotowanym przez animatora a spreadem, który faktycznie zatrzymuje.

Czym jest markout w animowaniu rynku?

Markout odpowiada na jedno pytanie, zadawane po każdej transakcji: gdzie znajdowała się cena określoną liczbę sekund później, mierząc od strony, po której znajdował się animator? Załóżmy, że animator sprzedaje 100 akcji po 50,02 USD, podczas gdy midpoint wynosi 50,00 USD. Ta transakcja otwiera się z kredytem dwóch centów na akcję, czyli 20 milami w jednostkach biur maklerskich (gdzie mil to jedna dziesiąta centa). Jeśli sześćdziesiąt sekund później midpoint przesunął się do 50,04 USD, 60-sekundowy markout wynosi minus 20 mili. Kredyt początkowy zniknął, a wraz z nim taka sama kwota.

Uśrednienie tego wyniku dla każdej transakcji w danym oknie czasowym i naniesienie go na wykres względem horyzontu daje krzywą markout. Poniższy panel tworzy taką krzywą dla AAPL w ciągu trzygodzinnego okna w południe, w czwartek 14 maja 2026 roku. Każda transakcja jest znakowana względem midpointu z sekundy, w której została wykonana: transakcja powyżej midpointu liczona jest jako kupno przez agresora, co stawia animatora po stronie sprzedaży.

ZapytanieTrwałość spreadu: krzywa markout dla AAPL, od 1 sekundy do 5 minut
Dokładny kod SQL dla każdej liczby
WITH
  qs AS (
    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-05-14 14:00:00'
      AND sip_timestamp <  '2026-05-14 17:06:00'
      AND bid_price > 0 AND ask_price > bid_price
    GROUP BY ts
  ),
  fills AS (
    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
           if(t.px > q.mid, 1, -1) AS taker_side
    FROM (
      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
             toFloat64(price) AS px, toUInt64(size) AS shares
      FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= '2026-05-14 14:00:00'
        AND sip_timestamp <  '2026-05-14 17:00:00'
        AND size > 0
    ) AS t
    INNER JOIN qs AS q ON q.ts = t.ts
    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
  )
SELECT
  concat('+', toString(e.secs), 's')                          AS horizon,
  round(1000 * avg(e.taker_side * (e.px - e.mid_at_fill)), 2) AS edge_at_fill_mils,
  round(1000 * avg(e.taker_side * (e.px - f.mid)), 2)         AS edge_after_mils
FROM (
  SELECT toUInt32(ts + secs) AS future_ts, secs, px, mid_at_fill, taker_side
  FROM (SELECT *, arrayJoin([1, 5, 15, 30, 60, 300]) AS secs FROM fills)
) AS e
INNER JOIN qs AS f ON f.ts = e.future_ts
GROUP BY e.secs
ORDER BY e.secs
Run this yourself

Pierwsza seria to kredyt w momencie wykonania transakcji, czyli odległość między ceną transakcyjną a midpointem, wynosząca średnio 19.66 mili na akcję. Druga seria to wartość tych samych transakcji po czasie potrzebnym na zmianę midpointu: 20.5 mili po jednej sekundzie i 9.81 mili po pięciu minutach. Odległość między dwiema seriami w dowolnym horyzoncie to markout, który jest odejmowany od spreadu kwotowanego przez animatora.

Krzywa, która szybko spada, a następnie wypłaszcza się, opisuje animatora płacącego za natychmiastową zmianę wyceny i zachowującego resztę. Krzywa, która utrzymuje nachylenie w tym samym kierunku w każdym horyzoncie, opisuje transakcje, które trafiają po niewłaściwej stronie ceny, która nadal podąża w tym samym kierunku. Pierwszy kształt to koszt prowadzenia działalności. Drugi to kwotowanie, które wymaga zmiany.

Które transakcje to toksyczny przepływ?

Słowo „toksyczny” pełni tutaj funkcję techniczną. Przepływ jest toksyczny, gdy jego krzywa markout nachyla się przeciwko animatorowi, który go zrealizował, w każdym horyzoncie i na dużej próbie. Biura maklerskie sortują transakcje według wszystkich dostępnych etykiet: wielkości zlecenia, miejsca obrotu, typu zlecenia, identyfikatora kontrahenta. Wielkość to etykieta widoczna w publicznym zapisie transakcji.

ZapytanieRealizacje zleceń AAPL według wielkości: wynik w momencie transakcji i po 60 sekundach
Dokładny kod SQL dla każdej liczby
WITH
  qs AS (
    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-05-14 14:00:00'
      AND sip_timestamp <  '2026-05-14 17:06:00'
      AND bid_price > 0 AND ask_price > bid_price
    GROUP BY ts
  ),
  fills AS (
    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
           if(t.px > q.mid, 1, -1) AS taker_side
    FROM (
      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
             toFloat64(price) AS px, toUInt64(size) AS shares
      FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= '2026-05-14 14:00:00'
        AND sip_timestamp <  '2026-05-14 17:00:00'
        AND size > 0
    ) AS t
    INNER JOIN qs AS q ON q.ts = t.ts
    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
  )
SELECT
  multiIf(s.shares < 100, 'under 100 shares',
          s.shares < 500, '100 to 499',
          s.shares < 1000, '500 to 999',
          '1,000 or more')                                    AS size_bucket,
  count()                                                     AS fills_count,
  round(1000 * avg(s.taker_side * (s.px - s.mid_at_fill)), 2) AS edge_at_fill_mils,
  round(1000 * avg(s.taker_side * (s.px - f.mid)), 2)         AS edge_after_60s_mils
FROM (SELECT *, toUInt32(ts + 60) AS future_ts FROM fills) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY size_bucket
ORDER BY min(s.shares)
Run this yourself

Transakcje poniżej 100 akcji otwierają się z kredytem 19.47 mili na akcję i są warte 15.22 mili minutę później. Transakcje o wielkości 1000 akcji i więcej otwierają się z 36.26 mili i są warte 21.34 mili w tym samym horyzoncie. Ten sam instrument, te same trzy godziny, inna ekonomia na akcję. Największe zlecenia często całkowicie omijają publiczną kolejkę, co jest celem, dla którego organizuje się transakcje pakietowe.

Ryzyko inwentaryzacyjne, czyli pozycja, której nie można zabezpieczyć w czasie

Horyzont markout to również zegar. Animator, który kupuje 5000 akcji po cenie bid, posiada 5000 akcji i dopóki pozycja nie zostanie zabezpieczona lub sprzedana, jest narażony na to, co stanie się z ceną. Zabezpieczanie rzadko jest natychmiastowe: pojedynczą pozycję na akcjach można zrównoważyć skorelowanym ETF-em lub pozycją opcyjną, a każda z nich wiąże się z własnym spreadem do pokonania. Ryzyko inwentaryzacyjne to wielkość ruchu, który mieści się w tym oknie, i jest mierzone w ten sam sposób dla każdego instrumentu. Jak daleko cena zazwyczaj przemieszcza się w ciągu następnej minuty i w ciągu następnej godziny?

ZapytanieZmiana ceny w czasie utrzymywania pozycji: SPY i NVDA, maj 2026
Dokładny kod SQL dla każdej liczby
WITH
  bars AS (
    SELECT ticker, window_start,
           toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
           toFloat64(close) AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'NVDA')
      AND window_start >= '2026-05-01 00:00:00'
      AND window_start <  '2026-06-01 00:00:00'
      AND transactions >= 50
      AND close > 0
  ),
  starts AS (
    SELECT ticker, et_date, px, mins,
           window_start + toIntervalMinute(mins) AS future_start
    FROM (SELECT *, arrayJoin([1, 2, 5, 15, 30, 60]) AS mins FROM bars)
  )
SELECT
  concat(toString(s.mins), ' min')                                AS hold_horizon,
  round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'SPY'), 1)  AS spy_drift_bps,
  round(avgIf(abs(f.px / s.px - 1) * 10000, s.ticker = 'NVDA'), 1) AS nvda_drift_bps
FROM starts AS s
INNER JOIN bars AS f
  ON f.ticker = s.ticker AND f.et_date = s.et_date AND f.window_start = s.future_start
GROUP BY s.mins
HAVING countIf(s.ticker = 'SPY') > 0 AND countIf(s.ticker = 'NVDA') > 0
ORDER BY s.mins
Run this yourself

W maju 2026 roku średni ruch bezwzględny SPY w ciągu jednej minuty wynosił 1.9 punktów bazowych (gdzie punkt bazowy to jedna setna procenta). NVDA odnotowała 5.5 w ciągu tej samej minuty. Wydłużenie czasu do godziny sprawia, że obie wartości wynoszą odpowiednio 14.1 i 40.4. Animator, który potrafi zamknąć pozycję w ciągu minuty, żyje z pierwszą parą. Animator utrzymujący pozycję przez godzinę żyje z drugą parą, a kredyt zebrany przy transakcji jest w obu przypadkach identyczny.

Dlaczego animatorzy rynku tracą pieniądze na końcu kolejki

Giełdy dopasowują oczekujące zlecenia po jednej cenie w kolejności ich napłynięcia: najpierw cena, potem czas. Zlecenie na końcu kolejki 40 000 akcji po stronie bid czeka, aż 40 000 akcji przed nim zostanie zrealizowanych, a szacowanie pozycji w kolejce to odrębna dyscyplina.

Kłopotliwe jest to, co oznacza „wyczyszczenie” kolejki. Kolejka opróżnia się na dwa sposoby. Sprzedający uderzają w bid, aż poziom zostanie wyczerpany, albo cena spada poniżej tego poziomu, pozostawiając go za sobą. Zlecenie blisko początku kolejki bierze udział w obu przypadkach. Zlecenie na końcu realizuje się głównie w drugim scenariuszu, w momencie, gdy poziom ma stać się „starą ceną”. Dwaj animatorzy mogą handlować tym samym instrumentem po tej samej cenie i zachować z tego różne kwoty. Miejsce w kolejce nigdy nie pojawia się w kwotowanym spreadzie, ponieważ obaj animatorzy podali identyczną cenę. Pojawia się ono na krzywej markout.

Dlaczego rozszerzenie kwotowania nie jest darmowym rozwiązaniem

Oczywistą odpowiedzią na złą krzywą markout jest szersze kwotowanie. Szersze kwotowanie zarabia więcej na transakcji, ale osiąga mniej realizacji. Obie strony tego kompromisu znajdują się w transakcjach z tego samego dnia, posortowane według tego, jak daleko od midpointu znalazła się każda z nich.

ZapytanieTransakcje AAPL według odległości od midpointu: udział w wolumenie i markout po 60 sekundach
Dokładny kod SQL dla każdej liczby
WITH
  qs AS (
    SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
           avg((toFloat64(bid_price) + toFloat64(ask_price)) / 2) AS mid
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'AAPL'
      AND sip_timestamp >= '2026-05-14 14:00:00'
      AND sip_timestamp <  '2026-05-14 17:06:00'
      AND bid_price > 0 AND ask_price > bid_price
    GROUP BY ts
  ),
  fills AS (
    SELECT t.ts AS ts, t.px AS px, t.shares AS shares, q.mid AS mid_at_fill,
           if(t.px > q.mid, 1, -1) AS taker_side
    FROM (
      SELECT toUnixTimestamp(toDateTime(sip_timestamp)) AS ts,
             toFloat64(price) AS px, toUInt64(size) AS shares
      FROM global_markets.stocks_trades
      WHERE ticker = 'AAPL'
        AND sip_timestamp >= '2026-05-14 14:00:00'
        AND sip_timestamp <  '2026-05-14 17:00:00'
        AND size > 0
    ) AS t
    INNER JOIN qs AS q ON q.ts = t.ts
    WHERE t.px != q.mid AND abs(t.px / q.mid - 1) < 0.02
  )
SELECT
  multiIf(s.cents <= 0.5, '0.5 cents or less',
          s.cents <= 1.0, '0.5 to 1 cent',
          s.cents <= 2.0, '1 to 2 cents',
          'over 2 cents')                                  AS distance_from_mid,
  round(100 * sum(s.shares) / sum(sum(s.shares)) OVER (), 2) AS share_of_volume_pct,
  round(1000 * avg(s.taker_side * (s.px - f.mid)), 2)        AS edge_after_60s_mils
FROM (
  SELECT *, toUInt32(ts + 60) AS future_ts, abs(px - mid_at_fill) * 100 AS cents
  FROM fills
) AS s
INNER JOIN qs AS f ON f.ts = s.future_ts
GROUP BY distance_from_mid
ORDER BY min(s.cents)
Run this yourself

Transakcje w odległości pół centa od midpointu stanowiły 27.58 procent akcji w oknie czasowym i były warte 0.95 mili na akcję minutę później. Transakcje realizowane ponad dwa centy dalej stanowiły 33.19 procent akcji, przy wartości 46.86 mili. Kwotowanie wystawione dalej od midpointu jest osiągane przez mniejszą część wolumenu dnia.

Wskaźnik realizacji zleceń to pierwszy koszt wycofania się. Rabaty giełdowe to drugi, ponieważ wiele miejsc obrotu płaci animatorowi za każdą zrealizowaną akcję, a ten dochód skaluje się z liczbą akcji, a nie z szerokością kwotowania. Poziomy wolumenu, które ustalają stawkę rabatu, są liczone miesięcznie, więc słaby miesiąc zmienia wycenę każdej transakcji w kolejnym. Utrata miejsca w kolejce to ostatni koszt, płacony przy wyjściu i ponownie przy ustawianiu się na końcu linii przy powrocie. Każdy animator znajduje się gdzieś na tej krzywej, a ci, którzy najprecyzyjniej mierzą własne markouty, mogą znajdować się najbliżej ceny rynkowej i wciąż zachowywać kredyt. Ten pomiar to przewaga, której bronią najwięksi animatorzy rynku.

FAQ

Czy animatorzy rynku tracą pieniądze na pojedynczych transakcjach?

Rutynowo. Księga animatora to rozkład małych zysków i małych strat, a tracące transakcje grupują się w momentach tuż przed ruchem ceny. Działalność opiera się na średniej z milionów transakcji.

Czym jest markout w tradingu?

Markout to zmiana ceny rynkowej w określonym horyzoncie po wykonaniu transakcji, znakowana z punktu widzenia jednej strony, gdzie liczba dodatnia oznacza, że ta strona zyskała. Biura akcyjne podają markouty w milach na akcję, a biura opcyjne w tickach na kontrakt.

Co oznacza toksyczny przepływ zleceń?

Opisuje przepływ zleceń, którego krzywa markout nachyla się uporczywie przeciwko animatorowi, który je realizuje, co oznacza, że cena po każdej transakcji nadal oddala się od animatora. Etykieta ta jest właściwością statystyczną strumienia zleceń i nie zawiera oceny żadnego pojedynczego inwestora.

Dlaczego animatorzy rynku rozszerzają spready zamiast wycofywać kwotowania?

Szersze kwotowanie pozwala animatorowi pozostać na rynku po cenie, która rekompensuje gorszą krzywą markout. Wycofanie kwotowania nie przynosi niczego i wiąże się z utratą pozycji w kolejce. Biura robią obie te rzeczy, a wybór zależy od tego, jak długo kwotowanie ma pozostać nieaktualne.

Jak mierzy się selekcję negatywną?

Za pomocą markoutów. Należy oznaczyć każdą transakcję stroną, po której znajdował się animator, a następnie uśrednić zmianę midpointu w określonych horyzontach czasowych. Luka między kredytem przy transakcji a wartością w każdym horyzoncie to koszt selekcji negatywnej, wyrażony w tych samych jednostkach co spread.

Jak zbudowano te dane

Każdy panel AAPL odczytuje dwa publiczne rejestry: taśmę transakcyjną i taśmę kwotowań. Każda transakcja między 14:00 a 17:00 UTC w dniu 14 maja 2026 r. jest dopasowywana do średniego midpointu krajowej najlepszej oferty kupna i sprzedaży z sekundy, w której została wykonana, a następnie znakowana. Transakcja powyżej tego midpointu liczona jest jako kupno przez agresora, co stawia animatora po stronie sprzedaży. Transakcje dokładnie na poziomie midpointu nie mają przypisanej strony i są pomijane, podobnie jak każda transakcja oddalona o więcej niż 2 procent od midpointu. Rekordy kwotowań, w których cena bid spotyka się lub przekracza cenę offer, są wykluczane, ponieważ zablokowany lub skrzyżowany rynek nie posiada użytecznego midpointu.

Dopasowanie na poziomie sekundowym przybliża kwotowanie obowiązujące w mikrosekundzie wykonania transakcji i wygładza najszybsze aktualizacje. Ceny w horyzoncie pochodzą z tych samych sekundowych midpointów. Panel inwentaryzacyjny wykorzystuje słupki minutowe i zachowuje tylko te, które zawierają co najmniej 50 transakcji, co koncentruje próbkę w najbardziej aktywnych godzinach dnia.


Każdy panel tutaj zawiera kod SQL, który go wygenerował, więc matematyka markout jest otwarta na weryfikację linijka po linijce. Aby odtworzyć krzywą dla innego instrumentu lub innego dnia, poproś o to prostym językiem na terminalu Strasmore.