Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Trade Markout: Paliwanag sa Execution Quality

Alamin kung ano ang trade markout, paano basahin ang sign convention, at paano sinusukat ang adverse selection sa markout curve mula one second hanggang five minutes.

Ang trade markout ay ang pagbabago sa mid price sa loob ng itinakdang horizon pagkatapos ma-fill ang trade, na sinusukat mula sa sandaling na-print ang fill. Positibo ito kapag gumalaw ang merkado pabor sa iyo pagkatapos ng trade. Negatibo ito kapag gumalaw laban sa iyo; ito ang tinatawag ng mga trading desk na adverse selection. Ang piniling horizon—one second o five minutes—ang nagtatakda kung anong tanong ang sinasagot ng numero.

Ano ang trade markout?

Magsimula sa mid price: ang kalahating punto sa pagitan ng best bid at best offer, ang midpoint ng NBBO. Kinukuha ng markout ang mid sa napiling horizon pagkatapos ng fill, ibinabawas dito ang reference price, at nilalagyan ng sign ayon sa panig ng trade.

**markout at horizon h = side * (mid sa t+h - reference price)**, kung saan ang side ay plus one kapag bumili ka at minus one kapag nagbenta ka.

Dito karaniwang nagmumula ang kalituhan: ang sign convention. Kapag bumagsak ang mid pagkatapos ng buy, negatibo ang markout. Bumili ka, bumaba ang presyo, at mas nakinabang sa trade ang nagbenta sa iyo. Iyon ang adverse selection na ipinahayag bilang numero. Kapag bumagsak ang mid pagkatapos ng sell, positibo ang markout dahil nagbabago ang sign ayon sa panig ng trade. May dalawang panig ang bawat fill, at ang markout ng isang panig ay ang markout ng kabilang panig na baligtad ang sign.

Ang tatlong reference price

Ang reference price na ibinabawas mo ang nagtatakda kung ano ang sinusukat ng markout.

  • Ang fill price. Nagiging halaga sa pera ang markout: magkano ang halaga ng position sa t+h kumpara sa binayaran mo. Kasama rito ang spread na binayaran o kinita.
  • Ang mid sa sandali ng fill. Inaalis nito ang spread at hinihiwalay ang galaw ng merkado pagkatapos ng trade. Ito ang pinakamalinaw na sukatan ng adverse selection.
  • Ang quote sa panig ng trade. Ang pagsukat laban sa touch na kinuha mo o sa touch na ipinost mo ay nagpapakita kung paano ikinumpara ang fill sa presyong aktuwal na available.

Sa pagsusuri ng execution quality, ginagamit ang ikalawa para sa adverse selection at ang una para sa profit and loss. Pareho silang makikita sa unang panel sa ibaba, gamit ang iisang set ng fills.

Ang markout curve at kahulugan ng hugis nito

Kapag isinagawa ang parehong statistic sa maraming horizon, makakakuha ka ng curve. Mas marami ang ipinahihiwatig ng hugis nito kaysa sa isang numero lamang.

  • Ang curve na mabilis bumabagsak sa loob ng unang second at nananatiling mababa ay nagpapakitang napipili at napapakinabangan ang flow laban sa fill: halos agad gumagalaw ang presyo laban dito.
  • Ang curve na patuloy na bumabagsak nang ilang minuto ay nagpapakitang may tunay na impormasyon ang flow tungkol sa direksiyon ng presyo.
  • Ang patag na curve na malapit sa zero ay nagpapakitang benign ang flow. Pagkalipas ng five minutes, katulad pa rin ng mid sa oras ng fill ang presyo.
  • Ang curve na nagsisimula sa negatibo at umaakyat pabalik sa zero ay ang hugis na hinahanap ng passive maker na kumokolekta ng rebates. Ang maagang pagbaba ay ang spread kasama ng agarang impact, at ang pagbawi ay ang pagbabalik ng merkado.

Ang pagpili ng horizon ay desisyon din tungkol sa sinusukat mo. Kapag mas maikli sa one second, pangunahing sinusukat ng markout ang latency at queue position. Kapag ini-extend ito sa one minute, sinusukat nito ang short term na impormasyon sa flow. Paglampas ng five minutes, maaaring matabunan na ng karaniwang market drift ang mismong epekto ng fill.

Isang aktuwal na markout curve, fill bawat fill

Kinukuha ng panel sa ibaba ang bawat INTC print mula sa regular session noong June 10, 2026. Tinutukoy nito kung buy initiated o sell initiated ang bawat print batay sa huling quote ng second bago ito na-print, at kinakalkula ang average na signed markout sa 5 horizons. Dalawang series ang gumagamit ng magkaparehong fills: ang isa ay sinusukat mula sa mid sa oras ng fill, at ang isa ay mula sa fill price.

QueryINTC markout curve, Hunyo 10 2026, sinusukat mula sa dalawang reference base
Ang eksaktong SQL sa likod ng bawat numero
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

Sa 900593 classified fills, ang mid basis series ay nasa 3.068 basis points sa 1 sec at 2.977 basis points sa 5 min. Ang basis point ay one hundredth ng one percent ng presyo. Kaya ang galaw ng isang fill ay maaaring rounding error lamang, habang ang galaw sa isang million shares ay may tunay na halaga sa pera.

Nagsisimula ang fill basis series sa -0.488 basis points. Ang pagitan ng dalawang series sa pinakamaikling horizon ay ang effective half spread: kung gaano kalayo ang print mula sa mid. Iyan ang binabayaran ng taker sa pagpasok at kinikita ng maker. Ang lahat ng nangyayari pagkatapos ng unang horizon ay galaw na ng merkado.

