Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

ట్రేడ్ Markout అంటే ఏమిటి? Execution Quality వివరణ

ట్రేడ్ markout అర్థం, sign convention, adverse selectionను సులభంగా తెలుసుకోండి. ఒక సెకను నుంచి ఐదు నిమిషాల వరకు నిజమైన markout curve కొలతను చూడండి.

ట్రేడ్ markout అనేది ఒక trade fill అయిన క్షణం నుంచి నిర్ణయించిన కాలవ్యవధిలో mid priceలో వచ్చిన మార్పు. ఇది ఆ fill print అయిన సమయాన్ని ఆధారంగా కొలుస్తారు. ట్రేడ్ తర్వాత మార్కెట్ మీకు అనుకూలంగా కదిలితే విలువ positiveగా ఉంటుంది. వ్యతిరేకంగా కదిలితే negativeగా ఉంటుంది. ట్రేడింగ్ డెస్క్‌లు దీనిని adverse selectionగా పిలుస్తాయి. మీరు ఎంచుకునే కాలవ్యవధి—ఒక సెకను లేదా ఐదు నిమిషాలు—ఆ సంఖ్య ఏ ప్రశ్నకు సమాధానం ఇస్తుందో నిర్ణయిస్తుంది.

ట్రేడ్ markout అంటే ఏమిటి?

ముందుగా mid priceను తీసుకోండి. ఇది అత్యుత్తమ bid మరియు అత్యుత్తమ offer మధ్య బిందువు. అంటే NBBO యొక్క midpoint. మీరు fill పొందిన తర్వాత ఎంచుకున్న కాలవ్యవధిలోని mid నుంచి reference priceను తీసివేసి, మీరు చేసిన ట్రేడ్ వైపు ఆధారంగా ఫలితానికి sign ఇస్తే అది markout అవుతుంది.

**horizon h వద్ద markout = side * (t+h వద్ద mid - reference price)**. ఇక్కడ మీరు కొనుగోలు చేసినట్లయితే side విలువ plus one, విక్రయించినట్లయితే minus one.

సాధారణంగా గందరగోళం sign convention వద్దే ఉంటుంది. మీరు కొనుగోలు చేసిన తర్వాత mid పడిపోతే markout negativeగా ఉంటుంది. మీరు కొనుగోలు చేశారు, ధర పడిపోయింది, కాబట్టి మీకు విక్రయించిన పక్షానికి ఆ ట్రేడ్‌లో మెరుగైన ధర లభించింది. ఇది adverse selectionను సంఖ్య రూపంలో చూపిస్తుంది. మీరు విక్రయించిన తర్వాత mid పడిపోతే markout positiveగా ఉంటుంది, ఎందుకంటే side మారడంతో sign కూడా మారుతుంది. ప్రతి fillకు రెండు పక్షాలు ఉంటాయి. ఒక పక్షం markoutకు, మరొక పక్షం markout sign మార్చిన విలువగా ఉంటుంది.

మూడు reference prices

మీరు తీసివేసే reference price markout ఏ విషయాన్ని కొలుస్తుందో నిర్ణయిస్తుంది.

  • Fill price. Markout నగదు విలువను చూపుతుంది: మీరు చెల్లించిన ధరతో పోలిస్తే t+h వద్ద ఆ position విలువ ఎంత ఉందో. మీరు చెల్లించిన లేదా సంపాదించిన spread ఇందులో భాగంగా ఉంటుంది.
  • Fill అయిన క్షణంలోని mid. ఇది spread ప్రభావాన్ని తొలగించి, మీరు ట్రేడ్ చేసిన తర్వాత మార్కెట్ ఎలా కదిలిందో మాత్రమే చూపిస్తుంది. Adverse selectionను అత్యంత స్పష్టంగా కొలిచే విధానం ఇదే.
  • మీరు ట్రేడ్ చేసిన వైపు quote. మీరు తీసుకున్న touch లేదా మీరు పెట్టిన touchతో పోల్చి కొలిస్తే, fill నిజంగా అందుబాటులో ఉన్న ధరతో ఎలా పోలుస్తుందో తెలుస్తుంది.

