Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Apa itu trade markout dan cara mengukur kualiti

Ketahui maksud trade markout dalam dagangan serta cara mengukur pergerakan harga pasaran dari satu saat hingga lima minit selepas transaksi dilaksanakan untuk menilai kualiti eksekusi.

Trade markout ialah perubahan harga pertengahan (mid price) dalam tempoh masa tetap selepas sesuatu transaksi (fill), diukur dari saat transaksi tersebut dilaksanakan. Nilai positif bermakna pasaran bergerak memihak kepada anda selepas anda berdagang. Nilai negatif bermakna pasaran bergerak menentang anda, yang dipanggil oleh trading desk sebagai adverse selection. Tempoh masa yang anda pilih, sama ada satu saat atau lima minit, menentukan persoalan yang dijawab oleh angka tersebut.

Apakah itu trade markout?

Mulakan dengan harga pertengahan: titik tengah antara best bid dan best offer, iaitu titik tengah bagi NBBO. Markout mengambil harga pertengahan tersebut pada tempoh masa yang dipilih selepas transaksi anda, menolaknya dengan harga rujukan, dan memberikan tanda (positif atau negatif) berdasarkan pihak yang anda dagangkan.

**markout pada tempoh h = pihak * (harga pertengahan pada t+h - harga rujukan)**, di mana pihak adalah tambah satu jika anda membeli dan tolak satu jika anda menjual.

Konvensyen tanda biasanya menjadi punca kekeliruan. Pembelian yang diikuti dengan kejatuhan harga pertengahan mempunyai markout negatif: anda membeli, harga turun, dan pihak yang menjual kepada anda mendapat keuntungan daripada transaksi tersebut. Itulah adverse selection yang ditulis dalam bentuk angka. Jualan yang diikuti dengan kejatuhan harga pertengahan mempunyai markout positif, kerana tandanya berubah mengikut pihak. Setiap transaksi mempunyai dua pihak, dan markout bagi satu pihak adalah markout pihak yang satu lagi dengan tanda yang diterbalikkan.

Tiga harga rujukan

Harga rujukan yang anda tolak menentukan apa yang diukur oleh markout tersebut.

  • Harga transaksi (fill price). Markout menjadi nilai wang: nilai posisi pada t+h berbanding dengan apa yang anda bayar. Spread yang anda bayar atau peroleh terkandung di dalamnya.
  • Harga pertengahan pada saat transaksi. Ini membuang spread dan mengasingkan bagaimana pasaran bergerak selepas anda berdagang, yang merupakan bacaan paling tepat mengenai adverse selection.
  • Sebut harga (quote) pada pihak yang anda dagangkan. Mengukur terhadap touch yang anda ambil, atau touch yang anda paparkan, menjawab bagaimana transaksi tersebut dibandingkan dengan harga yang sebenarnya tersedia.

Kerja kualiti pelaksanaan lebih bergantung pada yang kedua untuk adverse selection dan yang pertama untuk untung rugi. Kedua-duanya muncul dalam panel pertama di bawah, merentasi satu set transaksi.

Keluk markout dan maksud bentuknya

Jalankan statistik yang sama pada banyak tempoh masa dan anda akan mendapat satu keluk. Bentuknya membawa lebih banyak makna daripada mana-mana angka tunggal.

  • Keluk yang jatuh dengan curam dalam saat pertama dan kekal rendah menggambarkan aliran yang "dipetik" (picked off): harga bergerak menentang transaksi tersebut hampir serta-merta.
  • Keluk yang terus jatuh selama beberapa minit menggambarkan aliran yang membawa maklumat sebenar tentang ke mana arah harga seterusnya.
  • Keluk rata berhampiran sifar menggambarkan aliran yang tidak berbahaya. Selepas lima minit, harga pertengahan kelihatan seperti semasa transaksi dilakukan.
  • Keluk yang bermula negatif dan naik semula ke arah sifar adalah bentuk yang dicari oleh passive maker yang mengumpul rebat. Penurunan awal adalah spread ditambah impak serta-merta, dan pemulihan adalah pasaran yang kembali stabil.

