Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Bakit Nalulugi ang Market Makers: Adverse Selection

Bakit nalulugi ang market makers? Adverse selection ang pangunahing dahilan. Alamin kung paano ito sinusukat ng markout curves, pati ang inventory risk at queue position costs.

Ang market makers ay nalulugi dahil sa adverse selection: kadalasan, ang trader na kumukuha sa offer ang siyang nakaaalam na stale na ang offer. Nagsisimula ang bawat fill sa maliit na credit, humigit-kumulang kalahati ng spread, at ang mga segundong kasunod ang nagpapasya kung gaano kalaki rito ang matitira. Ang measurement tool ay ang markout—isang signed price change sa takdang horizon pagkatapos ng fill. Binubuo ng mga panel sa ibaba ang aktuwal na markout curves mula sa trade at quote prints. Tinalakay naman sa companion piece namin tungkol sa kung paano kumikita ang market makers ang revenue side ng parehong ledger.

Ano ang adverse selection sa trading?

Ang market maker ay sabay na nagpo-post ng dalawang presyo: bid para bumili at offer para magbenta, na parehong may itinakdang size. Ang pagitan ng mga ito ay ang bid ask spread, at arithmetic ang pinagbabatayan ng negosyo. Bumili sa bid, magbenta sa offer, at ulitin ito nang sampu-sampung libong beses bawat araw. Sa average, makokolekta ang halagang malapit sa spread sa bawat round trip.

Ipinapalagay ng arithmetic na iyon na balanse ang pagdating ng dalawang panig. Hindi ito nangyayari. Ang resting quote ay isang standing option na maaaring i-exercise ng kahit sino sa oras na gusto niya, at pinipili ng mga trader na pinakamapagmatsyag ang pinakamainam na sandali. Patuloy na bumibili ang isang fund na nagsasagawa ng malaking parent order habang mura ang offer. Kukunin naman ng isang system na nakakita na ng galaw sa correlated instrument ang panig na hindi pa nagre-reprice.

Adverse selection ang tawag sa pagkiling na ito: mas tumitimbang ang fills na natatanggap ng maker sa mga trader na pinakanais isagawa ang trade. Ang palatandaan nito ay ang pagitan ng spread na kino-quote ng maker at ng spread na aktuwal niyang napapanatili.

Ano ang markout sa market making?

Sinasagot ng markout ang isang tanong pagkatapos ng bawat fill: nasaan ang presyo makalipas ang takdang bilang ng mga segundo, batay sa panig na kinaroroonan ko? Halimbawa, nagbenta ang isang maker ng 100 shares sa $50.02 habang nasa $50.00 ang midpoint. Nagsisimula ang fill na iyon sa credit na dalawang sentimo bawat share, o 20 mils sa desk units, kung saan ang isang mil ay one tenth ng isang sentimo. Kung umakyat sa $50.04 ang midpoint makalipas ang sixty seconds, ang 60 second markout ay minus 20 mils. Naubos ang opening credit, at nawala rin ang kaparehong halaga.

Kapag in-average ito sa bawat fill sa loob ng isang window at ipinlot laban sa horizon, nagiging markout curve ang resulta. Bumubuo ang panel sa ibaba ng isa para sa AAPL sa loob ng three hour midday window noong Thursday, May 14, 2026. Ang bawat print ay nilalagdaan batay sa midpoint ng segundong pinasok nito: ang print na nasa itaas ng midpoint ay binibilang bilang pagbili ng taker, kaya nasa sell side ang maker.

QueryGaano karami sa spread ang nananatili: AAPL markout curve, 1 segundo hanggang 5 minuto
Ang eksaktong SQL sa likod ng bawat numero
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

Ang unang series ay ang credit sa mismong sandali ng fill—ang layo ng print mula sa midpoint—na may average na 19.66 mils bawat share. Ang ikalawang series ay ang halaga ng parehong fills matapos magkaroon ng panahon ang midpoint na gumalaw: 20.5 mils makalipas ang one second, at 9.81 mils makalipas ang five minutes. Ang pagitan ng dalawang series sa anumang horizon ang markout, at kinukuha ito mula sa spread na kino-quote ng maker.

Ang curve na mabilis bumababa at pagkatapos ay nagfa-flatten ay nagpapakitang nagbayad ang maker para sa agarang repricing ngunit napanatili ang natitira. Ang curve na patuloy na may parehong slope sa bawat horizon ay nagpapakitang napupunta ang fills sa maling panig ng presyong patuloy na gumagalaw. Ang unang hugis ay cost of doing business. Ang ikalawa ay quote na kailangang baguhin.

