Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Mengapa Market Maker Rugi Akibat Adverse Selection

Ketahui punca market maker mengalami kerugian melalui adverse selection. Kami membincangkan penggunaan lengkung markout, risiko inventori, serta kos posisi barisan dalam dagangan.

Market maker kerugian wang akibat adverse selection: pedagang yang mengambil tawaran (lift an offer) selalunya merupakan pihak yang sudah mengetahui bahawa tawaran tersebut sudah lapuk. Setiap fill bermula dengan kredit kecil, kira-kira separuh daripada spread, dan saat-saat yang menyusul menentukan berapa banyak daripada kredit tersebut yang kekal. Alat pengukurannya ialah markout, iaitu perubahan harga bertanda pada ufuk masa tetap selepas sesuatu fill, dan panel di bawah membina lengkung markout sebenar daripada data dagangan dan sebut harga (prints). Artikel pendamping kami mengenai bagaimana market maker menjana wang merangkumi bahagian hasil bagi lejar yang sama.

Apakah itu adverse selection dalam dagangan?

Seorang market maker memaparkan dua harga serentak: bid untuk membeli dan offer untuk menjual, setiap satunya untuk saiz yang dinyatakan. Jurang antara kedua-duanya ialah bid ask spread, dan perniagaan ini adalah mengenai aritmetik. Beli pada harga bid, jual pada harga offer, ulangi puluhan ribu kali sehari, dan purata pusingan dagangan akan mengumpul jumlah yang hampir dengan spread.

Aritmetik itu mengandaikan kedua-dua pihak tiba dalam keadaan seimbang. Hakikatnya tidak. Sebut harga yang sedia ada (resting quote) merupakan opsyen tertangguh yang boleh dilaksanakan oleh sesiapa sahaja pada bila-bila masa pilihan mereka, dan pedagang yang paling teliti akan memilih saat yang terbaik. Dana yang mengendalikan parent order yang besar akan terus membeli sementara harga offer masih murah. Sistem yang telah melihat instrumen berkorelasi bergerak akan mengambil bahagian yang belum diselaraskan harganya.

Adverse selection ialah istilah bagi kecondongan dalam campuran tersebut: fill yang diterima oleh maker lebih tertumpu kepada pedagang yang paling menginginkannya. Simptomnya ialah jurang antara spread yang disebut oleh maker dan spread yang sebenarnya dikekalkan oleh maker.

Apakah itu markout dalam market making?

Markout menjawab satu soalan yang ditanya selepas setiap fill: di manakah harga tersebut berada selepas beberapa saat yang ditetapkan, diukur dari sisi yang saya ambil? Katakan seorang maker menjual 100 saham pada $50.02 sementara titik tengah (midpoint) berada pada $50.00. Fill itu bermula dengan kredit dua sen sesaham, atau 20 mil dalam unit desk, di mana satu mil adalah satu persepuluh daripada satu sen. Jika titik tengah telah bergerak ke $50.04 enam puluh saat kemudian, markout 60 saat adalah negatif 20 mil. Kredit permulaan telah hilang, malah kerugian tambahan sebanyak jumlah yang sama turut berlaku.

Puratakan angka tersebut merentasi setiap fill dalam satu tempoh dan plotkannya terhadap ufuk masa, dan hasilnya ialah lengkung markout. Panel di bawah membina satu lengkung untuk AAPL sepanjang tempoh tiga jam tengah hari pada Khamis, 14 Mei 2026. Setiap print ditandakan berbanding titik tengah saat ia dicetak: print di atas titik tengah dikira sebagai taker membeli, yang meletakkan maker di sisi jualan.

PertanyaanSejauh mana spread bertahan: Keluk markout AAPL, 1 saat hingga 5 minit
SQL tepat di sebalik setiap nombor
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

Siri pertama ialah kredit pada saat fill berlaku, iaitu jarak antara print dan titik tengah, dengan purata 19.66 mil sesaham. Siri kedua ialah nilai fill yang sama setelah titik tengah mempunyai masa untuk bergerak: 20.5 mil selepas satu saat, dan 9.81 mil selepas lima minit. Jarak antara kedua-dua siri pada mana-mana ufuk masa ialah markout, dan ia datang daripada spread yang disebut oleh maker.

Lengkung yang jatuh dengan cepat dan kemudian mendatar menggambarkan maker yang membayar untuk penyelarasan harga segera dan mengekalkan bakinya. Lengkung yang terus mencerun ke arah yang sama pada setiap ufuk masa menggambarkan fill yang mendarat di sisi yang salah bagi harga yang terus bergerak. Bentuk pertama adalah kos menjalankan perniagaan. Bentuk kedua adalah sebut harga yang perlu diubah.