Pemilihan tempoh masa itu sendiri adalah keputusan tentang apa yang anda ukur. Di bawah satu saat, markout kebanyakannya membaca kependaman (latency) dan kedudukan baris gilir. Jika dipanjangkan kepada satu minit, ia membaca maklumat jangka pendek dalam aliran tersebut. Melebihi lima minit, hanyutan pasaran biasa mula mengatasi transaksi itu sendiri.

Keluk markout sebenar, transaksi demi transaksi

Panel di bawah mengambil setiap print INTC daripada sesi biasa 10 Jun 2026, mengelaskan setiap satu sebagai dimulakan oleh pembeli atau dimulakan oleh penjual berbanding sebut harga terakhir saat sebelum ia dicetak, dan mengira purata markout bertanda pada tempoh 5. Dua siri berjalan merentasi transaksi yang sama: satu diukur daripada harga pertengahan semasa transaksi, satu lagi daripada harga transaksi.

PertanyaanLengkung markout INTC, 10 Jun 2026, diukur daripada dua asas rujukan
SQL tepat di sebalik setiap nombor
WITH
    mid_by_second AS
    (
        SELECT
            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'INTC'
          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY sec
    ),
    signed_fills AS
    (
        SELECT
            t.sec        AS sec,
            t.fill_price AS fill_price,
            q.mid        AS ref_mid,
            if(t.fill_price > q.mid, 1, -1) AS side
        FROM
        (
            SELECT
                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
                sec - 1          AS ref_sec,
                toFloat64(price) AS fill_price
            FROM global_markets.stocks_trades
            WHERE ticker = 'INTC'
              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')
              AND price > 0
              AND size > 0
        ) AS t
        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
        WHERE t.fill_price != q.mid
    )
SELECT
    multiIf(f.horizon_s < 60,
            concat(toString(f.horizon_s), ' sec'),
            concat(toString(intDiv(f.horizon_s, 60)), ' min'))              AS horizon,
    round(avg(f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3)       AS mid_basis_bps,
    round(avg(f.side * (fut.mid - f.fill_price) / f.fill_price) * 10000, 3) AS fill_basis_bps,
    count()                                                                 AS fill_count
FROM
(
    SELECT
        sec,
        fill_price,
        ref_mid,
        side,
        horizon_s,
        sec + horizon_s AS future_sec
    FROM signed_fills
    ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s
) AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.horizon_s
ORDER BY f.horizon_s
Run this yourself

Merentasi 900593 transaksi yang dikelaskan, siri asas harga pertengahan mencatatkan 3.068 mata asas pada 1 sec dan 2.977 mata asas pada 5 min. Satu mata asas adalah satu peratus daripada satu peratus harga, jadi satu transaksi hanya menggerakkan ralat pembundaran manakala sejuta saham menggerakkan wang sebenar.

Siri asas transaksi bermula pada -0.488 mata asas. Jarak antara kedua-dua siri pada tempoh masa terpendek ialah separuh spread berkesan: sejauh mana print tersebut mendarat dari harga pertengahan. Pihak pengambil (taker) membayar jumlah itu semasa masuk dan pihak pembuat (maker) memperolehnya. Segala-galanya selepas tempoh pertama adalah pergerakan pasaran.

Saiz transaksi dan bentuk keluk

Adverse selection tidak mendarat secara sekata merentasi semua transaksi. Membahagikan sesi yang sama mengikut saiz print meletakkan transaksi kecil dan blok seribu saham atau lebih pada paksi yang sama.

PertanyaanLengkung yang sama, dibahagikan mengikut saiz cetakan: isian kecil berbanding blok
SQL tepat di sebalik setiap nombor
WITH
    mid_by_second AS
    (
        SELECT
            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'INTC'
          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY sec
    ),
    signed_fills AS
    (
        SELECT
            t.sec        AS sec,
            t.fill_size  AS fill_size,
            q.mid        AS ref_mid,
            if(t.fill_price > q.mid, 1, -1) AS side
        FROM
        (
            SELECT
                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
                sec - 1          AS ref_sec,
                toFloat64(price) AS fill_price,
                size             AS fill_size
            FROM global_markets.stocks_trades
            WHERE ticker = 'INTC'
              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')
              AND price > 0
              AND size > 0
        ) AS t
        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
        WHERE t.fill_price != q.mid
    )
SELECT
    multiIf(f.horizon_s < 60,
            concat(toString(f.horizon_s), ' sec'),
            concat(toString(intDiv(f.horizon_s, 60)), ' min'))                                   AS horizon,
    round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size < 1000) * 10000, 3)       AS small_fill_bps,
    round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size >= 1000) * 10000, 3)      AS block_fill_bps,
    countIf(f.fill_size >= 1000)                                                                 AS block_fill_count
