Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Adverse selection: чому маркет-мейкери втрачають гроші

Чому маркет-мейкери втрачають гроші? Через adverse selection. Дізнайтеся, як markout-криві вимірюють ефект, а також як впливають inventory risk і queue position.

Маркет-мейкери втрачають гроші через adverse selection: трейдер, який забирає офер, часто вже знає, що цей офер застарів. Кожне виконання починається з невеликого кредиту — приблизно половини spread, — а наступні секунди визначають, яка його частина збережеться. Інструмент вимірювання — markout, тобто підписана зміна ціни через фіксований проміжок часу після виконання. Нижче наведено реальні криві markout, побудовані на даних про prints угод і котирувань. У супровідному матеріалі про як маркет-мейкери заробляють гроші розглянуто дохідну частину того самого балансу.

Що таке adverse selection у трейдингу?

Маркет-мейкер одночасно виставляє дві ціни: bid на купівлю та offer на продаж, кожна — на зазначений обсяг. Різниця між ними — це bid ask spread, а бізнес-модель зводиться до арифметики. Купувати за bid, продавати за offer, повторювати це десятки тисяч разів на день — і в середньому отримувати суму, близьку до spread, за кожен повний оборот.

Ця арифметика передбачає збалансований потік заявок з обох боків. Але на практиці цього немає. Котирування, що перебуває в книзі, — це опціон, який будь-хто може реалізувати у зручний для себе момент. Трейдери, які найуважніше стежать за ринком, обирають найкращі моменти. Фонд, який виконує велике батьківське доручення, продовжує купувати, поки offer залишається дешевим. Система, яка вже побачила рух корельованого інструмента, займає бік, що ще не встиг скоригуватися.

Adverse selection — це назва для зміщення в такому потоці: виконані заявки маркет-мейкера непропорційно часто надходять від трейдерів, які найбільше хотіли їх виконати. Ознака цього — розрив між spread, який котирує маркет-мейкер, і spread, який йому вдається зберегти.

Що таке markout у маркет-мейкінгу?

Markout відповідає на одне запитання після кожного виконання: де була ціна через фіксовану кількість секунд, якщо вимірювати її з боку, на якому перебував маркет-мейкер? Припустімо, маркет-мейкер продає 100 акцій за $50.02, тоді як midpoint становить $50.00. Це виконання починається з кредиту у два центи на акцію, або 20 mils у термінології торгового desk, де mil — це одна десята цента. Якщо через 60 секунд midpoint піднявся до $50.04, markout на горизонті 60 секунд становить мінус 20 mils. Початковий кредит зник, а разом із ним — ще така сама сума.

Якщо усереднити цей показник за всіма виконаннями у вибраному часовому вікні та побудувати його залежно від горизонту, отримаємо криву markout. На панелі нижче наведено таку криву для AAPL за тригодинне вікно в середині торгової сесії в четвер, 14 травня 2026 року. Кожен print має знак відповідно до midpoint тієї секунди, коли він відбувся: print вище midpoint вважається купівлею taker, а отже маркет-мейкер опиняється на стороні продажу.

ЗапитСкільки спреду зберігається: крива markout для AAPL, від 1 секунди до 5 хвилин
Точний SQL-код для кожного числа
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

Перша серія — це кредит у момент виконання, тобто відстань між print і midpoint, у середньому 19.66 mils на акцію. Друга серія показує, скільки коштують ці самі виконання після того, як midpoint встиг змінитися: 20.5 mils через одну секунду та 9.81 mils через п’ять хвилин. Відстань між двома серіями на будь-якому горизонті — це markout, який віднімається від spread, котируваного маркет-мейкером.

Крива, що швидко знижується, а потім вирівнюється, означає, що маркет-мейкер втрачає кошти через негайне перепрайсування, але зберігає решту кредиту. Крива, що однаково нахилена на кожному горизонті, свідчить про виконання заявок на неправильному боці ціни, яка продовжує рухатися. Перша форма — це операційна вартість бізнесу. Друга означає, що котирування потрібно змінити.

