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 ایک چھوٹے credit کے ساتھ شروع ہوتا ہے، جو تقریباً spread کا نصف ہوتا ہے، اور اس کے بعد کے چند seconds طے کرتے ہیں کہ اس credit میں سے کتنا برقرار رہتا ہے۔ اس پیمائش کا tool markout ہے، یعنی fill کے بعد مقررہ horizon پر قیمت میں ہونے والی signed تبدیلی۔ ذیل کے panels trade اور quote prints سے حقیقی markout curves تیار کرتے ہیں۔ اسی ledger کے revenue side پر ہماری companion تحریر market makers پیسہ کیسے کماتے ہیں موجود ہے۔

Trading میں adverse selection کیا ہے؟

Market maker بیک وقت دو prices پیش کرتا ہے: خریدنے کے لیے bid اور فروخت کے لیے offer، اور دونوں مقررہ size کے لیے مؤثر ہوتے ہیں۔ ان دونوں کے درمیان فرق bid ask spread کہلاتا ہے، اور کاروبار arithmetic پر مبنی ہے۔ bid پر خریدیں، offer پر فروخت کریں، دن میں دسیوں ہزار بار یہ عمل دہرائیں، تو اوسط round trip سے spread کے قریب رقم حاصل ہوتی ہے۔

یہ arithmetic اس مفروضے پر مبنی ہے کہ دونوں sides برابر توازن میں آتی ہیں۔ ایسا نہیں ہوتا۔ Resting quote ایک standing option ہے جسے کوئی بھی شخص اپنی سہولت کے لمحے میں exercise کر سکتا ہے، اور زیادہ توجہ دینے والے traders بہترین مواقع منتخب کرتے ہیں۔ ایک fund بڑا parent order مکمل کر رہا ہو تو offer سستا رہنے تک خریداری جاری رکھتا ہے۔ ایسا system جس نے کسی correlated instrument میں movement پہلے ہی دیکھ لی ہو، اس side کو لے لیتا ہے جس نے ابھی repricing نہیں کی۔

Adverse selection اس mix میں موجود جھکاؤ کا نام ہے: maker کو ملنے والے fills ان traders کی طرف زیادہ ہوتے ہیں جو انہیں سب سے زیادہ چاہتے تھے۔ اس کی علامت maker کے quoted spread اور برقرار رہنے والے spread کے درمیان فرق ہے۔

Market making میں markout کیا ہے؟

Markout ہر fill کے بعد ایک سوال کا جواب دیتا ہے: میں جس side پر تھا، وہاں سے ناپنے پر مقررہ تعداد seconds بعد price کہاں تھی؟ فرض کریں maker نے 100 shares $50.02 پر فروخت کیے، جبکہ midpoint $50.00 تھا۔ اس fill سے فی share دو cents کا credit، یعنی desk units میں 20 mils، حاصل ہوا؛ mil ایک cent کا one tenth ہوتا ہے۔ اگر 60 seconds بعد midpoint بڑھ کر $50.04 ہو جائے تو 60 second markout minus 20 mils ہوگا۔ ابتدائی credit ختم ہو گیا، اور اتنی ہی رقم مزید بھی ختم ہو گئی۔

ایک window میں ہر fill کا average نکال کر اسے horizon کے مقابل plot کریں تو markout curve حاصل ہوتی ہے۔ ذیل کا panel جمعرات، May 14, 2026 کو دوپہر کے تین گھنٹے کے window میں AAPL کے لیے ایسی curve تیار کرتا ہے۔ ہر print کو اسی second کے midpoint کے مقابل sign کیا گیا ہے جس میں وہ print ہوا: midpoint سے اوپر print کو taker buy شمار کیا جاتا ہے، جس سے maker sell side پر آ جاتا ہے۔