Execution quality విశ్లేషణలో adverse selection కోసం రెండో విధానాన్ని, profit and loss కోసం మొదటి విధానాన్ని ఉపయోగిస్తారు. క్రింది మొదటి panelలో ఒకే fills సమూహంపై ఈ రెండు విధానాలు కనిపిస్తాయి.

Markout curve మరియు దాని ఆకారం చెప్పే విషయం

అదే statisticను అనేక కాలవ్యవధుల్లో లెక్కిస్తే ఒక curve లభిస్తుంది. దాని ఆకారం ఏకైక సంఖ్యకంటే ఎక్కువ సమాచారాన్ని అందిస్తుంది.

  • మొదటి సెకనులో curve వేగంగా పడిపోయి, తరువాత కూడా దిగువనే ఉంటే flowను ఇతరులు ముందుగానే గుర్తించి ఉపయోగించుకున్నారని అర్థం. Fill అయిన వెంటనే ధర దానికి వ్యతిరేకంగా కదిలింది.
  • Curve అనేక నిమిషాల పాటు పడిపోతూ ఉంటే, ధర ఎటు వెళ్లబోతోందనే దిశపై flowలో నిజమైన సమాచారం ఉందని అర్థం.
  • Zeroకు సమీపంలో flatగా ఉన్న curve benign flowను సూచిస్తుంది. ఐదు నిమిషాల తర్వాత mid, fill సమయంలో ఉన్నట్లుగానే కనిపిస్తుంది.
  • Curve మొదట negativeగా ఉండి, తరువాత zero వైపు పెరుగుతుంటే rebates పొందే passive market maker కోరుకునే ఆకారం అదే. ప్రారంభ పతనం spreadతో పాటు తక్షణ market impactను చూపిస్తుంది. తరువాతి recovery మార్కెట్ తిరిగి రావడాన్ని సూచిస్తుంది.

కాలవ్యవధి ఎంపిక మీరు ఏ విషయాన్ని కొలుస్తున్నారనే నిర్ణయమే. ఒక సెకను కంటే తక్కువ కాలవ్యవధిలో markout ప్రధానంగా latency మరియు queue positionను చూపిస్తుంది. దాన్ని ఒక నిమిషానికి పెంచితే flowలోని స్వల్పకాలిక సమాచారాన్ని చూపిస్తుంది. ఐదు నిమిషాలు దాటిన తర్వాత సాధారణ market drift ప్రభావం fill ప్రభావాన్ని కప్పివేయడం ప్రారంభిస్తుంది.

నిజమైన markout curve: ప్రతి fill ఆధారంగా

క్రింది panelలో June 10, 2026 regular sessionలోని ప్రతి INTC printను తీసుకున్నారు. Printకు ముందు ఉన్న ఒక సెకను చివరి quoteతో పోల్చి, ప్రతి printను buy initiated లేదా sell initiatedగా వర్గీకరించారు. అనంతరం signed markoutను 5 కాలవ్యవధుల్లో సగటు చేశారు. ఒకే fills సమూహంపై రెండు series ఉన్నాయి. ఒకటి fill సమయంలోని mid నుంచి, మరొకటి fill price నుంచి కొలిచారు.

క్వెరీINTC మార్క్‌అవుట్ వక్రం, 2026 జూన్ 10, రెండు సూచనా ఆధారాల నుంచి కొలిచినది
ప్రతి సంఖ్య వెనుక ఉన్న ఖచ్చితమైన SQL
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

900593 వర్గీకరించిన fillsలో mid basis series, 1 sec వద్ద 3.068 basis pointsగా, 5 min వద్ద 2.977 basis pointsగా నమోదైంది. ఒక basis point అనేది ధరలో ఒక శాతంలో వందో వంతు. కాబట్టి ఒక fillలోని మార్పు rounding error స్థాయిలో ఉండవచ్చు, కానీ ఒక మిలియన్ షేర్లపై అది వాస్తవ నగదుగా మారుతుంది.