Fill yang manakah merupakan aliran toksik (toxic flow)?

Perkataan toksik di sini membawa maksud teknikal. Aliran adalah toksik apabila lengkung markoutnya mencerun melawan maker yang melaksanakannya, pada setiap ufuk masa, merentasi sampel yang besar. Desk menyusun fill mengikut setiap label yang boleh dilihat: saiz print, tempat dagangan (venue), jenis order, pengecam pihak lawan. Saiz adalah label yang dibawa dalam pita awam.

PertanyaanIsian AAPL mengikut saiz cetakan: kredit pada masa isian dan nilai 60 saat kemudian
SQL tepat di sebalik setiap nombor
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

Fill di bawah 100 saham bermula dengan 19.47 mil sesaham kredit dan bernilai 15.22 mil seminit kemudian. Print sebanyak 1,000 saham ke atas bermula dengan 36.26 mil dan bernilai 21.34 mil sepanjang ufuk masa yang sama. Instrumen yang sama, tiga jam yang sama, ekonomi sesaham yang berbeza. Order yang paling besar selalunya mengelakkan barisan awam sepenuhnya, itulah tujuan block trade diatur.

Risiko inventori, posisi yang tidak dapat dilindung nilai tepat pada masanya

Ufuk masa markout juga merupakan jam. Maker yang membeli 5,000 saham pada harga bid memegang 5,000 saham, dan sehingga posisi itu dilindung nilai (hedged) atau dijual, ia terdedah kepada apa jua pergerakan harga seterusnya. Lindung nilai jarang berlaku serta-merta: posisi saham tunggal boleh diimbangi dengan ETF berkorelasi atau posisi opsyen, dan setiap satunya membawa spread sendiri untuk ditembusi. Risiko inventori ialah saiz pergerakan yang berlaku dalam tempoh masa tersebut, dan ia diukur dengan cara yang sama untuk mana-mana nama. Sejauh manakah harga biasanya bergerak dalam tempoh seminit seterusnya, dan dalam tempoh sejam seterusnya?

PertanyaanJarak pergerakan harga semasa posisi menunggu: SPY dan NVDA, Mei 2026
SQL tepat di sebalik setiap nombor
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

Sepanjang Mei 2026, purata pergerakan mutlak dalam SPY bagi tempoh satu minit mencatatkan 1.9 mata asas, di mana satu mata asas adalah satu perseratus daripada satu peratus. NVDA mencatatkan 5.5 bagi minit yang sama. Panjangkan masa kepada satu jam dan kedua-dua angka tersebut menjadi 14.1 dan 40.4. Maker yang boleh meratakan posisi dalam tempoh seminit hidup dengan pasangan pertama. Maker yang memegang posisi selama sejam hidup dengan pasangan kedua, dan kredit yang dikumpul pada fill adalah sama bagi kedua-duanya.

Mengapa market maker kerugian wang di hujung barisan

Bursa memadankan order yang sedia ada pada satu harga mengikut urutan ketibaan: harga didahulukan, kemudian masa. Order di hujung barisan 40,000 saham pada harga bid perlu menunggu 40,000 saham di hadapannya selesai, dan menganggar posisi barisan adalah satu disiplin tersendiri.

Bahagian yang sukar ialah maksud "selesai". Barisan akan kosong melalui dua cara. Penjual terus menekan harga bid sehingga tahap tersebut habis, atau harga bergerak turun melepasi tahap tersebut dan meninggalkannya. Order yang hampir dengan hadapan akan terlibat dalam kedua-duanya. Order di hujung barisan kebanyakannya selesai pada laluan kedua, pada saat tahap tersebut hampir menjadi harga lama. Dua maker boleh mendagangkan instrumen yang sama pada harga yang sama dan mengekalkan jumlah yang berbeza. Slot barisan tidak pernah muncul dalam spread yang disebut, memandangkan kedua-dua maker menyebut harga yang sama. Ia muncul dalam lengkung markout.

Mengapa meluaskan sebut harga bukan penyelesaian percuma

Jawapan yang jelas bagi lengkung markout yang buruk adalah dengan menyebut harga yang lebih luas. Sebut harga yang lebih luas memperoleh lebih banyak pendapatan bagi setiap fill tetapi mendapat lebih sedikit fill. Kedua-dua bahagian dagangan itu berada dalam print hari yang sama, disusun mengikut sejauh mana setiap print mendarat dari titik tengah.

PertanyaanCetakan AAPL mengikut jarak dari titik tengah: bahagian volum dan markout 60 saat
SQL tepat di sebalik setiap nombor
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

