علت زیان بازارگردانان: انتخاب نامطلوب و ریسک موجودی
چرا بازارگردانان متحمل زیان میشوند؟ انتخاب نامطلوب عامل اصلی است. در این مطلب نحوه اندازهگیری این پدیده با منحنیهای مارکاوت، ریسک موجودی و هزینههای موقعیت در صف بررسی شده است.
بازارگردانان به دلیل «انتخاب نامطلوب» (Adverse Selection) متحمل زیان میشوند: معاملهگری که یک پیشنهاد فروش را میپذیرد، اغلب همان کسی است که میداند آن قیمت دیگر معتبر نیست. هر معامله با یک اعتبار (Credit) کوچک آغاز میشود که تقریباً معادل نیمی از اسپرد است، و ثانیههای پس از آن تعیین میکنند که چه میزان از این اعتبار باقی میماند. ابزار اندازهگیری این پدیده، «مارکاوت» (Markout) است؛ یعنی تغییر قیمت علامتدار در یک افق زمانی مشخص پس از انجام معامله. پنلهای زیر بر اساس دادههای معاملات و مظنهها، منحنیهای واقعی مارکاوت را ترسیم میکنند. مطلب مکمل ما در نحوه کسب درآمد بازارگردانان، به بررسی سمت درآمدی همین ترازنامه میپردازد.
انتخاب نامطلوب در معاملات چیست؟
بازارگردان همزمان دو قیمت را اعلام میکند: قیمت خرید (Bid) و قیمت فروش (Offer) که هر کدام برای حجم مشخصی معتبر هستند. فاصله میان این دو، اسپرد خرید و فروش نام دارد و ماهیت این کسبوکار، محاسباتی است. خرید در قیمت Bid، فروش در قیمت Offer و تکرار این کار برای دهها هزار بار در روز؛ در نهایت میانگین هر رفتوبرگشت معاملاتی، مبلغی نزدیک به اسپرد را عاید بازارگردان میکند.
این محاسبات فرض را بر این میگذارد که جریان سفارشها در هر دو سمت متعادل است، اما چنین نیست. یک مظنه فعال، در واقع یک اختیار معامله است که هر کسی میتواند در لحظه دلخواه خود آن را اعمال کند، و معاملهگرانی که بیشترین دقت را دارند، بهترین لحظات را انتخاب میکنند. صندوقی که در حال اجرای یک سفارش بزرگ است، تا زمانی که قیمت فروش ارزان است به خرید ادامه میدهد. سیستمی که پیشتر حرکت یک دارایی همبسته را مشاهده کرده، سمتی را انتخاب میکند که هنوز قیمتگذاری مجدد نشده است.
انتخاب نامطلوب، نامی است برای این عدم تعادل در ترکیب سفارشها: معاملاتی که بازارگردان انجام میدهد، به سمت معاملهگرانی متمایل است که بیشترین نیاز را به آن قیمت داشتهاند. نشانه این پدیده، شکاف میان اسپردی است که بازارگردان اعلام میکند و اسپردی که در نهایت برای او باقی میماند.
مارکاوت در بازارگردانی چیست؟
مارکاوت به یک پرسش که پس از هر معامله مطرح میشود، پاسخ میدهد: قیمت در تعداد ثانیههای مشخصی پس از معامله، با در نظر گرفتن سمتی که من در آن بودم، کجا قرار داشت؟ فرض کنید بازارگردان 100 سهم را در قیمت 50.02 دلار میفروشد، در حالی که قیمت میانه (Midpoint) 50.00 دلار است. این معامله با دو سنت اعتبار به ازای هر سهم آغاز میشود (20 میل در واحدهای معاملاتی، که هر میل یکدهم سنت است). اگر 60 ثانیه بعد، قیمت میانه به 50.04 دلار رسیده باشد، مارکاوت 60 ثانیهای برابر با منفی 20 میل است. اعتبار اولیه از بین رفته و به همان میزان نیز زیان ایجاد شده است.
با میانگینگیری از این ارقام برای تمام معاملات در یک بازه زمانی و رسم آن در برابر افق زمانی، منحنی مارکاوت به دست میآید. پنل زیر این منحنی را برای AAPL در یک بازه سه ساعته میانی روز در پنجشنبه، 14 مه 2026 ترسیم میکند. هر معامله نسبت به قیمت میانه در همان ثانیهای که ثبت شده، علامتگذاری میشود: معاملهای که بالاتر از قیمت میانه باشد، خریدِ متقاضی (Taker) محسوب شده و بازارگردان را در سمت فروش قرار میدهد.
کد دقیق 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سری اول، اعتبار در لحظه انجام معامله است؛ یعنی فاصله بین قیمت معامله و قیمت میانه که بهطور میانگین 19.66 میل به ازای هر سهم است. سری دوم نشان میدهد که همان معاملات پس از فرصت یافتن قیمت میانه برای حرکت، چه ارزشی دارند: 20.5 میل در یک ثانیه بعد و 9.81 میل در پنج دقیقه بعد. فاصله بین این دو سری در هر افق زمانی، همان مارکاوت است که از اسپرد اعلامی بازارگردان کسر میشود.
منحنیای که بهسرعت افت میکند و سپس مسطح میشود، نشاندهنده بازارگردانی است که هزینه قیمتگذاری مجدد فوری را میپردازد و مابقی سود را حفظ میکند. منحنیای که در تمام افقهای زمانی به شیب خود ادامه میدهد، نشاندهنده معاملاتی است که در سمت اشتباهِ قیمتی که همچنان در حال حرکت است، انجام شدهاند. شکل اول، هزینه انجام کسبوکار است. شکل دوم، مظنهای است که نیاز به تغییر دارد.
کدام معاملات جریان سمی (Toxic Flow) هستند؟
واژه «سمی» در اینجا یک کاربرد فنی دارد. جریان سفارش زمانی سمی است که منحنی مارکاوت آن در تمام افقهای زمانی و در یک نمونه آماری بزرگ، علیه بازارگردانی که آن را انجام داده، شیب داشته باشد. میزهای معاملاتی، معاملات را بر اساس تمام برچسبهای قابل مشاهده دستهبندی میکنند: حجم معامله، محل اجرا (Venue)، نوع سفارش و شناسه طرف مقابل. حجم، برچسبی است که در نوار عمومی معاملات (Tape) ثبت میشود.
کد دقیق 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)معاملات زیر 100 سهم با 19.47 میل اعتبار به ازای هر سهم آغاز میشوند و یک دقیقه بعد 15.22 میل ارزش دارند. معاملات 1000 سهم و بالاتر با 36.26 میل آغاز شده و در همان افق زمانی 21.34 میل ارزش دارند. دارایی یکسان، سه ساعت یکسان، اما اقتصاد متفاوت به ازای هر سهم. سفارشهای بسیار بزرگ اغلب از صف عمومی کاملاً اجتناب میکنند، که این همان کاری است که یک معامله بلوکی برای آن ترتیب داده میشود.
ریسک موجودی، موقعیتی که بهموقع پوشش داده نمیشود
افق مارکاوت در واقع یک زمانسنج است. بازارگردانی که 5000 سهم را در قیمت Bid میخرد، 5000 سهم در موجودی دارد و تا زمانی که این موقعیت پوشش داده نشود یا به فروش نرسد، در معرض هرگونه تغییر قیمت بعدی قرار دارد. پوشش ریسک (Hedging) بهندرت آنی است: یک موقعیت تکسهم را میتوان با یک ETF همبسته یا یک موقعیت اختیار معامله خنثی کرد، که هر کدام اسپرد خاص خود را برای عبور دارند. ریسک موجودی، اندازه حرکتی است که در آن بازه زمانی جای میگیرد و برای هر نمادی به یک شکل اندازهگیری میشود. قیمت معمولاً در دقیقه بعد و ساعت بعد چقدر جابهجا میشود؟
کد دقیق 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در طول مه 2026، میانگین حرکت مطلق در SPY طی یک دقیقه برابر با 1.9 واحد پایه (Basis Point) بود که هر واحد پایه یکصدمِ یک درصد است. NVDA در همان یک دقیقه 5.5 واحد پایه حرکت داشت. اگر زمان را به یک ساعت افزایش دهیم، این دو رقم به 14.1 و 40.4 تبدیل میشوند. بازارگردانی که میتواند در عرض یک دقیقه موقعیت خود را مسطح کند، با جفت اول زندگی میکند. بازارگردانی که موقعیت را یک ساعت نگه میدارد با جفت دوم مواجه است، در حالی که اعتبار دریافتی در لحظه معامله در هر دو حالت یکسان است.
چرا بازارگردانان در انتهای صف سفارشها متحمل زیان میشوند؟
صرافیها سفارشهای فعال را بر اساس قیمت و سپس زمان مطابقت میدهند. سفارشی که در انتهای یک صف 40 هزار سهمی در سمت Bid قرار دارد، منتظر میماند تا 40 هزار سهمِ پیش از آن پاکسازی شود، و تخمین جایگاه در صف خود یک تخصص است.
بخش دشوار، معنای پاکسازی است. صف به دو روش خالی میشود: فروشندگان آنقدر به قیمت Bid میفروشند تا سطح قیمت تخلیه شود، یا قیمت به زیر آن سطح سقوط میکند و آن را پشت سر میگذارد. سفارشی که در ابتدای صف است، در هر دو حالت مشارکت میکند. سفارشی که در انتهای صف است، عمدتاً در مسیر دوم پر میشود؛ یعنی دقیقاً در لحظهای که آن سطح قیمت در حال تبدیل شدن به قیمت قدیمی است. دو بازارگردان میتوانند یک دارایی را در یک قیمت معامله کنند اما مقادیر متفاوتی از سود را حفظ کنند. جایگاه در صف هرگز در اسپرد اعلامی دیده نمیشود، زیرا هر دو بازارگردان قیمت یکسانی را اعلام کردهاند. این تفاوت در منحنی مارکاوت نمایان میشود.
چرا افزایش اسپرد، راهحل بیهزینهای نیست؟
پاسخ بدیهی به منحنی مارکاوت نامطلوب، اعلام مظنه با اسپرد بازتر است. مظنه بازتر در هر معامله سود بیشتری دارد اما تعداد معاملات کمتری را جذب میکند. هر دو نیمه این معامله در معاملات همان روز جای میگیرند و بر اساس فاصله هر معامله از قیمت میانه دستهبندی میشوند.
کد دقیق 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)معاملات در فاصله نیمسنتی از قیمت میانه، 27.58 درصد از حجم معاملات در آن بازه را تشکیل دادند و یک دقیقه بعد 0.95 میل به ازای هر سهم ارزش داشتند. معاملاتی که بیش از دو سنت با قیمت میانه فاصله داشتند، 33.19 درصد از حجم را با 46.86 میل ارزش تشکیل دادند. مظنهای که دورتر از قیمت میانه اعلام شود، توسط سهم کوچکتری از حجم روزانه معامله میشود.
نرخ پر شدن سفارش (Fill Rate)، اولین هزینه عقبنشینی است. تخفیفهای صرافی (Rebates) هزینه دوم است، زیرا بسیاری از صرافیها به بازارگردان به ازای هر سهم پرشده مبلغی پرداخت میکنند و این درآمد با تعداد سهام مقیاس میشود، نه با عرض اسپرد. سطوح حجمی که نرخ تخفیف را تعیین میکنند بهصورت ماهانه محاسبه میشوند، بنابراین یک ماه کمحجم، قیمت تمام معاملات ماه بعد را تغییر میدهد. از دست دادن جایگاه در صف، آخرین هزینه است که هم در مسیر خروج و هم در مسیر ورود به انتهای صف پرداخت میشود. هر بازارگردان در نقطهای از این منحنی قرار دارد و کسانی که مارکاوت خود را با دقت بیشتری اندازهگیری میکنند، میتوانند به قیمتهای اصلی نزدیکتر بمانند و همچنان اعتبار را حفظ کنند. این اندازهگیری، همان مزیتی است که بزرگترین بازارگردانان از آن دفاع میکنند.
پرسشهای متداول
آیا بازارگردانان در معاملات انفرادی متحمل زیان میشوند؟
بهطور مرتب. دفتر بازارگردانی توزیعی از سودهای کوچک و زیانهای کوچک است و معاملات زیانده در لحظات درست پیش از حرکت قیمت متمرکز میشوند. این کسبوکار بر میانگین میلیونها معامله استوار است.
مارکاوت در معاملات چیست؟
مارکاوت تغییر در قیمت بازار در یک افق زمانی مشخص پس از انجام معامله است که از دیدگاه یک سمت علامتگذاری میشود؛ جایی که عدد مثبت به معنای سود آن سمت است. میزهای سهام، مارکاوت را بر حسب «میل» به ازای هر سهم و میزهای اختیار معامله بر حسب «تیک» به ازای هر قرارداد اعلام میکنند.
جریان سفارش سمی به چه معناست؟
این اصطلاح جریان سفارشی را توصیف میکند که منحنی مارکاوت آن بهطور مداوم علیه بازارگردانی که آن را پر کرده شیب دارد؛ به این معنی که قیمت پس از هر معامله همچنان در حال دور شدن است. این برچسب یک ویژگی آماری از جریان سفارشهاست و هیچ قضاوتی درباره هیچ معاملهگر خاصی ندارد.
چرا بازارگردانان بهجای حذف مظنههای خود، اسپردها را بازتر میکنند؟
مظنه بازتر به بازارگردان اجازه میدهد در قیمتی در بازار بماند که هزینه منحنی مارکاوت بدتر را پوشش دهد. حذف مظنه هیچ سودی ندارد و جایگاه در صف را نیز از بین میبرد. میزهای معاملاتی هر دو کار را انجام میدهند و انتخاب آنها بستگی به این دارد که انتظار میرود مظنه تا چه مدت نامعتبر (Stale) باقی بماند.
انتخاب نامطلوب چگونه اندازهگیری میشود؟
با مارکاوت. هر معامله را بر اساس سمتی که بازارگردان در آن بوده علامتگذاری کنید، سپس میانگین تغییر قیمت میانه را در افقهای زمانی مشخص پس از آن محاسبه کنید. شکاف بین اعتبار در لحظه معامله و ارزش در هر افق زمانی، هزینه انتخاب نامطلوب است که با همان واحدهای اسپرد اندازهگیری میشود.
نحوه محاسبه این ارقام
هر پنل AAPL دو رکورد عمومی را میخواند: نوار معاملات و نوار مظنهها. هر معامله بین ساعت 14:00 تا 17:00 UTC در 14 مه 2026 با میانگین بهترین قیمت خرید و فروش ملی (NBBO) در ثانیهای که ثبت شده، مطابقت داده شده و سپس علامتگذاری میشود. معاملهای که بالاتر از آن قیمت میانه باشد، خرید متقاضی محسوب شده و بازارگردان را در سمت فروش قرار میدهد. معاملاتی که دقیقاً در قیمت میانه باشند، فاقد سمت بوده و به همراه هر معاملهای که بیش از 2 درصد با قیمت میانه فاصله داشته باشد، حذف میشوند. رکوردهایی که در آن قیمت خرید با قیمت فروش برخورد کرده یا از آن عبور کرده است (Locked or Crossed) حذف میشوند، زیرا در بازار قفلشده یا متقاطع قیمت میانه قابل استفادهای وجود ندارد.
تطبیق در سطح ثانیه، مظنه غالب در میکروثانیه معامله را تقریب میزند و بهروزرسانیهای بسیار سریع را هموار میکند. قیمتهای افق زمانی از همان قیمتهای میانه در سطح ثانیه به دست میآیند. پنل موجودی از نمودارهای یکدقیقهای استفاده میکند و فقط نمودارهایی را نگه میدارد که حداقل 50 معامله داشته باشند، که این امر نمونه را در شلوغترین ساعات روز متمرکز میکند.
هر پنل در اینجا حاوی کد SQL تولیدکننده آن است، بنابراین محاسبات مارکاوت خط به خط قابل بررسی است. برای بازسازی منحنی روی یک نماد دیگر یا در یک روز دیگر، آن را به زبان ساده در ترمینال Strasmore درخواست کنید.