Fill basis series -0.488 basis points వద్ద ప్రారంభమవుతుంది. అత్యల్ప కాలవ్యవధిలో రెండు seriesల మధ్య దూరమే effective half spread. అంటే print mid నుంచి ఎంత దూరంలో అమలైందో అది. Taker ప్రవేశించే సమయంలో ఈ మొత్తాన్ని చెల్లిస్తాడు; maker దాన్ని సంపాదిస్తాడు. మొదటి కాలవ్యవధి తర్వాత కనిపించేది మార్కెట్ కదలిక.

Fill size మరియు curve ఆకారం

Adverse selection అన్ని fillsపై సమానంగా ఉండదు. అదే sessionను print size ఆధారంగా విభజిస్తే, చిన్న fills మరియు వెయ్యి షేర్లు లేదా అంతకంటే ఎక్కువ ఉన్న blocksను ఒకే axesపై పోల్చవచ్చు.

క్వెరీఅదే వక్రం, ప్రింట్ పరిమాణం ఆధారంగా విభజన: చిన్న ఫిల్‌లు బ్లాక్‌లకు వ్యతిరేకంగా
ప్రతి సంఖ్య వెనుక ఉన్న ఖచ్చితమైన SQL
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

5 min కాలవ్యవధిలో, వెయ్యి షేర్ల కంటే తక్కువ ఉన్న prints సగటున 2.983 basis pointsగా నమోదయ్యాయి. వెయ్యి షేర్లు లేదా అంతకంటే ఎక్కువ ఉన్న 11588 prints సగటు 2.495. ఈ రెండు సమూహాలకు వ్యతిరేకంగా ఒకే మొత్తం volumeను నింపే రెండు quotes రోజు ముగిసే సమయానికి ఒకే ఫలితాన్ని ఇవ్వవు.

Execution reportsలో markouts ఎలా spread సంఖ్యలుగా మారతాయి

ప్రామాణిక spread decompositionలో markout ఒక కీలకమైన పదం. Effective spread అనేది taker వాస్తవంగా చెల్లించిన spread. ఇది print మరియు mid మధ్య signed distanceకు రెండింతలు. దాన్ని రెండు భాగాలుగా విభజించండి. ఒక భాగం realized spread. అంటే మార్కెట్ కదిలిన తర్వాత maker వద్ద మిగిలేది. మరొక భాగం adverse selection. ఇది mid basis markoutకు రెండింతలు. ఈ సమీకరణ ఖచ్చితమైనది: effective spread = realized spread + adverse selection.

క్వెరీఎఫెక్టివ్ స్ప్రెడ్‌ను రియలైజ్డ్ స్ప్రెడ్ మరియు అడ్వర్స్ సెలెక్షన్‌గా అరగంటల వారీగా విభజన
ప్రతి సంఖ్య వెనుక ఉన్న ఖచ్చితమైన SQL
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

09:30 Eastern నుంచి ప్రారంభమయ్యే అరగంటలో effective spread సగటున 10.651 basis pointsగా ఉంది. అందులో అరవై సెకన్ల కాలవ్యవధిలో adverse selection భాగం 8.313, maker వద్ద మిగిలిన భాగం 2.338. ఈ panelలో 13 అరగంట buckets ఉన్నాయి.

ఈ componentsను venue వారీగా Rule 605 మరియు 606 execution reportsలో సంక్షిప్తంగా చూపిస్తారు. sub penny rule మరియు price improvement ఆధారంగా చేసే price improvement వాదనల వెనుక ఉన్న గణితం కూడా ఇదే. Rebate అనేది ప్రతి షేరుకు ఇచ్చే స్థిర credit. Adverse selection అనేది quote వాస్తవంగా పొందిన fillsపై ప్రతి షేరుకు మారే cost. Headline rate cardపై కాకుండా కొలిచిన curveపై ఈ రెండింటిని పరస్పరం తూకం వేయడం maker taker fees మరియు rebatesను అంచనా వేసే విధానం. ఇది market makers ఎందుకు నష్టపోతారు అనే అంశంలోని mechanicsకు తోడుగా ఉంటుంది.

