Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Market Makersना Adverse Selectionमुळे तोटा का होतो?

Market makersना adverse selectionमुळे तोटा का होतो ते जाणून घ्या. Markout curves त्याचे मापन कसे करतात, तसेच inventory risk आणि queue position costs समजून घ्या.

Market makersना adverse selectionमुळे तोटा होतो: offer उचलणारा trader अनेकदा तो offer stale असल्याचे आधीच जाणणारा असतो. प्रत्येक fillची सुरुवात साधारणतः spreadच्या निम्म्या रकमेइतक्या छोट्या creditने होते. त्यानंतरच्या काही सेकंदांत त्या creditपैकी किती टिकतो हे ठरते. यासाठी markout हे मापन वापरले जाते. Fillनंतर ठरावीक कालावधीनंतर झालेला, दिशेसह नोंदवलेला किंमतबदल म्हणजे markout. खालील panels trade आणि quote printsमधून वास्तविक markout curves तयार करतात. त्याच ledgerच्या revenue बाजूवर आमचा market makers पैसे कसे कमावतात हा companion लेख आहे.

Tradingमध्ये adverse selection म्हणजे काय?

Market maker एकाच वेळी दोन किंमती पोस्ट करतो: खरेदीसाठी bid आणि विक्रीसाठी offer. दोन्ही ठरावीक आकारासाठी वैध असतात. त्यांच्यातील अंतर म्हणजे bid ask spread, आणि या व्यवसायाचा आधार साधी गणिती रचना आहे. Bidवर खरेदी करा, offerवर विक्री करा आणि दिवसाला हजारो वेळा हे पुन्हा करा. सरासरी round tripमध्ये spreadच्या जवळपासची रक्कम मिळते.

या गणितात दोन्ही बाजूंवरील व्यवहार समतोल असतील असे गृहित धरले जाते. प्रत्यक्षात तसे नसते. Resting quote हा एक standing option असतो. कोणताही trader आपल्या सोयीच्या क्षणी तो exercise करू शकतो. बाजारावर सर्वाधिक लक्ष ठेवणारे traders सर्वोत्तम क्षण निवडतात. मोठ्या parent orderवर काम करणारा fund offer स्वस्त असेपर्यंत खरेदी करत राहतो. Correlated instrumentमध्ये हालचाल झाल्याचे आधीच पाहिलेली प्रणाली अजून repriced न झालेली बाजू घेते.

या मिश्रणातील झुकावाला adverse selection म्हणतात. Makerला मिळणारे fills त्यांना सर्वाधिक हवे असलेल्या tradersकडे झुकलेले असतात. याचा परिणाम makerने quote केलेल्या spread आणि makerने प्रत्यक्षात राखलेल्या spreadमधील फरकाच्या रूपात दिसतो.

Market makingमध्ये markout म्हणजे काय?

प्रत्येक fillनंतर markout एक प्रश्नाचे उत्तर देतो: मी ज्या बाजूला होतो त्या बाजूने मोजल्यास, ठरावीक सेकंदांनंतर किंमत कुठे होती? समजा makerने $50.02ला 100 shares विकले आणि midpoint $50.00वर होता. त्या fillची सुरुवात प्रति share दोन cents creditने होते. Desk unitsमध्ये हे 20 mils आहेत. Mil म्हणजे centचा one tenth भाग. Sixty secondsनंतर midpoint $50.04वर गेला असल्यास, 60 second markout minus 20 mils असेल. सुरुवातीचा credit नाहीसा झाला आहे आणि त्याच रकमेइतका अतिरिक्त तोटाही झाला आहे.

एका windowमधील प्रत्येक fillची सरासरी काढून ती horizonविरुद्ध plot केली तर markout curve मिळते. खालील panel गुरुवार, May 14, 2026 रोजीच्या three hour midday windowमध्ये AAPLसाठी अशी curve तयार करतो. प्रत्येक print ज्या secondमध्ये झाला त्या secondच्या midpointविरुद्ध signed केला आहे. Midpointपेक्षा वरचा print taker buy मानला जातो. त्यामुळे maker sell sideवर असतो.

