ٹریڈ مارک آؤٹ اور ایگزیکیوشن کوالٹی کی وضاحت
ٹریڈ مارک آؤٹ کا مطلب اور اس کے سائن کنونشن کو سمجھیں۔ ایک سیکنڈ سے پانچ منٹ تک کے ہورائزن پر مارک آؤٹ کرو اور ایڈورس سلیکشن کے اثرات کا تجزیہ کرنے کا طریقہ جانیں۔
ٹریڈ مارک آؤٹ (trade markout) سے مراد کسی fill کے بعد ایک مقررہ وقت (horizon) کے دوران mid price میں آنے والی تبدیلی ہے، جس کی پیمائش اس لمحے سے کی جاتی ہے جب وہ fill پرنٹ ہوتی ہے۔ مثبت مارک آؤٹ کا مطلب ہے کہ آپ کی ٹریڈ کے بعد مارکیٹ آپ کے حق میں چلی گئی۔ منفی کا مطلب ہے کہ مارکیٹ آپ کے خلاف گئی، جسے ٹریڈنگ ڈیسک adverse selection کہتے ہیں۔ آپ جو horizon منتخب کرتے ہیں، چاہے وہ ایک سیکنڈ ہو یا پانچ منٹ، اسی سے یہ طے ہوتا ہے کہ یہ عدد کس سوال کا جواب دے رہا ہے۔
ٹریڈ مارک آؤٹ کیا ہے؟
شروعات mid price سے کریں: بہترین bid اور بہترین offer کے درمیان کا نقطہ، یعنی NBBO کا وسط۔ مارک آؤٹ آپ کی fill کے بعد ایک منتخب کردہ horizon پر اس mid کو لیتا ہے، اس میں سے ایک reference price تفریق کرتا ہے، اور آپ کی ٹریڈ کی سمت (side) کے مطابق اسے علامت (sign) دیتا ہے۔
**مارک آؤٹ برائے horizon h = سمت * (mid بوقت t+h - reference price)**، جہاں اگر آپ نے خریدا (buy) تو سمت جمع ایک ہے اور اگر بیچا (sell) تو منفی ایک۔
علامت کا اصول ہی اکثر الجھن کا باعث بنتا ہے۔ ایک buy ٹریڈ جس کے بعد mid گر جائے، اس کا مارک آؤٹ منفی ہوتا ہے: آپ نے خریدا، قیمت نیچے چلی گئی، اور جس نے آپ کو بیچا اسے اس ٹریڈ سے فائدہ ہوا۔ یہی وہ adverse selection ہے جسے ایک عدد کی صورت میں لکھا گیا ہے۔ ایک sell ٹریڈ جس کے بعد mid گر جائے، اس کا مارک آؤٹ مثبت ہوتا ہے، کیونکہ سمت کے ساتھ علامت بھی بدل جاتی ہے۔ ہر fill کی دو اطراف ہوتی ہیں، اور ایک طرف کا مارک آؤٹ دوسری طرف کا الٹ (sign reversed) ہوتا ہے۔
تین reference قیمتیں
آپ جو reference price تفریق کرتے ہیں، اسی سے طے ہوتا ہے کہ مارک آؤٹ کیا پیمائش کر رہا ہے۔
- fill price: مارک آؤٹ رقم کی شکل اختیار کر لیتا ہے: یعنی آپ کی پوزیشن کی t+h پر کیا قدر ہے بمقابلہ جو آپ نے ادا کیا۔ جو spread آپ نے ادا کیا یا کمایا وہ اس میں شامل ہوتا ہے۔
- fill کے لمحے پر mid: یہ spread کو الگ کر دیتا ہے اور صرف اس بات پر توجہ مرکوز کرتا ہے کہ ٹریڈ کے بعد مارکیٹ کیسے چلی، جو adverse selection کو سمجھنے کا سب سے واضح طریقہ ہے۔
- آپ کی ٹریڈ کردہ سمت کا quote: اس touch کے مقابلے میں پیمائش کرنا جو آپ نے لیا یا پوسٹ کیا، یہ بتاتا ہے کہ fill اس قیمت کے مقابلے میں کیسی رہی جو اصل میں دستیاب تھی۔
Execution quality کا کام adverse selection کے لیے دوسرے طریقے پر اور منافع و نقصان (P&L) کے لیے پہلے طریقے پر انحصار کرتا ہے۔ دونوں نیچے دیے گئے پہلے پینل میں، fills کے ایک سیٹ پر دیکھے جا سکتے ہیں۔
مارک آؤٹ کرو (curve) اور اس کی شکل کا مطلب
اگر آپ بہت سے horizons پر یہی اعداد و شمار نکالیں تو ایک کرو (curve) بنتی ہے۔ اس کی شکل کسی ایک عدد سے زیادہ معلومات فراہم کرتی ہے۔
- ایک ایسی کرو جو پہلے سیکنڈ میں تیزی سے گرے اور نیچے ہی رہے، وہ اس flow کو ظاہر کرتی ہے جو 'pick off' ہو رہا ہے: قیمت fill کے فوراً بعد خلاف سمت میں حرکت کرتی ہے۔
- ایک ایسی کرو جو منٹوں تک گرتی رہے، وہ ایسے flow کو ظاہر کرتی ہے جس میں اس بارے میں حقیقی معلومات تھیں کہ قیمت کہاں جا رہی ہے۔
- صفر کے قریب ایک فلیٹ کرو بے ضرر flow کو ظاہر کرتی ہے۔ پانچ منٹ بعد، mid ویسا ہی دکھتا ہے جیسا fill کے وقت تھا۔
- ایک ایسی کرو جو منفی سے شروع ہو کر واپس صفر کی طرف جائے، وہ شکل ہے جس کی تلاش ایک passive maker کو ہوتی ہے جو rebates جمع کر رہا ہے۔ ابتدائی گراوٹ spread اور فوری اثر ہے، اور بحالی کا مطلب ہے کہ مارکیٹ واپس آ رہی ہے۔
Horizon کا انتخاب خود اس بات کا فیصلہ ہے کہ آپ کیا پیمائش کر رہے ہیں۔ ایک سیکنڈ سے کم پر، مارک آؤٹ زیادہ تر latency اور queue position کو پڑھتا ہے۔ اسے ایک منٹ تک بڑھائیں تو یہ flow میں موجود قلیل مدتی معلومات کو پڑھتا ہے۔ پانچ منٹ سے آگے، عام مارکیٹ ڈرفٹ fill کے اثر کو دھندلا دیتی ہے۔
ایک حقیقی مارک آؤٹ کرو، fill بہ fill
نیچے دیا گیا پینل 10 جون 2026 کے ریگولر سیشن سے INTC کے ہر پرنٹ کو لیتا ہے، ہر ایک کو پرنٹ ہونے سے پہلے کے سیکنڈ کے آخری quote کے مقابلے میں buy-initiated یا sell-initiated کے طور پر درجہ بندی کرتا ہے، اور 5 horizons پر signed markout کی اوسط نکالتا ہے۔ دو سیریز ایک جیسی fills پر چلتی ہیں: ایک fill کے وقت کے mid سے، اور دوسری fill price سے۔
ہر عدد کے پیچھے موجود درست 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_s900593 درجہ بند fills میں، mid basis سیریز 1 sec پر 3.068 basis points اور 5 min پر 2.977 basis points پڑھتی ہے۔ ایک basis point قیمت کا سوواں حصہ ہوتا ہے، لہذا ایک fill صرف ایک معمولی فرق ڈالتی ہے جبکہ دس لاکھ شیئرز حقیقی رقم کی نقل و حرکت کرتے ہیں۔
Fill basis سیریز -0.488 basis points پر کھلتی ہے۔ مختصر ترین horizon پر دونوں سیریز کے درمیان کا فاصلہ effective half spread ہے: یعنی پرنٹ mid سے کتنا دور لگا۔ ایک taker داخلے پر یہ ادا کرتا ہے اور ایک maker اسے کماتا ہے۔ پہلے horizon کے بعد جو کچھ بھی ہے وہ مارکیٹ کی نقل و حرکت ہے۔
Fill کا سائز اور کرو کی شکل
Adverse selection تمام fills پر یکساں طور پر اثر انداز نہیں ہوتی۔ اسی سیشن کو پرنٹ سائز کے لحاظ سے تقسیم کرنے پر چھوٹی fills اور ایک ہزار یا اس سے زیادہ شیئرز کے بلاکس ایک ہی 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_s5 min horizon پر، ایک ہزار شیئرز سے کم کے پرنٹس اوسطاً 2.983 basis points ہوتے ہیں، جبکہ ایک ہزار یا اس سے زیادہ کے 11588 پرنٹس اوسطاً 2.495 ہوتے ہیں۔ ان دو گروپس کے خلاف کل حجم پورا کرنے والے دو quotes دن کے اختتام پر ایک ہی جگہ نہیں پہنچتے۔
مارک آؤٹ execution رپورٹس میں spread کے اعداد و شمار کیسے بنتے ہیں
مارک آؤٹ معیاری spread decomposition میں گمشدہ حصہ ہے۔ Effective spread وہ ہے جو ایک taker نے اصل میں ادا کیا: mid سے پرنٹ تک کے signed فاصلے کا دوگنا۔ اسے دو حصوں میں تقسیم کریں۔ ایک حصہ 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_time09:30 مشرقی وقت سے شروع ہونے والے آدھے گھنٹے میں، effective spread اوسطاً 10.651 basis points ہے، جس میں سے 8.313 ساٹھ سیکنڈ کے horizon پر adverse selection کا حصہ ہے اور 2.338 وہ ہے جو ایک maker برقرار رکھتا ہے۔ پینل 13 آدھے گھنٹے کے buckets کا احاطہ کرتا ہے۔
یہ اجزاء وہ مقداریں ہیں جن کا خلاصہ Rule 605 اور 606 execution رپورٹس میں ہر venue کے حساب سے دیا گیا ہے، اور یہی وہ حساب کتاب ہے جو the sub penny rule and price improvement پر مبنی قیمت میں بہتری کے دعووں کے پیچھے ہے۔ Rebate فی شیئر ایک مقررہ کریڈٹ ہے۔ Adverse selection ان fills پر فی شیئر ایک متغیر لاگت ہے جو ایک quote کو اصل میں موصول ہوتی ہے۔ ایک ہیڈ لائن ریٹ کارڈ کے بجائے، ایک پیمائش شدہ کرو پر ایک کا دوسرے کے مقابلے میں موازنہ کرنا، maker taker fees and rebates کے پیچھے کی جانچ ہے، اور یہ why market makers lose money میں موجود میکانکس کے ساتھ ساتھ موجود ہے۔
یہ اعداد و شمار کیسے شمار کیے گئے
ہر پینل 10 جون 2026 کے ریگولر سیشن، 09:30 سے 16:00 مشرقی وقت تک کے INTC quotes اور پرنٹس کو پڑھتا ہے۔ Quotes کو فی سیکنڈ ایک mid میں سمیٹا گیا ہے، جو اس سیکنڈ کے اندر پرنٹ ہونے والا آخری mid ہے۔ ایک پرنٹ کو buy-initiated تب سمجھا جاتا ہے جب وہ پچھلے سیکنڈ کے mid سے اوپر لگا ہو، اور sell-initiated تب جب وہ نیچے لگا ہو، جو کہ معیاری quote رول ہے۔ بالکل mid پر بیٹھنے والے پرنٹس کو چھوڑ دیا گیا ہے، لہذا midpoint executions نمونے سے باہر ہیں۔ پچھلے سیکنڈ کے mid کو بطور reference استعمال کرنے سے reference کو مستقبل میں جھانکنے سے روکا جاتا ہے۔ Horizons پرنٹ کے سیکنڈ سے گنے گئے مکمل سیکنڈز ہیں، اور ایک fill تب ہی horizon میں داخل ہوتی ہے جب ٹارگٹ سیکنڈ میں کوئی quote موجود ہو۔
اکثر پوچھے گئے سوالات (FAQ)
ٹریڈنگ میں مارک آؤٹ کیا ہے؟
مارک آؤٹ ایک fill کے بعد ایک مقررہ horizon پر mid price میں آنے والی signed تبدیلی ہے۔ مثبت کا مطلب ہے کہ آپ کی ٹریڈ کے بعد مارکیٹ آپ کی سمت میں چلی گئی۔ منفی کا مطلب ہے کہ یہ دوسری طرف چلی گئی، جو کہ adverse selection کی تعریف ہے۔
کیا منفی مارک آؤٹ ہمیشہ ایک خراب fill ہوتی ہے؟
نہیں۔ ایک marketable آرڈر پر ایک سیکنڈ پر منفی مارک آؤٹ زیادہ تر وہ spread ہے جو اس آرڈر نے ادا کیا، جو کہ فوری طور پر کام مکمل کروانے کی قیمت ہے۔ زیادہ اہم بات یہ ہے کہ کیا کرو طویل horizons پر گرتی رہتی ہے یا فلیٹ ہو جاتی ہے۔
مارک آؤٹ اور slippage میں کیا فرق ہے؟
Slippage ایک fill کا موازنہ فیصلہ کرنے والی قیمت یا آمد کی قیمت سے کرتی ہے، لہذا یہ آرڈر کے پورے راستے کو گریڈ کرتی ہے۔ مارک آؤٹ ایک fill کا موازنہ fill کے بعد کے horizon پر mid سے کرتی ہے، لہذا یہ اس بات کو گریڈ کرتی ہے کہ آگے کیا ہوا۔ ایک parent آرڈر کو اسکور کرتی ہے، دوسری انفرادی fill کو۔
مارک آؤٹ کو کون سا horizon استعمال کرنا چاہیے؟
یہ اس بات پر منحصر ہے کہ fill کس لیے تھی۔ ایک سیکنڈ سے کم کے horizons latency کے حساس execution کو گریڈ کرتے ہیں، جبکہ ایک منٹ liquid ناموں پر adverse selection کے لیے عام ڈیفالٹ ہے۔ عدد کے ساتھ horizon شائع کرنا ہی وہ چیز ہے جو دو مارک آؤٹس کو قابل موازنہ بناتی ہے۔
مارک آؤٹ کا effective spread سے کیا تعلق ہے؟
Effective spread realized spread اور adverse selection کے جزو میں تقسیم ہوتا ہے، اور وہ جزو mid basis markout کو دو سے ضرب دینے سے حاصل ہوتا ہے۔ Horizon تبدیل کریں تو دونوں کے درمیان تقسیم بھی اس کے ساتھ بدل جاتی ہے، یہی وجہ ہے کہ ایک شائع شدہ spread کا اعداد و شمار اپنے horizon کے بغیر نامکمل ہے۔
یہاں ہر پینل اس SQL کے ساتھ آتا ہے جس نے اسے تیار کیا۔ ایک کھولیں، ticker یا تاریخ تبدیل کریں، اور وہی مارک آؤٹ کرو Strasmore ٹرمینل پر شروع سے دوبارہ بن جائے گی۔