استفسار کریںکتنا spread برقرار رہتا ہے: 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 کے درمیان فاصلہ؛ اس کا average 19.66 mils per share ہے۔ دوسری series دکھاتی ہے کہ midpoint کو حرکت کے لیے وقت ملنے کے بعد انہی fills کی قدر کیا رہتی ہے: ایک second بعد 20.5 mils اور پانچ minutes بعد 9.81 mils۔ کسی بھی horizon پر دونوں series کے درمیان فاصلہ markout ہے، اور یہ maker کے quoted spread سے ادا ہوتا ہے۔

ایسی curve جو تیزی سے گرے اور پھر flat ہو جائے، اس بات کی نشاندہی کرتی ہے کہ maker فوری repricing کی لاگت برداشت کرتا ہے اور باقی credit برقرار رکھتا ہے۔ جو curve ہر horizon پر اسی سمت میں ڈھلوان برقرار رکھے، وہ ایسے fills کی نشاندہی کرتی ہے جو مسلسل حرکت کرتی قیمت کے غلط side پر آ رہے ہیں۔ پہلی شکل کاروبار کی معمول کی لاگت ہے۔ دوسری اس quote کی علامت ہے جسے تبدیل کرنے کی ضرورت ہے۔

کون سے fills toxic flow ہوتے ہیں؟

یہاں toxic کا لفظ ایک technical مفہوم رکھتا ہے۔ Flow اس وقت toxic ہوتا ہے جب بڑے sample میں اس کی markout curve ہر horizon پر maker کے خلاف ڈھلوان رکھتی ہو۔ Desks ہر دستیاب label کے مطابق fills کو sort کرتے ہیں: print size، venue، order type اور counterparty identifier۔ Size وہ label ہے جو public tape پر موجود ہوتا ہے۔

استفسار کریںprint size کے لحاظ سے AAPL fills: fill پر credit اور 60 سیکنڈ بعد value
ہر عدد کے پیچھے موجود درست 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 19.47 mils per share کے credit سے شروع ہوتے ہیں اور ایک minute بعد ان کی قدر 15.22 mils رہ جاتی ہے۔ 1,000 shares یا اس سے بڑے prints 36.26 mils کے credit سے شروع ہوتے ہیں اور اسی horizon پر 21.34 mils کی قدر رکھتے ہیں۔ Instrument، تین گھنٹے اور فی share economics مختلف ہیں۔ سب سے بڑے orders اکثر public queue سے مکمل طور پر گریز کرتے ہیں، اور block trade اسی مقصد کے لیے ترتیب دیا جاتا ہے۔

Inventory risk، یعنی وہ position جسے وقت پر hedge نہیں کیا جا سکتا

Markout horizon ایک clock بھی ہے۔ جو maker bid پر 5,000 shares خریدتا ہے، وہ 5,000 shares کی position رکھتا ہے۔ جب تک position hedge یا فروخت نہ ہو، وہ اگلی price movement کے سامنے exposed رہتی ہے۔ Hedging شاذونادر ہی فوری ہوتی ہے: کسی single stock position کو correlated ETF یا options position سے offset کیا جا سکتا ہے، اور ان میں سے ہر ایک کے اپنے spread کو cross کرنا پڑتا ہے۔ Inventory risk اس window کے اندر آنے والی price movement کا حجم ہے، اور ہر name کے لیے اسے اسی طرح ناپا جاتا ہے۔ اگلے minute اور اگلے hour میں price عموماً کتنی دور جاتی ہے؟

استفسار کریںposition کے زیرِ انتظار price کتنا آگے جاتی ہے: 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 ایک percent کا one hundredth ہوتا ہے۔ اسی minute میں NVDA کی پیمائش 5.5 رہی۔ Clock کو ایک hour تک بڑھانے پر دونوں figures 14.1 اور 40.4 ہو گئیں۔ جو maker ایک minute کے اندر position flatten کر سکتا ہے، وہ پہلے pair کے risk کے ساتھ کام کرتا ہے۔ ایک hour تک position رکھنے والا maker دوسرے pair کے risk کے ساتھ کام کرتا ہے، جبکہ fill پر حاصل ہونے والا credit دونوں صورتوں میں یکساں ہوتا ہے۔