Який потік заявок є токсичним?

Термін «токсичний» тут має технічне значення. Потік є токсичним, якщо його крива markout на великій вибірці рухається проти маркет-мейкера, який виконав заявку, на кожному горизонті. Trading desks сортують виконання за всіма доступними ознаками: розміром print, venue, типом заявки, ідентифікатором контрагента. Розмір — це ознака, яка міститься у публічній стрічці угод.

ЗапитВиконання AAPL за розміром угоди: кредит під час виконання та значення через 60 секунд
Точний SQL-код для кожного числа
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

Виконання заявок обсягом до 100 акцій починаються з кредиту 19.47 mils на акцію, а через хвилину їхня вартість становить 15.22 mils. Prints обсягом від 1 000 акцій починаються з 36.26 mils і через такий самий проміжок часу коштують 21.34 mils. Той самий інструмент, ті самі три години, але інша економіка на акцію. Найбільші заявки часто обходять публічну чергу, що і є метою організації block trade.

Ризик інвентарю: позиція, яку неможливо вчасно захеджувати

Горизонт markout — це також годинник. Маркет-мейкер, який купує 5 000 акцій за bid, утримує 5 000 акцій. Поки позицію не захеджовано або не продано, вона залежить від подальшого руху ціни. Хеджування рідко відбувається миттєво: окрему акційну позицію можна компенсувати корельованим ETF або опціонною позицією, і кожна з них має власний spread, який потрібно перетнути. Ризик інвентарю — це масштаб руху, який відбувається протягом цього вікна. Для будь-якого інструмента його вимірюють однаково: наскільки далеко ціна зазвичай проходить протягом наступної хвилини та наступної години?

ЗапитНаскільки змінюється ціна, поки позиція очікує: SPY і NVDA, травень 2026
Точний SQL-код для кожного числа
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

У травні 2026 року середній абсолютний рух SPY за одну хвилину становив 1.9 базисних пунктів, де базисний пункт — це одна сотa відсотка. Для NVDA цей показник за ту саму хвилину становив 5.5. Якщо збільшити горизонт до години, два показники становитимуть 14.1 і 40.4. Маркет-мейкер, який може повністю закрити позицію протягом хвилини, працює з першою парою. Маркет-мейкер, який утримує позицію протягом години, працює з другою парою. Кредит, отриманий під час виконання, в обох випадках однаковий.

Чому маркет-мейкери втрачають гроші в кінці черги

Біржі зіставляють заявки, що перебувають у книзі, за однією ціною в порядку їх надходження: спочатку за ціною, потім за часом. Заявка в кінці черги обсягом 40 000 акцій на bid чекає, поки будуть виконані 40 000 акцій перед нею, а оцінювання позиції в черзі є окремою дисципліною.

Складність полягає в тому, що саме означає «очистити чергу». Черга спорожнює двома способами. Продавці продовжують бити по bid, доки рівень не буде вичерпано, або ціна проходить униз через цей рівень і залишає його позаду. Заявка на початку черги бере участь в обох сценаріях. Заявка в кінці черги виконується переважно за другим сценарієм — у момент, коли рівень ось-ось стане колишньою ціною. Два маркет-мейкери можуть торгувати одним інструментом за тією самою ціною, але зберегти різну частину кредиту. Позиція в черзі не відображається у quoted spread, оскільки обидва маркет-мейкери виставили однакову ціну. Вона відображається у кривій markout.

Чому розширення котирування не є безкоштовним рішенням

Очевидна відповідь на несприятливу криву markout — котирувати ширше. Ширше котирування приносить більше на кожному виконанні, але призводить до меншої кількості виконань. Обидві частини цього компромісу містяться у prints за один день, відсортованих за відстанню кожного print від midpoint.

ЗапитУгоди AAPL за відстанню від середини спреду: частка обсягу та markout через 60 секунд
Точний SQL-код для кожного числа
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

