Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Mengapa Market Maker Rugi: Adverse Selection

Mengapa market maker rugi? Adverse selection adalah penyebab utamanya. Pelajari markout curve, inventory risk, dan queue position costs untuk mengukurnya.

Market makers mengalami kerugian akibat adverse selection: trader yang mengangkat offer sering kali adalah pihak yang sudah mengetahui bahwa offer tersebut stale. Setiap fill dimulai dengan kredit kecil, kira-kira setengah dari spread, dan detik-detik berikutnya menentukan seberapa besar kredit itu yang bertahan. Alat ukurnya adalah markout, yaitu perubahan harga bertanda pada horizon tetap setelah fill. Panel-panel di bawah membangun kurva markout aktual dari trade prints dan quote prints. Artikel pendamping kami tentang cara market makers menghasilkan uang membahas sisi pendapatan dari ledger yang sama.

Apa itu adverse selection dalam trading?

Market maker memasang dua harga sekaligus: bid untuk membeli dan offer untuk menjual, masing-masing berlaku untuk jumlah tertentu. Selisih di antara keduanya adalah bid ask spread, dan bisnis ini bersifat aritmetis. Membeli pada bid, menjual pada offer, lalu mengulanginya puluhan ribu kali sehari menghasilkan rata-rata round trip yang nilainya mendekati spread.

Perhitungan itu mengasumsikan kedua sisi datang dalam keseimbangan. Kenyataannya tidak demikian. Quote yang masih aktif adalah opsi yang dapat dieksekusi oleh siapa pun pada saat yang mereka pilih, dan trader yang paling cermat akan memilih momen terbaik. Fund yang sedang mengeksekusi parent order besar akan terus membeli ketika offer terlihat murah. Sistem yang sudah melihat pergerakan pada instrumen berkorelasi akan mengambil sisi yang belum mengalami repricing.

Adverse selection adalah istilah untuk ketimpangan dalam campuran tersebut: fill yang diterima maker lebih banyak berasal dari trader yang paling menginginkan eksekusi itu. Gejalanya adalah selisih antara spread yang dikutip maker dan spread yang berhasil dipertahankan maker.

Apa itu markout dalam market making?

Markout menjawab satu pertanyaan setelah setiap fill: di mana harga berada beberapa detik kemudian, diukur dari sisi posisi saya? Misalnya, maker menjual 100 saham pada harga $50.02 ketika midpoint berada di $50.00. Fill tersebut dimulai dengan kredit dua sen per saham, atau 20 mil dalam satuan desk, dengan satu mil sama dengan sepersepuluh sen. Jika midpoint bergerak ke $50.04 enam puluh detik kemudian, markout 60 detik adalah minus 20 mil. Kredit awal hilang, beserta tambahan dengan jumlah yang sama.

Jika hasilnya dirata-ratakan untuk setiap fill dalam suatu periode lalu diplot berdasarkan horizon, hasilnya adalah kurva markout. Panel di bawah membangun kurva untuk AAPL selama periode tengah hari tiga jam pada Kamis, 14 Mei 2026. Setiap print diberi tanda berdasarkan midpoint pada detik ketika print tersebut terjadi: print di atas midpoint dihitung sebagai pembelian oleh taker, sehingga maker berada di sisi jual.

QuerySeberapa besar spread yang bertahan: kurva markout AAPL, 1 detik hingga 5 menit
SQL tepat di balik setiap angka
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

Seri pertama menunjukkan kredit pada saat fill, yaitu jarak antara print dan midpoint, dengan rata-rata 19.66 mil per saham. Seri kedua menunjukkan nilai fill yang sama setelah midpoint memiliki waktu untuk bergerak: 20.5 mil satu detik kemudian dan 9.81 mil lima menit kemudian. Jarak antara kedua seri pada setiap horizon adalah markout, yang berasal dari spread yang dikutip maker.

Kurva yang turun cepat lalu mendatar menunjukkan bahwa maker menanggung biaya repricing segera dan mempertahankan sisanya. Kurva yang terus memiliki kemiringan sama pada setiap horizon menunjukkan bahwa fill terjadi di sisi yang salah dari harga yang terus bergerak. Bentuk pertama merupakan biaya menjalankan bisnis. Bentuk kedua menunjukkan bahwa quote perlu diubah.

Fill mana yang merupakan toxic flow?