Laki ng fill at hugis ng curve

Hindi pantay ang adverse selection sa lahat ng fills. Kapag hinati ang parehong session ayon sa laki ng print, makikita sa parehong axes ang maliliit na fills at blocks na may thousand shares o higit pa.

QueryParehong curve, hinati ayon sa print size: small fills kumpara sa blocks
Ang eksaktong SQL sa likod ng bawat numero
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

Sa 5 min horizon, ang prints na mas mababa sa thousand shares ay may average na 2.983 basis points, habang ang 11588 prints na thousand shares o higit pa ay may average na 2.495. Kapag pinunan ng dalawang quote ang parehong kabuuang volume laban sa dalawang grupong ito, hindi sila magtatapos sa parehong resulta sa pagtatapos ng araw.

Paano nagiging spread numbers sa execution reports ang markouts

Ang markout ang nawawalang termino sa standard spread decomposition. Ang effective spread ang aktuwal na binayaran ng taker: dalawang beses ng signed distance mula sa mid hanggang sa print. Hatiin ito sa dalawa. Ang isang bahagi ay realized spread, o ang natitira sa maker matapos gumalaw ang merkado. Ang isa pa ay adverse selection, na katumbas ng mid basis markout na minultiply sa two. Eksakto ang identity: effective spread = realized spread + adverse selection.

QueryEffective spread na hinati sa realized spread at adverse selection, bawat kalahating oras
Ang eksaktong SQL sa likod ng bawat numero
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

Sa half hour na nagsisimula sa 09:30 Eastern, ang average effective spread ay 10.651 basis points. Dito, 8.313 ang adverse selection term sa sixty second horizon at 2.338 ang napapanatili ng maker. Saklaw ng panel ang 13 half hour buckets.

Ang mga component na ito ang mga quantity na ibinubuod venue bawat venue sa Rule 605 at 606 execution reports. Sila rin ang arithmetic sa likod ng mga claim tungkol sa price improvement na kaugnay ng sub penny rule at price improvement. Ang rebate ay fixed credit bawat share. Ang adverse selection ay variable cost bawat share sa mga fill na aktuwal na natatanggap ng isang quote. Ang pagtitimbang sa dalawa gamit ang sinusukat na curve, sa halip na headline rate card lamang, ang pagsusuring nasa likod ng maker taker fees at rebates, at kaugnay ito ng mechanics sa kung bakit nalulugi ang market makers.

Paano kinalkula ang mga numerong ito

Ang bawat panel ay gumagamit ng INTC quotes at prints mula sa regular session noong June 10, 2026, mula 09:30 hanggang 16:00 Eastern. Pinagsasama ang quotes sa isang mid bawat second, gamit ang huling na-print sa loob ng second na iyon. Itinuturing na buy initiated ang print kapag nag-land ito sa itaas ng mid ng nakaraang second, at sell initiated kapag nag-land ito sa ibaba. Ito ang standard quote rule. Inaalis ang prints na eksaktong nasa mid upang hindi manghula; kaya hindi kasama sa sample ang midpoint executions. Ang paggamit sa mid ng nakaraang second bilang reference ay pumipigil sa pagtingin sa hinaharap. Ang horizons ay buong seconds na binibilang mula sa second ng print. Kasama lamang ang fill sa isang horizon kapag may quote sa target second.

FAQ

Ano ang markout sa trading?

Ang markout ay ang signed change sa mid price sa loob ng fixed horizon pagkatapos ng fill. Positibo ito kapag gumalaw ang merkado ayon sa direksiyon ng trade pagkatapos ma-fill. Negatibo ito kapag gumalaw sa kabilang direksiyon, na siyang depinisyon ng adverse selection.

Palaging masamang fill ba ang negative markout?

Hindi. Ang negative markout sa one second para sa marketable order ay kadalasang spread na binayaran ng order. Ito ang presyo ng agarang execution. Mas mahalaga kung patuloy na bumabagsak ang curve sa mas mahahabang horizon o kung pumapatag ito.

Ano ang pagkakaiba ng markout at slippage?

Ikinukumpara ng slippage ang fill sa decision price o arrival price, kaya sinusuri nito ang buong path ng order. Ikinukumpara naman ng markout ang fill sa mid sa isang horizon pagkatapos ng fill, kaya sinusuri nito ang sumunod na galaw. Sinusukat ng isa ang parent order, habang sinusukat ng isa ang indibidwal na fill.

Anong horizon ang dapat gamitin sa markout?

Depende ito sa layunin ng fill. Sinusuri ng sub second horizons ang latency sensitive execution, habang ang one minute ang karaniwang default para sa adverse selection sa liquid names. Ang paglalagay ng horizon katabi ng numero ang dahilan kung bakit maihahambing ang dalawang markout.

Paano nauugnay ang markout sa effective spread?

Nahahati ang effective spread sa realized spread at adverse selection component. Ang component na ito ay ang mid basis markout na minultiply sa two. Kapag binago ang horizon, nagbabago rin ang hati sa pagitan ng dalawa. Kaya hindi kumpleto ang published spread statistic kung walang kalakip na horizon.


May SQL na gumawa sa bawat panel dito. Buksan ang isa, palitan ang ticker o petsa, at muling mabubuo mula sa simula ang parehong markout curve sa Strasmore terminal.