Print dalam lingkungan setengah sen daripada titik tengah menyumbang 27.58 peratus daripada saham dalam tempoh tersebut, bernilai 0.95 mil sesaham seminit kemudian. Print yang mendarat lebih daripada dua sen jauhnya menyumbang 33.19 peratus daripada saham, pada 46.86 mil. Sebut harga yang diletakkan lebih jauh daripada titik tengah dicapai oleh bahagian volum harian yang lebih kecil.

Kadar fill adalah kos pertama bagi langkah berundur. Rebat bursa adalah yang kedua, memandangkan banyak tempat dagangan membayar maker bagi setiap saham yang selesai dan pendapatan itu berskala dengan saham dan bukannya dengan keluasan sebut harga. Peringkat volum yang menetapkan kadar rebat dikira setiap bulan, jadi bulan yang tenang akan menetapkan semula harga setiap fill pada bulan berikutnya. Melepaskan slot barisan adalah kos terakhir, dibayar semasa keluar dan dibayar semula di hujung barisan semasa masuk. Setiap maker berada di suatu tempat pada lengkung ini, dan mereka yang mengukur markout mereka sendiri dengan paling tepat boleh berada paling dekat dengan harga pasaran (touch) dan masih mengekalkan kredit. Pengukuran itulah kelebihan yang dipertahankan oleh market maker terbesar.

Soalan Lazim

Adakah market maker kerugian wang pada dagangan individu?

Secara rutin. Buku market making adalah taburan keuntungan kecil dan kerugian kecil, dan fill yang rugi berkumpul pada saat-saat sebelum harga bergerak. Perniagaan ini bergantung pada purata merentasi berjuta-juta fill.

Apakah itu markout dalam dagangan?

Markout ialah perubahan dalam harga pasaran pada ufuk masa tetap selepas sesuatu fill, ditandakan dari sudut pandangan satu pihak, di mana nombor positif bermakna pihak tersebut mendapat keuntungan. Desk ekuiti menyebut markout dalam mil sesaham, dan desk opsyen dalam tick per kontrak.

Apakah maksud aliran order toksik?

Ia menggambarkan aliran order yang lengkung markoutnya mencerun secara berterusan melawan market maker yang melaksanakannya, bermakna harga terus bergerak menjauhi selepas setiap fill. Label ini adalah sifat statistik bagi aliran order, dan ia tidak membawa sebarang penghakiman terhadap mana-mana pedagang tunggal.

Mengapa market maker meluaskan spread dan bukannya menarik balik sebut harga mereka?

Sebut harga yang lebih luas mengekalkan maker dalam pasaran pada harga yang membayar untuk lengkung markout yang lebih buruk. Menarik balik sebut harga tidak memperoleh apa-apa dan menyerahkan posisi barisan bersamanya. Desk melakukan kedua-duanya, dan pilihan tersebut bergantung pada berapa lama sebut harga dijangka kekal lapuk.

Bagaimanakah adverse selection diukur?

Dengan markout. Tandakan setiap fill mengikut sisi yang diambil oleh maker, kemudian puratakan perubahan titik tengah pada ufuk masa tetap selepasnya. Jurang antara kredit pada fill dan nilai pada setiap ufuk masa ialah kos adverse selection, dalam unit yang sama seperti spread.

Bagaimana angka-angka ini dibina

Setiap panel AAPL membaca dua rekod awam: pita dagangan dan pita sebut harga. Setiap print antara 14:00 dan 17:00 UTC pada 14 Mei 2026 dipadankan dengan purata titik tengah national best bid and offer pada saat ia dicetak, kemudian ditandakan. Print di atas titik tengah tersebut dikira sebagai taker buy, yang meletakkan maker di sisi jualan. Print tepat pada titik tengah tidak membawa sisi dan digugurkan, bersama-sama dengan mana-mana print yang lebih daripada 2 peratus jauh dari titik tengah. Rekod sebut harga di mana bid bertemu atau melintasi offer dikecualikan, memandangkan locked or crossed market tidak mempunyai titik tengah yang boleh digunakan.

Pemadanan peringkat kedua menganggarkan sebut harga yang berlaku pada mikrosaat fill, dan ia melancarkan kemas kini yang paling pantas. Harga ufuk masa datang daripada titik tengah peringkat saat yang sama. Panel inventori menggunakan bar satu minit dan hanya mengekalkan bar yang membawa sekurang-kurangnya 50 print, yang menumpukan sampel pada jam-jam paling sibuk dalam sehari.


Setiap panel di sini membawa SQL yang menghasilkannya, jadi matematik markout terbuka untuk diperiksa baris demi baris. Untuk membina semula lengkung pada nama yang berbeza atau hari yang berbeza, minta ia dalam bahasa Inggeris biasa pada terminal Strasmore.