Kata toxic memiliki fungsi teknis dalam konteks ini. Flow bersifat toxic ketika kurva markout-nya bergerak merugikan maker yang mengeksekusi fill tersebut pada setiap horizon dan dalam sampel besar. Desk mengelompokkan fill berdasarkan setiap label yang dapat mereka lihat: ukuran print, venue, jenis order, dan identifier counterparty. Ukuran adalah label yang tercantum pada public tape.

QueryFill AAPL berdasarkan ukuran transaksi: kredit saat fill dan nilai 60 detik kemudian
SQL tepat di balik setiap angka
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 dimulai dengan kredit 19.47 mil per saham dan bernilai 15.22 mil satu menit kemudian. Print sebanyak 1.000 saham atau lebih dimulai dengan 36.26 mil dan bernilai 21.34 mil pada horizon yang sama. Instrumennya sama, periode tiga jamnya sama, tetapi ekonominya per saham berbeda. Order terbesar sering kali menghindari antrean publik, yang memang menjadi tujuan block trade.

Risiko inventory, posisi yang tidak dapat di-hedge tepat waktu

Horizon markout juga merupakan sebuah jam. Maker yang membeli 5.000 saham pada bid memegang 5.000 saham tersebut. Hingga posisi itu di-hedge atau dijual, posisinya terekspos pada pergerakan harga berikutnya. Hedging jarang berlangsung seketika: posisi pada satu saham dapat di-offset dengan ETF berkorelasi atau posisi opsi, dan masing-masing memiliki spread yang harus dilalui. Risiko inventory adalah besarnya pergerakan yang terjadi dalam jendela tersebut. Risiko ini diukur dengan cara yang sama untuk setiap nama. Seberapa jauh harga biasanya bergerak dalam satu menit berikutnya dan dalam satu jam berikutnya?

QuerySeberapa jauh harga bergerak saat posisi menunggu: SPY dan NVDA, Mei 2026
SQL tepat di balik setiap angka
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, rata-rata pergerakan absolut SPY selama satu menit tercatat 1.9 basis point, dengan satu basis point sama dengan seperseratus persen. NVDA tercatat 5.5 pada periode satu menit yang sama. Jika horizon diperpanjang menjadi satu jam, kedua angka tersebut menjadi 14.1 dan 40.4. Maker yang dapat melakukan flatten dalam satu menit menanggung pasangan angka pertama. Maker yang memegang posisi selama satu jam menanggung pasangan angka kedua, sementara kredit yang dikumpulkan saat fill tetap sama dalam kedua kondisi.

Mengapa market makers mengalami kerugian di bagian belakang antrean

Exchange mencocokkan resting order pada satu harga berdasarkan urutan kedatangannya: harga terlebih dahulu, lalu waktu. Order yang berada di bagian belakang antrean 40.000 saham pada bid harus menunggu 40.000 saham di depannya terselesaikan. Mengestimasi queue position merupakan disiplin tersendiri.

Bagian yang rumit adalah arti dari terselesaikan. Antrean kosong melalui dua cara. Seller terus memukul bid hingga level tersebut habis, atau harga bergerak turun melewati level itu dan meninggalkannya. Order yang berada dekat bagian depan ikut dalam kedua jalur tersebut. Order di bagian belakang sebagian besar terisi melalui jalur kedua, tepat ketika level tersebut akan menjadi harga lama. Dua maker dapat memperdagangkan instrumen yang sama pada harga yang sama, tetapi mempertahankan jumlah yang berbeda. Posisi dalam antrean tidak pernah terlihat dalam quoted spread karena kedua maker mengutip harga yang identik. Posisi itu terlihat dalam kurva markout.

Mengapa memperlebar quote bukan solusi gratis

Jawaban yang paling jelas terhadap kurva markout yang buruk adalah mengutip harga dengan spread yang lebih lebar. Quote yang lebih lebar menghasilkan pendapatan lebih besar per fill, tetapi menerima lebih sedikit fill. Kedua sisi transaksi tersebut tercermin dalam print pada hari yang sama, yang diurutkan berdasarkan jarak setiap print dari midpoint.

QueryTransaksi AAPL berdasarkan jarak dari midpoint: porsi volume dan markout 60 detik
SQL tepat di balik setiap angka
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 yang berada dalam jarak setengah sen dari midpoint mencakup 27.58 persen saham dalam periode tersebut dan bernilai 0.95 mil per saham satu menit kemudian. Print yang berjarak lebih dari dua sen mencakup 33.19 persen saham dan bernilai 46.86 mil. Quote yang dipasang lebih jauh dari midpoint dicapai oleh porsi volume harian yang lebih kecil.