Aling fills ang toxic flow?

May teknikal na gamit ang salitang toxic dito. Toxic ang flow kapag ang markout curve nito ay patuloy na kumikiling laban sa maker na tumanggap ng fill, sa bawat horizon at sa malaking sample. Inuuri ng mga desk ang fills ayon sa bawat label na nakikita nila: print size, venue, order type, at counterparty identifier. Ang size ang label na nasa public tape.

QueryAAPL fills ayon sa print size: credit sa fill at value makalipas ang 60 segundo
Ang eksaktong SQL sa likod ng bawat numero
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

Ang fills na wala pang 100 shares ay nagsisimula sa 19.47 mils bawat share na credit at nagkakahalaga ng 15.22 mils makalipas ang isang minuto. Ang prints na 1,000 shares pataas ay nagsisimula sa 36.26 mils at nagkakahalaga ng 21.34 mils sa parehong horizon. Pareho ang instrument at parehong three hours, ngunit magkaiba ang economics bawat share. Kadalasang iniiwasan ng pinakamalalaking order ang public queue, na siyang layunin ng isang block trade.

Inventory risk, ang position na hindi agad ma-hedge

Ang markout horizon ay isa ring orasan. Kapag bumili ang maker ng 5,000 shares sa bid, hawak niya ang 5,000 shares. Hangga’t hindi nahe-hedge o naibebenta ang position, exposed ito sa susunod na galaw ng presyo. Bihirang instant ang hedging: maaaring i-offset ang isang single-stock position gamit ang correlated ETF o options position, at bawat isa ay may sarili nitong spread na kailangang tawirin. Ang inventory risk ay ang laki ng galaw na maaaring mangyari sa loob ng window na iyon, at pareho ang paraan ng pagsukat nito sa anumang name. Gaano kalayo karaniwang gumagalaw ang presyo sa susunod na minuto at sa susunod na oras?

QueryGaano kalayo ang galaw ng presyo habang naghihintay ang posisyon: SPY at NVDA, Mayo 2026
Ang eksaktong SQL sa likod ng bawat numero
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

Sa buong May 2026, ang average absolute move ng SPY sa loob ng one minute ay 1.9 basis points, kung saan ang isang basis point ay one hundredth of one percent. Ang sukat para sa NVDA sa parehong minuto ay 5.5. Kapag isang oras ang window, nagiging 14.1 at 40.4 ang dalawang figure. Ang maker na nakapagfa-flatten sa loob ng isang minuto ay umaasa sa unang pares. Ang maker na humahawak nang isang oras ay umaasa sa ikalawang pares, ngunit pareho ang credit na nakolekta sa fill.

Bakit nalulugi ang market makers sa hulihan ng queue

Tinatapatan ng exchanges ang resting orders sa iisang presyo ayon sa pagkakasunod ng pagdating ng mga ito: presyo muna, pagkatapos ay oras. Ang order sa hulihan ng 40,000 share queue sa bid ay naghihintay na ma-clear ang 40,000 shares na nasa unahan nito, at ang pagtatantiya ng queue position ay isang hiwalay na disiplina.

Ang mahirap na bahagi ay ang kahulugan ng pag-clear. Dalawang paraan ang pag-ubos ng queue. Patuloy na tinatamaan ng mga seller ang bid hanggang maubos ang level, o gumagalaw pababa ang presyo lampas sa level at naiiwan ito. Sumasali sa parehong sitwasyon ang order na malapit sa unahan. Kadalasang napupuno naman ang order sa hulihan sa ikalawang paraan, sa sandaling malapit nang maging dating presyo ang level. Maaaring mag-trade ang dalawang maker sa parehong instrument at parehong presyo ngunit magkaiba ang halagang napapanatili nila. Hindi lumilitaw ang queue slot sa quoted spread dahil parehong presyo ang kino-quote ng dalawang maker. Lumilitaw ito sa markout curve.

Bakit hindi libreng solusyon ang pagpapaluwag ng quote

Ang malinaw na sagot sa masamang markout curve ay ang pag-quote nang mas maluwag. Mas malaki ang kinikita sa bawat fill ngunit mas kaunti ang naaabot na fills. Parehong makikita ang dalawang epekto sa prints ng parehong araw, na inayos ayon sa layo ng bawat print mula sa midpoint.

QueryAAPL prints ayon sa layo mula sa midpoint: bahagi ng volume at 60 segundong markout
Ang eksaktong SQL sa likod ng bawat numero
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