क्वेरीस्प्रेडपैकी किती टिकते: AAPL markout curve, 1 सेकंद ते 5 मिनिटे
प्रत्येक आकड्यामागील अचूक SQL
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

पहिली series fillच्या क्षणी मिळणारा credit दाखवते. तो print आणि midpointमधील अंतर आहे आणि सरासरी 19.66 mils प्रति share आहे. दुसरी series midpointला हालचालीसाठी वेळ मिळाल्यानंतर त्याच fillsची किंमत दाखवते: one secondनंतर 20.5 mils आणि five minutesनंतर 9.81 mils. कोणत्याही horizonवर या दोन seriesमधील अंतर म्हणजे markout. ते makerने quote केलेल्या spreadमधून वजा होते.

Curve वेगाने खाली येऊन नंतर स्थिर झाली तर makerने तात्काळ repricingची किंमत भरली असून उरलेला credit राखला आहे. प्रत्येक horizonवर curve त्याच दिशेने उतरत राहिली तर किंमत सतत पुढे जात असताना fills चुकीच्या बाजूला झाले आहेत. पहिला आकार हा व्यवसायाच्या खर्चाचा भाग आहे. दुसरा आकार म्हणजे quote बदलण्याची गरज असल्याचे संकेत आहे.

कोणते fills toxic flow असतात?

येथे toxic हा शब्द तांत्रिक अर्थाने वापरला आहे. मोठ्या नमुन्यात, प्रत्येक horizonवर markout curve makerच्या विरोधात उतरत असेल तर flow toxic असतो. Desks दिसणाऱ्या प्रत्येक वर्गीकरणानुसार fillsची विभागणी करतात: print size, venue, order type आणि counterparty identifier. Public tapeवर दिसणारे वर्गीकरण म्हणजे size.

क्वेरीप्रिंट आकारानुसार AAPL fills: fill वेळी credit आणि 60 सेकंदांनंतरचे मूल्य
प्रत्येक आकड्यामागील अचूक SQL
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

100 sharesपेक्षा कमी आकाराचे fills प्रति share 19.47 mils creditने सुरू होतात आणि one minuteनंतर 15.22 milsचे ठरतात. 1,000 shares किंवा त्याहून मोठे prints 36.26 milsने सुरू होतात आणि त्याच horizonमध्ये 21.34 milsचे ठरतात. Instrument तोच, three hours तोच, पण प्रति share economics वेगळी. सर्वात मोठे orders अनेकदा public queue पूर्णपणे टाळतात. block tradeची रचना याच उद्देशाने केली जाते.

Inventory risk: वेळेत hedge न करता येणारी position

Markout horizon हे एक clockदेखील आहे. Makerने bidवर 5,000 shares खरेदी केले तर त्याच्याकडे 5,000 sharesची position येते. ती position hedge किंवा विकली जाईपर्यंत किंमत पुढे कशीही हलू शकते. Hedging क्वचितच तात्काळ होते. Single-stock positionची भरपाई correlated ETF किंवा options positionने करता येते. मात्र प्रत्येक पर्यायात स्वतंत्र spread cross करावा लागतो. Inventory risk म्हणजे त्या windowमध्ये होऊ शकणाऱ्या किंमतबदलाचा आकार. तो कोणत्याही nameसाठी त्याच पद्धतीने मोजला जातो. पुढील one minuteमध्ये आणि पुढील one hourमध्ये किंमत सामान्यतः किती दूर जाते?

क्वेरीपोजिशन प्रतीक्षेत असताना किंमत किती दूर जाते: SPY आणि NVDA, मे 2026
प्रत्येक आकड्यामागील अचूक SQL
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

May 2026मध्ये SPYमधील one minuteचा average absolute move 1.9 basis points होता. Basis point म्हणजे one percentचा one hundredth भाग. त्याच minuteमध्ये NVDAचा आकडा 5.5 होता. Clock one hourपर्यंत वाढवल्यावर हे दोन आकडे 14.1 आणि 40.4 होतात. One minuteमध्ये position flatten करू शकणारा maker पहिल्या जोडीच्या जोखमीसह काम करतो. One hourपर्यंत position ठेवणारा maker दुसऱ्या जोडीच्या जोखमीसह काम करतो. मात्र fillच्या वेळी मिळणारा credit दोन्ही परिस्थितीत समान असतो.