FROM
(
    SELECT
        sec,
        fill_size,
        ref_mid,
        side,
        horizon_s,
        sec + horizon_s AS future_sec
    FROM signed_fills
    ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s
) AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.horizon_s
HAVING countIf(f.fill_size < 1000) > 0
   AND countIf(f.fill_size >= 1000) > 0
ORDER BY f.horizon_s
Run this yourself

Pada tempoh 5 min, print di bawah seribu saham mencatatkan purata 2.983 mata asas, manakala 11588 print seribu saham atau lebih mencatatkan purata 2.495. Dua sebut harga yang memenuhi jumlah volum yang sama terhadap kedua-dua kumpulan tersebut tidak berakhir pada kedudukan yang sama pada penghujung hari.

Bagaimana markout menjadi angka spread dalam laporan pelaksanaan

Markout adalah istilah yang hilang dalam penguraian spread standard. Spread berkesan ialah apa yang sebenarnya dibayar oleh pengambil: dua kali ganda jarak bertanda dari harga pertengahan ke print. Bahagikan itu kepada dua. Satu bahagian ialah realized spread, apa yang disimpan oleh pembuat sebaik sahaja pasaran bergerak. Bahagian lain ialah adverse selection, iaitu markout asas harga pertengahan didarab dengan dua. Identitinya tepat: effective spread = realized spread + adverse selection.

PertanyaanPecahan spread berkesan kepada spread terealisasi dan pemilihan buruk, mengikut setengah jam
SQL tepat di sebalik setiap nombor
WITH
    mid_by_second AS
    (
        SELECT
            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'INTC'
          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY sec
    ),
    signed_fills AS
    (
        SELECT
            t.sec + 60   AS future_sec,
            t.et_time    AS et_time,
            t.fill_price AS fill_price,
            q.mid        AS ref_mid,
            if(t.fill_price > q.mid, 1, -1) AS side
        FROM
        (
            SELECT
                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,
                sec - 1          AS ref_sec,
                toFloat64(price) AS fill_price,
                formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), toIntervalMinute(30)), '%H:%i') AS et_time
            FROM global_markets.stocks_trades
            WHERE ticker = 'INTC'
              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')
              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')
              AND price > 0
              AND size > 0
        ) AS t
        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec
        WHERE t.fill_price != q.mid
    )
SELECT
    f.et_time                                                                  AS et_time,
    round(avg(2 * f.side * (f.fill_price - f.ref_mid) / f.ref_mid) * 10000, 3) AS effective_spread_bps,
    round(avg(2 * f.side * (f.fill_price - fut.mid) / f.ref_mid) * 10000, 3)   AS realized_spread_bps,
    round(avg(2 * f.side * (fut.mid - f.ref_mid) / f.ref_mid) * 10000, 3)      AS adverse_selection_bps,
    count()                                                                    AS fill_count
FROM signed_fills AS f
INNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec
GROUP BY f.et_time
ORDER BY f.et_time
Run this yourself

Dalam tempoh setengah jam bermula 09:30 waktu Timur, effective spread mencatatkan purata 10.651 mata asas, yang mana 8.313 adalah istilah adverse selection pada tempoh enam puluh saat dan 2.338 adalah apa yang dikekalkan oleh pembuat. Panel ini meliputi 13 baldi setengah jam.