Fill rate adalah biaya pertama dari mundur dari touch. Exchange rebate adalah biaya kedua karena banyak venue membayar maker per saham yang terisi, dan pendapatan tersebut meningkat berdasarkan jumlah saham, bukan lebar quote. Volume tier yang menentukan tingkat rebate dihitung setiap bulan. Karena itu, bulan yang sepi akan mengubah harga setiap fill pada bulan berikutnya. Melepaskan queue slot adalah biaya terakhir. Biaya itu dibayar saat keluar dan kembali dibayar ketika masuk di bagian belakang antrean. Setiap maker berada di suatu titik pada kurva ini. Maker yang mengukur markout-nya sendiri dengan paling presisi dapat tetap berada dekat touch dan mempertahankan kredit. Pengukuran itulah keunggulan yang dipertahankan oleh market makers terbesar.

FAQ

Apakah market makers mengalami kerugian pada setiap trade?

Sering. Buku making terdiri atas distribusi keuntungan kecil dan kerugian kecil. Fill yang merugi terkonsentrasi pada momen tepat sebelum harga bergerak. Bisnis ini bergantung pada rata-rata dari jutaan fill.

Apa itu markout dalam trading?

Markout adalah perubahan harga pasar pada horizon tetap setelah fill. Perubahan tersebut diberi tanda dari sudut pandang salah satu sisi, dengan angka positif berarti sisi tersebut memperoleh keuntungan. Desk ekuitas mengutip markout dalam mil per saham, sedangkan desk opsi mengutipnya dalam tick per kontrak.

Apa arti toxic order flow?

Istilah ini menggambarkan order flow yang kurva markout-nya terus bergerak merugikan market maker yang mengeksekusi fill tersebut. Artinya, harga terus bergerak menjauh setelah setiap fill. Label ini merupakan sifat statistik dari arus order dan tidak memuat penilaian terhadap trader mana pun.

Mengapa market makers memperlebar spread, bukan menarik quote?

Quote yang lebih lebar membuat maker tetap berada di pasar pada harga yang mengompensasi kurva markout yang lebih buruk. Menarik quote tidak menghasilkan pendapatan dan sekaligus melepaskan queue position. Desk melakukan keduanya. Pilihannya bergantung pada berapa lama quote diperkirakan akan tetap stale.

Bagaimana adverse selection diukur?

Dengan markout. Beri tanda pada setiap fill berdasarkan sisi tempat maker berada, lalu ratakan perubahan midpoint pada beberapa horizon tetap setelahnya. Selisih antara kredit saat fill dan nilainya pada setiap horizon adalah biaya adverse selection, dalam satuan yang sama dengan spread.

Bagaimana angka-angka ini dibuat

Setiap panel AAPL menggunakan dua catatan publik: trade tape dan quote tape. Setiap print antara pukul 14:00 dan 17:00 UTC pada 14 Mei 2026 dicocokkan dengan midpoint rata-rata dari national best bid and offer pada detik ketika print tersebut terjadi, lalu diberi tanda. Print di atas midpoint dihitung sebagai pembelian oleh taker, sehingga maker berada di sisi jual. Print yang tepat pada midpoint tidak memiliki sisi dan dikeluarkan, demikian pula setiap print yang berjarak lebih dari 2 persen dari midpoint. Catatan quote ketika bid sama dengan atau melampaui offer dikecualikan karena locked or crossed market tidak memiliki midpoint yang dapat digunakan.

Pencocokan pada level detik memperkirakan quote yang berlaku pada mikrodetik ketika fill terjadi dan menghaluskan update tercepat. Harga pada setiap horizon berasal dari midpoint pada level detik yang sama. Panel inventory menggunakan bar satu menit dan hanya mempertahankan bar yang memuat sedikitnya 50 print. Dengan demikian, sampel terkonsentrasi pada jam-jam tersibuk dalam sehari.


Setiap panel di sini memuat SQL yang menghasilkannya, sehingga perhitungan markout dapat diperiksa baris demi baris. Untuk membangun kembali kurva pada nama atau hari yang berbeda, mintalah dalam bahasa biasa melalui terminal Strasmore.