Queueच्या मागील बाजूस market makersना तोटा का होतो?

Exchanges एकाच किंमतीवरील resting orders त्यांच्या आगमनाच्या क्रमाने match करतात: आधी price आणि नंतर time. Bidवर 40,000 sharesच्या queueच्या शेवटी असलेल्या orderला त्याच्यापुढील 40,000 shares clear होईपर्यंत प्रतीक्षा करावी लागते. estimating queue position ही स्वतंत्र कौशल्यशाखा आहे.

अडचणीचा मुद्दा म्हणजे clearingचा अर्थ. Queue दोन प्रकारे रिकामी होते. Sellers bidवर सतत व्यवहार करून तो level संपवतात, किंवा किंमत त्या levelखाली जाते आणि तो level मागे राहतो. Queueच्या पुढील भागातील order दोन्ही मार्गांत सहभागी होतो. Queueच्या मागील भागातील order प्रामुख्याने दुसऱ्या मार्गाने fill होतो. त्या क्षणी तो level जुनी किंमत होण्याच्या जवळ आलेला असतो. दोन makers एकाच instrumentमध्ये एकाच किंमतीवर व्यवहार करू शकतात, पण त्यांच्याकडे वेगवेगळ्या प्रमाणात value शिल्लक राहते. Queue slot quoted spreadमध्ये कधीच दिसत नाही, कारण दोन्ही makersनी समान किंमत quote केलेली असते. तो markout curveमध्ये दिसतो.

Quote रुंद करणे हा विनामूल्य उपाय का नाही?

खराब markout curveवरचा स्पष्ट उपाय म्हणजे wider quote करणे. Wider quote प्रत्येक fillमधून अधिक मिळवतो, पण fillsची संख्या कमी करतो. या trade-offच्या दोन्ही बाजू त्याच दिवसाच्या printsमध्ये दिसतात. प्रत्येक print midpointपासून किती दूर झाला यानुसार त्यांची क्रमवारी लावली जाते.

क्वेरीmidpoint पासूनच्या अंतरानुसार AAPL prints: volume चा हिस्सा आणि 60 सेकंदांचा markout
प्रत्येक आकड्यामागील अचूक SQL
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

Midpointपासून half a centच्या आत झालेले prints या windowमधील sharesपैकी 27.58 percent होते. One minuteनंतर त्यांची किंमत प्रति share 0.95 mils होती. Midpointपासून more than two cents दूर झालेले prints sharesपैकी 33.19 percent होते आणि त्यांची किंमत 46.86 mils होती. Midpointपासून अधिक दूर पोस्ट केलेल्या quoteपर्यंत दिवसाच्या volumeमधील कमी हिस्सा पोहोचतो.

Fill rate हा quote मागे नेण्याचा पहिला खर्च आहे. Exchange rebates हा दुसरा खर्च आहे. अनेक venues makerला प्रत्येक filled shareमागे पैसे देतात. त्यामुळे हे उत्पन्न quoteच्या रुंदीऐवजी sharesच्या संख्येनुसार वाढते. Rebate rate ठरवणारे volume tiers monthly मोजले जातात. त्यामुळे quiet monthमध्ये पुढील monthमधील प्रत्येक fillचा दर बदलतो. Queue slot सोडणे हा शेवटचा खर्च आहे. बाहेर पडताना तो खर्च होतो आणि पुन्हा प्रवेश करताना queueच्या शेवटी उभे राहताना तोच खर्च पुन्हा होतो. प्रत्येक maker या curveवर कुठेतरी असतो. स्वतःचे markouts सर्वाधिक अचूकपणे मोजणारे makers touchच्या सर्वात जवळ राहूनही credit टिकवू शकतात. हे मोजमाप म्हणजे सर्वात मोठे market makers जपतात तो edge आहे.