Ang prints na nasa loob ng kalahating sentimo mula sa midpoint ay bumuo ng 27.58 percent ng shares sa window at nagkakahalaga ng 0.95 mils bawat share makalipas ang isang minuto. Ang prints na mahigit dalawang sentimo ang layo ay bumuo ng 33.19 percent ng shares, sa 46.86 mils. Mas maliit na bahagi ng volume sa buong araw ang nakaaabot sa quote na mas malayo sa midpoint.

Ang fill rate ang unang cost ng pag-atras. Ikalawa ang exchange rebates, dahil maraming venue ang nagbabayad sa maker bawat share na napupuno at nakadepende ang kita sa shares, hindi sa lapad ng quote. Buwanang binibilang ang volume tiers na nagtatakda ng rebate rate, kaya ang isang mahinang buwan ay nagre-reprice sa bawat fill sa susunod na buwan. Ang pagsuko sa queue slot ang huling cost. Binabayaran ito sa paglabas at muli sa hulihan ng pila sa pagpasok. May puwesto ang bawat maker sa curve na ito, at ang mga maker na pinakatumpak magsukat ng sarili nilang markouts ay maaaring manatiling pinakamalapit sa touch habang napapanatili pa rin ang credit. Ang measurement na iyon ang edge na ipinagtatanggol ng pinakamalalaking market makers.

FAQ

Nalulugi ba ang market makers sa mga indibidwal na trade?

Madalas. Ang making book ay binubuo ng distribusyon ng maliliit na gain at maliliit na loss, at nagkakumpulan ang mga losing fill sa mga sandaling bago gumalaw ang presyo. Nakabatay ang negosyo sa average sa milyun-milyong fills.

Ano ang markout sa trading?

Ang markout ay ang pagbabago sa market price sa takdang horizon pagkatapos ng fill, na nilalagdaan mula sa pananaw ng isang panig. Positibo ang numero kapag nakinabang ang panig na iyon. Kino-quote ng equities desks ang markouts sa mils bawat share, at ng options desks sa ticks bawat contract.

Ano ang ibig sabihin ng toxic order flow?

Inilalarawan nito ang order flow na ang markout curve ay patuloy na kumikiling laban sa market maker na tumanggap ng fill. Ibig sabihin, patuloy na lumalayo ang presyo pagkatapos ng bawat fill. Statistical property ito ng isang stream ng orders at wala itong hatol tungkol sa sinumang trader.

Bakit pinapaluwag ng market makers ang spreads sa halip na bawiin ang kanilang quotes?

Pinananatili ng mas maluwag na quote ang maker sa market sa presyong nagbabayad para sa mas masamang markout curve. Walang kinikita sa pagbawi ng quote, at kasabay nito ay nawawala ang queue position. Ginagawa ng mga desk ang parehong hakbang, at nakadepende ang pagpili sa inaasahang tagal bago maging stale ang quote.

Paano sinusukat ang adverse selection?

Gamit ang markouts. Nilalagdaan ang bawat fill ayon sa panig na kinaroroonan ng maker, pagkatapos ay ina-average ang pagbabago sa midpoint sa mga takdang horizon. Ang pagitan ng credit sa fill at halaga sa bawat horizon ang cost ng adverse selection, gamit ang parehong units ng spread.

Paano binuo ang mga numerong ito

Gumagamit ang bawat AAPL panel ng dalawang public record: ang trade tape at quote tape. Ang bawat print sa pagitan ng 14:00 at 17:00 UTC noong May 14, 2026 ay itinatapat sa average na midpoint ng national best bid and offer para sa segundong pinasukan nito, at pagkatapos ay nilalagdaan. Ang print na nasa itaas ng midpoint ay binibilang bilang taker buy, kaya nasa sell side ang maker. Walang panig ang prints na eksaktong nasa midpoint kaya inaalis ang mga ito, kasama ng anumang print na mahigit 2 percent ang layo mula sa midpoint. Inaalis din ang quote records kung saan kapantay o lumalampas ang bid sa offer, dahil walang magagamit na midpoint sa isang locked o crossed market.

Tinatantiya ng second level matching ang quote na umiiral sa microsecond ng fill at pinapakinis nito ang pinakamabilis na updates. Galing sa parehong second level midpoints ang mga presyo sa bawat horizon. Gumagamit ang inventory panel ng one minute bars at pinananatili lamang ang mga bar na may hindi bababa sa 50 prints, kaya nakatuon ang sample sa pinakamalalakas na oras ng araw.


May SQL na gumawa sa bawat panel dito, kaya maaaring suriin ang markout math sa bawat linya. Para buuin muli ang curve sa ibang name o ibang araw, hilingin ito sa plain English sa Strasmore terminal.