Market makers کو queue کے آخر میں نقصان کیوں ہوتا ہے؟

Exchanges ایک price پر موجود resting orders کو arrival order کے مطابق match کرتے ہیں: پہلے price، پھر time۔ Bid پر 40,000 shares کی queue کے آخر میں موجود order اس وقت تک انتظار کرتا ہے جب تک اس سے آگے کے 40,000 shares clear نہ ہو جائیں، اور queue position کا اندازہ لگانا اپنی الگ discipline ہے۔

پیچیدہ نکتہ یہ ہے کہ clearing سے مراد کیا ہے۔ Queue دو طریقوں سے خالی ہوتی ہے۔ Sellers bid کو hit کرتے رہتے ہیں، یہاں تک کہ level مکمل طور پر exhaust ہو جائے، یا price اس level سے نیچے چلی جائے اور اسے پیچھے چھوڑ دے۔ Front کے قریب موجود order دونوں صورتوں میں حصہ لیتا ہے۔ Back پر موجود order زیادہ تر دوسرے طریقے سے fill ہوتا ہے، یعنی اس لمحے جب level پرانی price بننے والا ہوتا ہے۔ دو makers ایک ہی instrument میں ایک ہی price پر trade کر سکتے ہیں، مگر اپنے پاس اس trade کی مختلف مقدار رکھ سکتے ہیں۔ Queue slot quoted spread میں کبھی ظاہر نہیں ہوتا، کیونکہ دونوں makers نے یکساں price quote کی تھی۔ یہ markout curve میں ظاہر ہوتا ہے۔

Quote کو وسیع کرنا مفت حل کیوں نہیں ہے؟

خراب markout curve کا بظاہر واضح جواب یہ ہے کہ wider quote دیا جائے۔ Wider quote ہر fill پر زیادہ کماتا ہے، مگر کم fills تک پہنچتا ہے۔ اس trade-off کے دونوں حصے اسی دن کے prints میں موجود ہوتے ہیں، جنہیں midpoint سے ہر print کے فاصلے کے مطابق sort کیا جاتا ہے۔

استفسار کریں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 cent کے اندر آنے والے prints نے window کے 27.58 percent shares کی نمائندگی کی، اور ایک minute بعد ان کی قدر 0.95 mils per share تھی۔ Midpoint سے دو cents سے زیادہ فاصلے پر آنے والے prints نے 33.19 percent shares کی نمائندگی کی، جبکہ ان کی قدر 46.86 mils تھی۔ Midpoint سے دور posted quote تک دن کے volume کا کم حصہ پہنچتا ہے۔

Fill rate پیچھے ہٹنے کی پہلی لاگت ہے۔ Exchange rebates دوسری لاگت ہیں، کیونکہ بہت سے venues maker کو ہر filled share پر ادائیگی کرتے ہیں، اور یہ آمدن quote کی width کے بجائے shares کی تعداد کے ساتھ بڑھتی ہے۔ Rebate rate طے کرنے والے volume tiers ماہانہ شمار کیے جاتے ہیں، اس لیے ایک quiet month اگلے month کے ہر fill کی قیمت بدل دیتا ہے۔ Queue slot چھوڑنا آخری لاگت ہے: باہر نکلتے وقت بھی ادا کرنا پڑتا ہے اور دوبارہ داخل ہوتے وقت queue کے آخر میں بھی۔ ہر maker اس curve پر کسی نہ کسی مقام پر ہوتا ہے، اور جو makers اپنے markouts کو سب سے زیادہ درستگی سے ناپتے ہیں وہ touch کے قریب رہ کر بھی credit برقرار رکھ سکتے ہیں۔ یہی measurement وہ edge ہے جس کا سب سے بڑے market makers دفاع کرتے ہیں۔

اکثر پوچھے جانے والے سوالات

کیا market makers کو انفرادی trades پر نقصان ہوتا ہے؟

اکثر ہوتا ہے۔ Making book چھوٹے gains اور چھوٹے losses کی distribution ہوتی ہے، اور losing fills ان لمحات میں زیادہ جمع ہوتے ہیں جو price movement سے عین پہلے آتے ہیں۔ یہ کاروبار لاکھوں fills کے average پر قائم ہے۔

