Почему маркет-мейкеры теряют деньги: неблагоприятный выбор
Узнайте, как неблагоприятный выбор влияет на доходность маркет-мейкеров. Мы разбираем использование кривых маркаута, риски инвентаря и влияние позиции в очереди на исполнение сделок.
Маркет-мейкеры теряют деньги из-за неблагоприятного выбора (adverse selection): трейдер, который забирает заявку, часто уже знает, что она неактуальна. Каждая сделка (fill) изначально приносит небольшой доход — примерно половину спреда, и последующие секунды определяют, какая часть этого дохода сохранится. Инструментом измерения служит маркаут (markout) — знаковое изменение цены через фиксированный интервал времени после исполнения. Приведенные ниже графики строят реальные кривые маркаута на основе данных о сделках и котировках. Наша сопутствующая статья о том, как маркет-мейкеры зарабатывают деньги, описывает доходную часть того же баланса.
Что такое неблагоприятный выбор в трейдинге?
Маркет-мейкер выставляет две цены одновременно: bid (на покупку) и offer (на продажу), каждая на определенный объем. Разница между ними — это bid-ask спред, и бизнес здесь строится на арифметике. Покупать по bid, продавать по offer, повторяя это десятки тысяч раз в день, — в среднем каждая круговая сделка приносит доход, близкий к спреду.
Эта арифметика предполагает, что обе стороны приходят в равновесии. Но это не так. Выставленная котировка — это опцион, который любой участник может исполнить в удобный для него момент, и наиболее внимательные трейдеры выбирают лучшие моменты. Фонд, исполняющий крупный родительский ордер, продолжает покупать, пока offer остается дешевым. Система, которая уже увидела движение коррелирующего инструмента, занимает ту сторону, которая еще не переоценилась.
Неблагоприятный выбор — это название для перекоса в этом потоке: сделки, которые получает мейкер, смещены в сторону тех трейдеров, которым они были нужны больше всего. Признаком этого служит разрыв между спредом, который мейкер котирует, и спредом, который он сохраняет.
Что такое маркаут в маркет-мейкинге?
Маркаут отвечает на один вопрос, задаваемый после каждой сделки: где была цена через фиксированное количество секунд, если измерять ее со стороны мейкера? Допустим, мейкер продает 100 акций по $50.02, когда мидпоинт (средняя цена) составляет $50.00. Эта сделка открывается с кредитом в два цента на акцию (20 милов в единицах торгового стола, где мил — это одна десятая цента). Если через 60 секунд мидпоинт сместился к $50.04, 60-секундный маркаут составляет минус 20 милов. Начальный кредит исчерпан, и мейкер понес убыток в размере еще одного такого же кредита.
Усредните это по всем сделкам за период и постройте график относительно временного горизонта — получится кривая маркаута. На панели ниже она построена для AAPL за трехчасовой интервал в середине дня в четверг, 14 мая 2026 года. Каждая сделка соотносится с мидпоинтом той секунды, в которую она прошла: сделка выше мидпоинта считается покупкой тейкера, что ставит мейкера на сторону продажи.
Точный 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Первая серия — это кредит в момент исполнения, расстояние между ценой сделки и мидпоинтом, в среднем 19.66 милов на акцию. Вторая серия — это стоимость тех же сделок после того, как мидпоинт успел измениться: 20.5 милов через одну секунду и 9.81 милов через пять минут. Разница между двумя сериями на любом горизонте — это и есть маркаут, который вычитается из спреда, заложенного мейкером.
Кривая, которая быстро падает, а затем выравнивается, описывает мейкера, который платит за немедленную переоценку, но сохраняет остаток. Кривая, которая продолжает идти в одном направлении на всех горизонтах, описывает сделки, попадающие не на ту сторону цены, которая продолжает движение. Первая форма — это издержки ведения бизнеса. Вторая — котировка, которую необходимо изменить.
Какие сделки являются токсичным потоком?
Слово «токсичный» здесь имеет техническое значение. Поток токсичен, если его кривая маркаута направлена против мейкера на всех горизонтах при большой выборке. Торговые столы сортируют сделки по всем доступным признакам: размер сделки, площадка, тип ордера, идентификатор контрагента. Размер — это параметр, который виден в публичной ленте.
Точный 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)Сделки объемом менее 100 акций открываются с кредитом 19.47 милов на акцию и через минуту стоят 15.22 милов. Сделки от 1 000 акций и выше открываются с 36.26 милов и через тот же горизонт стоят 21.34 милов. Тот же инструмент, те же три часа, разная экономика на акцию. Крупнейшие ордера часто вообще избегают публичной очереди, для чего и организуется блочная сделка.
Риск инвентаря: позиция, которую невозможно вовремя хеджировать
Горизонт маркаута — это еще и часы. Мейкер, купивший 5 000 акций по bid, держит 5 000 акций, и до тех пор, пока позиция не захеджирована или не продана, она подвержена любому движению цены. Хеджирование редко бывает мгновенным: позицию по одной акции можно компенсировать коррелирующим ETF или опционной позицией, и каждая из них имеет свой спред. Риск инвентаря — это размер движения цены, который укладывается в этот временной интервал, и он измеряется одинаково для любого актива. Как далеко цена обычно уходит за следующую минуту и за следующий час?
Точный 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В мае 2026 года среднее абсолютное движение SPY за одну минуту составило 1.9 базисных пунктов (базисный пункт — одна сотая процента). Для NVDA за ту же минуту показатель составил 5.5. Если растянуть интервал до часа, цифры станут 14.1 и 40.4. Мейкер, способный закрыть позицию за минуту, живет с первой парой. Мейкер, удерживающий позицию час, живет со второй, при этом кредит, полученный при сделке, идентичен в обоих случаях.
Почему маркет-мейкеры теряют деньги в конце очереди
Биржи сопоставляют лимитные заявки по одной цене в порядке их поступления: сначала цена, затем время. Ордер в конце очереди на 40 000 акций по bid ждет, пока исполнятся 40 000 акций перед ним, а оценка позиции в очереди — это отдельная дисциплина.
Сложность заключается в том, что означает «очистка» очереди. Очередь пустеет двумя способами. Продавцы продолжают бить по bid, пока уровень не исчерпан, либо цена падает ниже этого уровня, оставляя его позади. Ордер в начале очереди участвует в обоих процессах. Ордер в конце очереди исполняется в основном вторым способом, в тот момент, когда уровень вот-вот станет «старой» ценой. Два мейкера могут торговать одним инструментом по одной цене и сохранять разную прибыль. Место в очереди никогда не отражается в котируемом спреде, так как оба мейкера выставили идентичную цену. Оно проявляется в кривой маркаута.
Почему расширение котировки — не бесплатное решение
Очевидный ответ на плохую кривую маркаута — расширить котировку. Более широкая котировка приносит больше на сделку, но исполняется реже. Обе части этого уравнения отражены в сделках за день, отсортированных по тому, насколько далеко каждая сделка оказалась от мидпоинта.
Точный 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)Сделки в пределах полуцента от мидпоинта составили 27.58 процентов объема за период и через минуту стоили 0.95 милов на акцию. Сделки, прошедшие более чем в двух центах от мидпоинта, составили 33.19 процентов объема при 46.86 милах. Котировка, выставленная дальше от мидпоинта, захватывает меньшую долю дневного объема.
Частота исполнения — это первая цена отказа от агрессивной котировки. Биржевые рибейты — вторая, так как многие площадки платят мейкеру за исполненную акцию, и этот доход масштабируется от объема, а не от ширины спреда. Уровни объема, определяющие ставку рибейта, считаются ежемесячно, поэтому «тихий» месяц переоценивает каждую сделку в следующем. Потеря места в очереди — последняя цена, которую приходится платить при выходе из позиции и снова при возвращении в конец очереди. Каждый мейкер находится где-то на этой кривой, и те, кто точнее всего измеряет свои маркауты, могут оставаться ближе к рынку, сохраняя при этом кредит. Это измерение — то преимущество, которое защищают крупнейшие маркет-мейкеры.
Часто задаваемые вопросы
Теряют ли маркет-мейкеры деньги на отдельных сделках?
Постоянно. Книга маркет-мейкера — это распределение небольших прибылей и убытков, причем убыточные сделки группируются в моменты непосредственно перед движением цены. Бизнес строится на среднем результате по миллионам сделок.
Что такое маркаут в трейдинге?
Маркаут — это изменение рыночной цены через фиксированный интервал времени после исполнения сделки, измеренное с точки зрения одной из сторон, где положительное число означает, что эта сторона получила прибыль. На столах акций маркауты котируются в милах на акцию, на столах опционов — в тиках на контракт.
Что означает «токсичный поток ордеров»?
Это описание потока ордеров, кривая маркаута которого устойчиво направлена против маркет-мейкера, исполняющего их, что означает, что цена продолжает уходить в сторону после каждой сделки. Этот термин является статистической характеристикой потока ордеров и не содержит оценки какого-либо отдельного трейдера.
Почему маркет-мейкеры расширяют спреды, а не снимают котировки?
Более широкая котировка позволяет мейкеру оставаться на рынке по цене, которая окупает худшую кривую маркаута. Снятие котировки не приносит ничего и одновременно приводит к потере места в очереди. Торговые столы делают и то, и другое, а выбор зависит от того, как долго котировка, как ожидается, будет оставаться неактуальной.
Как измеряется неблагоприятный выбор?
С помощью маркаутов. Каждая сделка помечается стороной, на которой был мейкер, затем усредняется изменение мидпоинта через фиксированные интервалы времени после этого. Разница между кредитом при исполнении и стоимостью на каждом горизонте — это стоимость неблагоприятного выбора в тех же единицах, что и спред.
Как были построены эти цифры
Каждая панель по AAPL считывает две публичные записи: ленту сделок и ленту котировок. Каждая сделка в период с 14:00 до 17:00 UTC 14 мая 2026 года сопоставляется со средним национальным лучшим bid и offer (мидпоинтом) той секунды, в которую она прошла, а затем помечается. Сделка выше этого мидпоинта считается покупкой тейкера, что ставит мейкера на сторону продажи. Сделки точно по мидпоинту не имеют стороны и исключаются, как и любые сделки, отклоняющиеся от мидпоинта более чем на 2 процента. Записи котировок, где bid равен или превышает offer, исключаются, так как заблокированный или перекрестный рынок не имеет пригодного мидпоинта.
Сопоставление на уровне секунд аппроксимирует котировку, действующую в микросекунду исполнения, и сглаживает самые быстрые обновления. Цены на горизонтах берутся из тех же секундных мидпоинтов. Панель инвентаря использует минутные бары и сохраняет только те, которые содержат не менее 50 сделок, что концентрирует выборку в самые активные часы дня.
Каждая панель здесь содержит SQL-запрос, который ее создал, поэтому математика маркаута открыта для проверки строка за строкой. Чтобы восстановить кривую для другого актива или другого дня, запросите ее на обычном английском языке в терминале Strasmore.