مارکاوت معاملاتی چیست و چگونه کیفیت اجرا را بسنجیم؟
مارکاوت معاملاتی تغییر قیمت میانه پس از انجام معامله است. این مطلب مفهوم و قرارداد علامتگذاری را همراه با تحلیل منحنی در بازههای یک ثانیه تا پنج دقیقه بررسی میکند.
مارکاوت (Markout) معاملاتی، تغییر در قیمت میانه (Mid price) در یک بازه زمانی مشخص پس از انجام معامله است که از لحظه ثبت آن معامله اندازهگیری میشود. مقدار مثبت به این معناست که بازار پس از معامله شما در جهت مطلوب حرکت کرده است. مقدار منفی به این معناست که بازار در جهت مخالف حرکت کرده که میزهای معاملاتی (Trading desks) به آن انتخاب نامطلوب (Adverse selection) میگویند. بازهای که انتخاب میکنید، مثلاً یک ثانیه یا پنج دقیقه، تعیین میکند که این عدد به چه پرسشی پاسخ میدهد.
مارکاوت معاملاتی چیست؟
با قیمت میانه شروع کنید: نقطه میانی بین بهترین قیمت خرید (Best bid) و بهترین قیمت فروش (Best offer) که همان نقطه میانی NBBO است. مارکاوت، آن قیمت میانه را در یک بازه زمانی انتخابی پس از انجام معامله شما میگیرد، یک قیمت مرجع را از آن کسر میکند و نتیجه را با علامتی که نشاندهنده جهت معامله شماست، مشخص میکند.
**مارکاوت در بازه h = جهت معامله * (قیمت میانه در زمان t+h - قیمت مرجع)**، که در آن اگر خرید کرده باشید جهت معامله مثبت یک و اگر فروش کرده باشید منفی یک است.
قرارداد علامتگذاری معمولاً منشأ سردرگمی است. خریدی که پس از آن قیمت میانه کاهش یابد، مارکاوت منفی دارد: شما خریدید، قیمت پایین آمد و هر کسی که به شما فروخت، از آن معامله سود برد. این همان انتخاب نامطلوب است که به شکل یک عدد بیان شده است. فروشی که پس از آن قیمت میانه کاهش یابد، مارکاوت مثبت دارد، زیرا علامت با جهت معامله تغییر میکند. هر معامله دو طرف دارد و مارکاوت یک طرف، همان مارکاوت طرف دیگر با علامت معکوس است.
سه قیمت مرجع
قیمت مرجعی که کسر میکنید، تعیین میکند که مارکاوت چه چیزی را اندازهگیری میکند.
- قیمت انجام معامله (Fill price). مارکاوت به پول تبدیل میشود: ارزش موقعیت در زمان t+h در مقایسه با آنچه پرداخت کردهاید. اسپردی که پرداخت یا کسب کردهاید در این محاسبه لحاظ میشود.
- قیمت میانه در لحظه انجام معامله. این کار اسپرد را حذف کرده و نحوه حرکت بازار پس از معامله شما را ایزوله میکند که دقیقترین معیار برای سنجش انتخاب نامطلوب است.
- قیمت مظنه در سمتی که معامله کردید. اندازهگیری نسبت به قیمتی که از آن خرید کردید یا قیمتی که در آن سفارش گذاشتید، نشان میدهد که معامله شما در مقایسه با قیمتی که واقعاً در دسترس بوده، چگونه است.
تحلیل کیفیت اجرا برای سنجش انتخاب نامطلوب بر مورد دوم و برای سود و زیان بر مورد اول تکیه دارد. هر دو مورد در پنل اول زیر، برای مجموعهای از معاملات نمایش داده شدهاند.
منحنی مارکاوت و معنای شکل آن
اگر همین آمار را در بازههای زمانی متعدد اجرا کنید، به یک منحنی میرسید. شکل این منحنی بیش از هر عدد واحدی اطلاعات در بر دارد.
- منحنیای که در ثانیه اول بهشدت سقوط میکند و پایین میماند، نشاندهنده جریان سفارشی است که شکار شده (Picked off): قیمت تقریباً بلافاصله برخلاف جهت معامله حرکت میکند.
- منحنیای که برای چندین دقیقه به سقوط ادامه میدهد، نشاندهنده جریان سفارشی است که حاوی اطلاعات واقعی درباره مسیر آتی قیمت بوده است.
- منحنی تخت نزدیک به صفر، نشاندهنده جریان سفارش بیخطر است. پنج دقیقه بعد، قیمت میانه مشابه لحظه انجام معامله است.
- منحنیای که منفی شروع شده و دوباره به سمت صفر بالا میآید، شکلی است که یک بازارساز منفعل (Passive maker) که به دنبال دریافت ریبیت (Rebate) است، به دنبال آن است. افت اولیه، مجموع اسپرد و تأثیر فوری است و بازگشت آن، نشاندهنده اصلاح وضعیت بازار است.
انتخاب بازه زمانی خود تصمیمی درباره این است که چه چیزی را اندازهگیری میکنید. زیر یک ثانیه، مارکاوت عمدتاً تأخیر (Latency) و موقعیت در صف را میسنجد. اگر آن را به یک دقیقه افزایش دهید، اطلاعات کوتاهمدت موجود در جریان سفارش را میسنجد. پس از پنج دقیقه، نوسانات عادی بازار شروع به تحتالشعاع قرار دادن خودِ معامله میکند.
یک منحنی مارکاوت واقعی، معامله به معامله
پنل زیر تمام معاملات INTC در جلسه عادی 10 ژوئن 2026 را در نظر میگیرد، هر کدام را بر اساس آخرین مظنه ثانیه قبل از ثبت، به عنوان خرید یا فروش آغازشده طبقهبندی میکند و میانگین مارکاوت علامتدار را در بازههای 5 محاسبه میکند. دو سری داده روی معاملات یکسان اجرا میشوند: یکی اندازهگیریشده از قیمت میانه در لحظه انجام معامله و دیگری از قیمت انجام معامله.
کد دقیق 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در میان 900593 معاملات طبقهبندیشده، سری مبنای میانه در 1 sec برابر با 3.068 واحد پایه (Basis points) و در 5 min برابر با 2.977 واحد پایه است. یک واحد پایه، یکصدمِ یک درصدِ قیمت است، بنابراین یک معامله تنها یک خطای گرد کردن ایجاد میکند، اما یک میلیون سهم پول واقعی را جابهجا میکند.
سری مبنای قیمت انجام معامله با -0.488 واحد پایه شروع میشود. فاصله بین این دو سری در کوتاهترین بازه زمانی، همان نصفِ اسپرد مؤثر است: یعنی فاصله قیمت ثبتشده از قیمت میانه. یک متقاضی (Taker) این مقدار را در هنگام ورود پرداخت میکند و یک بازارساز (Maker) آن را کسب میکند. هر چیزی فراتر از بازه اول، ناشی از حرکت بازار است.
حجم معامله و شکل منحنی
انتخاب نامطلوب بهطور یکنواخت در تمام معاملات توزیع نمیشود. تفکیک همان جلسه بر اساس حجم معامله، معاملات کوچک و بلوکهای هزار سهمی یا بیشتر را در محورهای یکسانی قرار میدهد.
کد دقیق 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در بازه 5 min، معاملات زیر هزار سهم بهطور میانگین 2.983 واحد پایه و معاملات 11588 با حجم هزار سهم یا بیشتر، بهطور میانگین 2.495 واحد پایه دارند. دو مظنهای که حجم کل یکسانی را در برابر این دو گروه پر میکنند، روز را در جایگاه یکسانی به پایان نمیرسانند.
چگونه مارکاوتها به اعداد اسپرد در گزارشهای اجرایی تبدیل میشوند
مارکاوت، مؤلفه مفقود در تجزیه استاندارد اسپرد است. اسپرد مؤثر، همان چیزی است که یک متقاضی واقعاً پرداخت کرده است: دو برابر فاصله علامتدار از قیمت میانه تا قیمت معامله. این مقدار را به دو بخش تقسیم کنید. یک بخش، اسپرد تحققیافته (Realized spread) است، یعنی آنچه بازارساز پس از حرکت بازار حفظ میکند. بخش دیگر، انتخاب نامطلوب است که همان مارکاوت مبنای میانه ضربدر دو است. این تساوی دقیق است: اسپرد مؤثر = اسپرد تحققیافته + انتخاب نامطلوب.
کد دقیق 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در نیمساعتی که از 09:30 به وقت شرقی آغاز میشود، اسپرد مؤثر بهطور میانگین 10.651 واحد پایه است که از این مقدار، 8.313 مؤلفه انتخاب نامطلوب در بازه شصت ثانیهای و 2.338 مقداری است که بازارساز حفظ میکند. این پنل شامل 13 بازه نیمساعته است.
این مؤلفهها، مقادیری هستند که به تفکیک هر بازار در گزارشهای اجرایی Rule 605 و 606 خلاصه شدهاند و محاسبات ریاضی پشت ادعاهای بهبود قیمت هستند که بر پایه قانون زیر یک پنی و بهبود قیمت قرار دارند. ریبیت یک اعتبار ثابت به ازای هر سهم است. انتخاب نامطلوب، یک هزینه متغیر به ازای هر سهم در معاملاتی است که یک مظنه واقعاً دریافت میکند. سنجش یکی در برابر دیگری در یک منحنی اندازهگیریشده، بهجای تکیه بر نرخهای اسمی، همان بررسی پشت کارمزدها و ریبیتهای بازارساز-متقاضی است و در کنار مکانیسمهای چرایی ضرردهی بازارسازان قرار میگیرد.
نحوه محاسبه این اعداد
هر پنل، مظنهها و معاملات INTC را از جلسه عادی 10 ژوئن 2026، از ساعت 09:30 تا 16:00 به وقت شرقی میخواند. مظنهها به یک قیمت میانه در هر ثانیه خلاصه میشوند که آخرین قیمت ثبتشده در آن ثانیه است. معاملهای که بالاتر از قیمت میانه ثانیه قبل ثبت شده باشد، خرید آغازشده و معاملهای که پایینتر از آن ثبت شده باشد، فروش آغازشده طبقهبندی میشود که قانون استاندارد مظنه است. معاملاتی که دقیقاً روی آن قیمت میانه قرار دارند، حذف میشوند تا حدسزنی نشوند؛ بنابراین معاملات در نقطه میانی از نمونه خارج میشوند. استفاده از قیمت میانه ثانیه قبل به عنوان مرجع، مانع از پیشبینی آینده توسط قیمت مرجع میشود. بازههای زمانی، ثانیههای کاملِ شمردهشده از ثانیه انجام معامله هستند و یک معامله تنها زمانی وارد یک بازه میشود که مظنهای در آن ثانیه هدف وجود داشته باشد.
پرسشهای متداول
مارکاوت در معاملات چیست؟
مارکاوت، تغییر علامتدار در قیمت میانه در یک بازه زمانی ثابت پس از انجام معامله است. مقدار مثبت به این معناست که بازار پس از انجام معامله شما در جهت معاملهتان حرکت کرده است. مقدار منفی به این معناست که بازار در جهت مخالف حرکت کرده که تعریف انتخاب نامطلوب است.
آیا مارکاوت منفی همیشه به معنای معامله بد است؟
خیر. مارکاوت منفی در بازه یکثانیهای برای یک سفارش قابلاجرا (Marketable order)، عمدتاً همان اسپردی است که آن سفارش پرداخت کرده و بهای انجام فوری معامله است. آنچه اهمیت بیشتری دارد این است که آیا منحنی در بازههای زمانی طولانیتر به سقوط ادامه میدهد یا تخت میشود.
تفاوت مارکاوت و اسلیپیج (Slippage) چیست؟
اسلیپیج، معامله را با قیمت تصمیمگیری یا قیمت ورود مقایسه میکند، بنابراین کل مسیر یک سفارش را ارزیابی میکند. مارکاوت، معامله را با قیمت میانه در یک بازه زمانی پس از انجام معامله مقایسه میکند، بنابراین آنچه پس از معامله رخ داده را ارزیابی میکند. یکی به سفارش مادر امتیاز میدهد و دیگری به تکتک معاملات.
مارکاوت باید از چه بازه زمانی استفاده کند؟
این بستگی به هدف معامله دارد. بازههای زیر یک ثانیه، اجرای حساس به تأخیر را ارزیابی میکنند، در حالی که یک دقیقه، پیشفرض رایج برای انتخاب نامطلوب در داراییهای نقدشونده است. انتشار بازه زمانی در کنار عدد، همان چیزی است که دو مارکاوت را قابل مقایسه میکند.
مارکاوت چه ارتباطی با اسپرد مؤثر دارد؟
اسپرد مؤثر به اسپرد تحققیافته بهعلاوه مؤلفه انتخاب نامطلوب تقسیم میشود و آن مؤلفه، مارکاوت مبنای میانه ضربدر دو است. با تغییر بازه زمانی، تقسیمبندی بین این دو نیز تغییر میکند، به همین دلیل است که آمار اسپرد منتشرشده بدون ذکر بازه زمانی آن، ناقص است.
هر پنل در اینجا به همراه کد SQL تولیدکننده آن ارائه شده است. یکی را باز کنید، تیکر یا تاریخ را تغییر دهید تا همان منحنی مارکاوت از ابتدا در ترمینال Strasmore بازسازی شود.