FAQ

Market makersना individual tradesवर तोटा होतो का?

नियमितपणे होतो. Making bookमध्ये छोटे gains आणि छोटे losses यांचे distribution असते. किंमत हलण्याच्या अगोदर झालेले fills तोट्याच्या गटात जास्त प्रमाणात येतात. हा व्यवसाय millions of fillsमधील सरासरीवर आधारलेला असतो.

Tradingमध्ये markout म्हणजे काय?

Fillनंतर ठरावीक horizonवर झालेला market priceमधील बदल म्हणजे markout. तो एका बाजूच्या दृष्टीने signed केला जातो. Positive number म्हणजे त्या बाजूला फायदा झाला. Equities desks markouts mils प्रति shareमध्ये quote करतात. Options desks ते ticks प्रति contractमध्ये quote करतात.

Toxic order flow म्हणजे काय?

ज्या order flowची markout curve तो fill करणाऱ्या market makerच्या विरोधात सातत्याने उतरत राहते, त्याला toxic order flow म्हणतात. प्रत्येक fillनंतर किंमत दूर जात राहते. हे label ordersच्या streamचे statistical property आहे. कोणत्याही एका traderबद्दल त्यातून मूल्यनिर्णय होत नाही.

Market makers quotes काढून घेण्याऐवजी spreads रुंद का करतात?

Wider quote market makerला बाजारात राहू देते आणि खराब markout curveची भरपाई करणारी किंमत मिळवून देते. Quote काढून घेतल्यास उत्पन्न मिळत नाही आणि queue positionही गमवावी लागते. Desks दोन्ही उपाय वापरतात. Quote किती काळ stale राहण्याची शक्यता आहे यावर निवड अवलंबून असते.

Adverse selection कसे मोजले जाते?

Markoutsद्वारे. Maker कोणत्या बाजूला होता त्यानुसार प्रत्येक fillला sign द्या. त्यानंतर ठरावीक horizonsवर midpointमधील बदलाची सरासरी काढा. Fillच्या वेळी मिळालेला credit आणि प्रत्येक horizonवरील value यांमधील फरक म्हणजे adverse selection cost. तो spreadसारख्याच unitsमध्ये मोजला जातो.

हे आकडे कसे तयार केले

प्रत्येक AAPL panelमध्ये दोन public records वापरले आहेत: trade tape आणि quote tape. May 14, 2026 रोजी 14:00 ते 17:00 UTC दरम्यान झालेले प्रत्येक print, ज्या secondमध्ये तो झाला त्या secondच्या average national best bid and offer midpointशी match करून signed केला आहे. Midpointपेक्षा वरचा print taker buy मानला जातो. त्यामुळे maker sell sideवर असतो. Midpointवर अगदी झालेल्या printsना कोणतीही side दिली जात नाही आणि ते वगळले जातात. Midpointपासून more than 2 percent दूर असलेले printsही वगळले जातात. Bid offerला भेटतो किंवा त्यापेक्षा वर जातो अशा quote records वगळले आहेत, कारण locked or crossed marketमध्ये वापरण्यायोग्य midpoint नसतो.

Second-level matchingमुळे fillच्या microsecondला लागू असलेल्या quoteचा अंदाज मिळतो आणि अतिवेगवान updatesचा परिणाम smooth होतो. Horizon prices त्याच second-level midpointsमधून घेतले आहेत. Inventory panelमध्ये one minute bars वापरले आहेत. त्यापैकी किमान 50 prints असलेले barsच ठेवले आहेत. त्यामुळे नमुना दिवसातील सर्वाधिक व्यस्त hoursवर केंद्रित होतो.

येथील प्रत्येक panel तयार करणारा SQL code त्यासोबत दिला आहे. त्यामुळे markoutचे गणित प्रत्येक lineवर तपासता येते. वेगळ्या nameवर किंवा वेगळ्या दिवशी curve पुन्हा तयार करण्यासाठी Strasmore terminalवर plain Englishमध्ये विनंती करा.