Trading میں markout کیا ہے؟

Markout fill کے بعد مقررہ horizon پر market price میں ہونے والی تبدیلی ہے، جسے کسی ایک side کے نقطۂ نظر سے sign کیا جاتا ہے؛ مثبت number کا مطلب ہے کہ اس side کو فائدہ ہوا۔ Equities desks markouts کو mils per share میں، جبکہ options desks کو ticks per contract میں quote کرتے ہیں۔

Toxic order flow سے کیا مراد ہے؟

اس سے مراد ایسا order flow ہے جس کی markout curve اسے fill کرنے والے market maker کے خلاف مسلسل ڈھلوان رکھتی ہو، یعنی ہر fill کے بعد price دور جاتی رہے۔ یہ label orders کے ایک stream کی statistical property ہے، اور کسی ایک trader کے بارے میں کوئی فیصلہ نہیں دیتا۔

Market makers اپنے quotes واپس لینے کے بجائے spreads کو وسیع کیوں کرتے ہیں؟

Wider quote maker کو market میں ایسی price پر برقرار رکھتا ہے جو خراب markout curve کی تلافی کرتی ہے۔ Quote واپس لینے سے کوئی آمدن نہیں ہوتی اور queue position بھی ختم ہو جاتی ہے۔ Desks دونوں طریقے استعمال کرتے ہیں، اور انتخاب اس بات پر منحصر ہوتا ہے کہ quote کے stale رہنے کی توقع کتنی دیر ہے۔

Adverse selection کی پیمائش کیسے کی جاتی ہے؟

Markouts کے ذریعے۔ ہر fill کو اس side کے مطابق sign کریں جس پر maker تھا، پھر بعد کے مقررہ horizons پر midpoint کی تبدیلی کا average نکالیں۔ Fill کے وقت کے credit اور ہر horizon پر موجود value کے درمیان فرق adverse selection cost ہے، اور اس کی units spread جیسی ہی ہوتی ہیں۔

:::detailsیہ اعداد کیسے تیار کیے گئے
ہر AAPL panel دو public records استعمال کرتا ہے: trade tape اور quote tape۔ May 14, 2026 کو 14:00 سے 17:00 UTC کے درمیان آنے والے ہر print کو اسی second کے average national best bid and offer midpoint سے match کیا گیا جس میں وہ print ہوا، پھر اسے sign کیا گیا۔ Midpoint سے اوپر print کو taker buy شمار کیا گیا، جس سے maker sell side پر آتا ہے۔ Midpoint پر بالکل ہونے والے prints کی کوئی side نہیں ہوتی، اس لیے انہیں drop کر دیا گیا۔ اسی طرح midpoint سے 2 percent سے زیادہ فاصلے والے prints بھی خارج کیے گئے۔ وہ quote records بھی خارج کیے گئے جہاں bid، offer کے برابر یا اس سے اوپر ہو، کیونکہ locked or crossed market میں قابلِ استعمال midpoint موجود نہیں ہوتا۔

Second-level matching fill کے microsecond پر prevailing quote کا تخمینہ لگاتی ہے اور تیز ترین updates کو smooth کرتی ہے۔ Horizon prices بھی اسی second-level midpoint سے حاصل کی گئیں۔ Inventory panel one minute bars استعمال کرتا ہے اور صرف وہ bars رکھتا ہے جن میں کم از کم 50 prints ہوں۔ اس طرح sample دن کے سب سے مصروف hours میں زیادہ concentrated رہتا ہے۔
:::

یہاں موجود ہر panel اس کے تیار کرنے والی SQL رکھتا ہے، اس لیے markout math کا line by line جائزہ لیا جا سکتا ہے۔ Curve کو کسی دوسرے name یا کسی دوسرے دن کے لیے دوبارہ بنانے کے لیے Strasmore terminal پر plain English میں درخواست دیں۔