Prints у межах половини цента від midpoint становили 27.58 відсотка акцій у вибраному вікні й через хвилину коштували 0.95 mils на акцію. Prints, що були більш ніж на два центи від midpoint, становили 33.19 відсотка акцій і мали вартість 46.86 mils. Котирування, виставленого далі від midpoint, досягає менша частка денного обсягу.

Fill rate — це перша вартість відступу від найкращої ціни. Друга — біржові rebates, оскільки багато venue платять маркет-мейкеру за кожну виконану акцію, а цей дохід залежить від кількості акцій, а не від ширини котирування. Місячні обсяги, що визначають ставку rebate, підраховуються щомісяця. Тому тихий місяць змінює винагороду за кожне виконання в наступному місяці. Відмова від позиції в черзі — остання вартість: її сплачують під час виходу, а потім знову — наприкінці черги під час повернення. Кожен маркет-мейкер перебуває десь на цій кривій. Ті, хто найточніше вимірює власні markouts, можуть залишатися найближче до touch і водночас зберігати кредит. Саме це вимірювання є перевагою, яку захищають найбільші маркет-мейкери.

FAQ

Чи втрачають маркет-мейкери гроші на окремих угодах?

Регулярно. Книга заявок маркет-мейкера являє собою розподіл невеликих прибутків і збитків. Збиткові виконання концентруються в моменти безпосередньо перед рухом ціни. Бізнес-модель ґрунтується на середньому результаті мільйонів виконань.

Що таке markout у трейдингу?

Markout — це зміна ринкової ціни через фіксований проміжок часу після виконання, розрахована з боку однієї зі сторін. Додатне значення означає, що ця сторона отримала вигоду. Equity desks виражають markout у mils на акцію, а options desks — у ticks на контракт.

Що означає токсичний потік заявок?

Це потік заявок, крива markout якого стабільно рухається проти маркет-мейкера, що виконує ці заявки. Іншими словами, після кожного виконання ціна продовжує рухатися від маркет-мейкера. Це статистична характеристика потоку заявок, яка не дає оцінки жодному окремому трейдеру.

Чому маркет-мейкери розширюють spread, а не знімають котирування?

Ширше котирування дає маркет-мейкеру змогу залишатися на ринку за ціною, яка компенсує гіршу криву markout. Зняття котирування не приносить доходу й водночас означає втрату позиції в черзі. Trading desks використовують обидва підходи. Вибір залежить від того, як довго, за очікуваннями, котирування залишатиметься застарілим.

Як вимірюють adverse selection?

За допомогою markouts. Кожному виконанню присвоюють знак відповідно до сторони, на якій перебував маркет-мейкер, а потім усереднюють зміну midpoint на фіксованих горизонтах. Розрив між кредитом у момент виконання та вартістю на кожному горизонті — це вартість adverse selection, виражена в тих самих одиницях, що й spread.

Як були побудовані ці показники

Кожна панель для AAPL використовує два публічні джерела: стрічку угод і стрічку котирувань. Кожен print у період з 14:00 до 17:00 UTC 14 травня 2026 року зіставляється із середнім midpoint national best bid and offer за секунду, коли він відбувся, а потім отримує знак. Print вище цього midpoint вважається купівлею taker, що розміщує маркет-мейкера на стороні продажу. Prints точно на midpoint не мають визначеної сторони й вилучаються, як і будь-який print, що відхиляється від midpoint більш ніж на 2 відсотки. Котирування, у яких bid дорівнює offer або перевищує його, виключаються, оскільки locked or crossed market не має придатного midpoint.

Зіставлення на рівні секунди є наближенням до котирування, чинного на мікросекунді виконання, і згладжує найшвидші оновлення. Ціни на горизонтах беруться з тих самих midpoint на рівні секунди. Для панелі інвентарю використовуються одні хвилинні свічки. До вибірки включаються лише свічки щонайменше з 50 prints, що концентрує дані в найактивніших годинах дня.

Кожна панель містить SQL, за допомогою якого її побудовано, тому математику markout можна перевірити рядок за рядком. Щоб відтворити криву для іншого інструмента або іншого дня, сформулюйте запит звичайною англійською мовою в терміналі Strasmore.