:::detailsఈ సంఖ్యలు ఎలా లెక్కించబడ్డాయి
ప్రతి panel June 10, 2026 regular sessionలో 09:30 నుంచి 16:00 Eastern వరకు ఉన్న INTC quotes మరియు printsను ఉపయోగిస్తుంది. Quotesను ప్రతి సెకనుకు ఒక midగా సమీకరించారు. ఆ సెకనులో చివరిగా నమోదైన quoteను ఉపయోగించారు. Print మునుపటి సెకనులోని mid కంటే పైగా నమోదైతే buy initiatedగా, దాని కంటే దిగువన నమోదైతే sell initiatedగా వర్గీకరించారు. ఇది ప్రామాణిక quote rule. సరిగ్గా ఆ midపైనే నమోదైన printsను అంచనా వేయకుండా sample నుంచి తొలగించారు. అందువల్ల midpoint executions sampleలో లేవు. మునుపటి సెకను midను referenceగా ఉపయోగించడం వల్ల reference భవిష్యత్ సమాచారాన్ని ఉపయోగించదు. కాలవ్యవధులను print జరిగిన సెకను నుంచి లెక్కించిన పూర్తి సెకన్లుగా తీసుకున్నారు. Target secondలో quote ఉన్నప్పుడు మాత్రమే fill ఆ కాలవ్యవధిలోకి చేర్చారు.
:::

తరచుగా అడిగే ప్రశ్నలు

Tradingలో markout అంటే ఏమిటి?

Markout అనేది fill అయిన తర్వాత నిర్ణయించిన కాలవ్యవధిలో mid priceలో వచ్చిన signed change. మీరు fill పొందిన తర్వాత మార్కెట్ మీ ట్రేడ్ దిశలో కదిలితే ఇది positiveగా ఉంటుంది. వ్యతిరేకంగా కదిలితే negativeగా ఉంటుంది. ఇదే adverse selectionకు నిర్వచనం.

Negative markout ఎప్పుడూ చెడు fillనే సూచిస్తుందా?

లేదు. Marketable orderకు ఒక సెకను వద్ద కనిపించే negative markout ఎక్కువగా ఆ order తక్షణంగా అమలవడానికి చెల్లించిన spreadను సూచిస్తుంది. Curve దీర్ఘకాలవ్యవధుల్లో కూడా పడిపోతుందా, లేక flatగా మారుతుందా అనేదే ముఖ్యమైన విషయం.

Markout మరియు slippage మధ్య తేడా ఏమిటి?

Slippage ఒక fillను decision price లేదా arrival priceతో పోలుస్తుంది. అందువల్ల అది order మొత్తం ప్రయాణాన్ని అంచనా వేస్తుంది. Markout ఒక fillను fill తర్వాత నిర్దిష్ట కాలవ్యవధిలోని midతో పోలుస్తుంది. కాబట్టి తరువాత ఏమి జరిగిందో అంచనా వేస్తుంది. ఒకటి parent orderను, మరొకటి వ్యక్తిగత fillను కొలుస్తుంది.

Markoutకు ఏ కాలవ్యవధిని ఉపయోగించాలి?

ఇది fill ఉద్దేశంపై ఆధారపడి ఉంటుంది. ఒక సెకను కంటే తక్కువ కాలవ్యవధులు latency-sensitive executionను అంచనా వేస్తాయి. Liquid namesలో adverse selection కోసం ఒక నిమిషం సాధారణ default. రెండు markouts‌ను పోల్చాలంటే సంఖ్య పక్కనే కాలవ్యవధిని ప్రచురించాలి.

Markoutకు effective spreadతో సంబంధం ఏమిటి?

Effective spread, realized spread మరియు adverse selection componentగా విభజించబడుతుంది. ఆ component mid basis markoutకు రెండింతలు. కాలవ్యవధిని మార్చితే ఈ రెండు భాగాల మధ్య విభజన కూడా మారుతుంది. అందుకే కాలవ్యవధి లేకుండా ప్రచురించిన spread statistic అసంపూర్ణం.


ఇక్కడి ప్రతి panelను రూపొందించిన SQLతో పాటు అందించబడుతుంది. ఒకదాన్ని తెరిచి ticker లేదా తేదీని మార్చండి. Strasmore terminalలో అదే markout curveను మొదటి నుంచి మళ్లీ రూపొందించవచ్చు.