Komponen tersebut adalah kuantiti yang diringkaskan mengikut tempat dalam laporan pelaksanaan Rule 605 dan 606, dan ia merupakan aritmetik di sebalik tuntutan penambahbaikan harga yang bergantung pada peraturan sub-penny dan penambahbaikan harga. Rebat adalah kredit tetap setiap saham. Adverse selection adalah kos berubah setiap saham pada transaksi yang sebenarnya diterima oleh sebut harga. Menimbang satu dengan yang lain merentasi keluk yang diukur, bukannya melalui kad kadar tajuk utama, adalah pemeriksaan di sebalik yuran dan rebat maker-taker, dan ia terletak bersama mekanik dalam mengapa market maker kehilangan wang.

Bagaimana angka ini dikira

Setiap panel membaca sebut harga dan print INTC daripada sesi biasa 10 Jun 2026, 09:30 hingga 16:00 waktu Timur. Sebut harga diruntuhkan kepada satu harga pertengahan setiap saat, yang terakhir dicetak dalam saat itu. Print dikelaskan sebagai dimulakan oleh pembeli apabila ia mendarat di atas harga pertengahan saat sebelumnya dan dimulakan oleh penjual apabila ia mendarat di bawah, yang merupakan peraturan sebut harga standard. Print yang berada tepat pada harga pertengahan tersebut digugurkan dan bukannya diteka, jadi pelaksanaan pada titik tengah berada di luar sampel. Menggunakan harga pertengahan saat sebelumnya sebagai rujukan menghalang rujukan daripada melihat ke hadapan. Tempoh masa adalah saat penuh yang dikira dari saat print, dan transaksi hanya memasuki tempoh masa apabila sebut harga wujud dalam saat sasaran.

Soalan Lazim

Apakah itu markout dalam perdagangan?

Markout ialah perubahan bertanda dalam harga pertengahan sepanjang tempoh masa tetap selepas sesuatu transaksi. Nilai positif bermakna pasaran bergerak ke arah perdagangan anda selepas anda mendapat transaksi tersebut. Nilai negatif bermakna ia bergerak ke arah sebaliknya, yang merupakan definisi adverse selection.

Adakah markout negatif sentiasa bermakna transaksi yang buruk?

Tidak. Markout negatif pada satu saat bagi pesanan boleh pasaran (marketable order) kebanyakannya adalah spread yang dibayar oleh pesanan tersebut, iaitu harga untuk diselesaikan dengan segera. Apa yang lebih penting ialah sama ada keluk tersebut terus jatuh pada tempoh masa yang lebih lama atau menjadi rata.

Apakah perbezaan antara markout dan slippage?

Slippage membandingkan transaksi dengan harga keputusan atau harga ketibaan, jadi ia menilai keseluruhan laluan sesuatu pesanan. Markout membandingkan transaksi dengan harga pertengahan pada tempoh masa selepas transaksi, jadi ia menilai apa yang berlaku seterusnya. Satu memberi skor kepada pesanan induk, yang satu lagi memberi skor kepada transaksi individu.

Tempoh masa manakah yang perlu digunakan oleh markout?

Ia bergantung kepada tujuan transaksi tersebut. Tempoh masa bawah satu saat menilai pelaksanaan yang sensitif terhadap kependaman, manakala satu minit adalah lalai biasa untuk adverse selection pada nama yang cair. Menerbitkan tempoh masa di sebelah angka adalah perkara yang menjadikan dua markout boleh dibandingkan.

Bagaimanakah markout berkaitan dengan effective spread?

Effective spread terbahagi kepada realized spread ditambah komponen adverse selection, dan komponen itu adalah markout asas harga pertengahan didarab dengan dua. Tukar tempoh masa dan pembahagian antara kedua-duanya akan berubah bersamanya, itulah sebabnya statistik spread yang diterbitkan tidak lengkap tanpa tempoh masanya disertakan.


Setiap panel di sini dihantar bersama SQL yang menghasilkannya. Buka satu, tukar ticker atau tarikh, dan keluk markout yang sama akan dibina semula dari awal pada terminal Strasmore.