Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

شرح trade markout وجودة تنفيذ الصفقات

ما هو trade markout؟ تعرّف إلى قاعدة الإشارة مع منحنى حقيقي يقيس السعر الوسطي من ثانية واحدة إلى خمس دقائق، لتفهم adverse selection وتقارن جودة التنفيذ.

يقيس trade markout التغير في السعر الوسطي خلال أفق زمني ثابت بعد تنفيذ الصفقة، محسوباً من لحظة تسجيل ذلك التنفيذ. تعني القيمة الموجبة أن السوق تحرك لمصلحتك بعد التداول. وتعني القيمة السالبة أنه تحرك ضدك، وهو ما تسميه مكاتب التداول adverse selection. ويحدد الأفق الذي تختاره، سواء كان ثانية واحدة أو خمس دقائق، السؤال الذي تجيب عنه القيمة.

ما هو trade markout؟

ابدأ بالسعر الوسطي: وهو النقطة الواقعة في منتصف المسافة بين أفضل سعر شراء وأفضل سعر عرض، أي منتصف the NBBO. يأخذ markout السعر الوسطي عند أفق زمني محدد بعد تنفيذ صفقتك، ويطرح منه سعراً مرجعياً، ثم يحدد إشارة الناتج وفقاً لجانب الصفقة الذي نفذته.

**markout عند الأفق h = side * (السعر الوسطي عند t+h - السعر المرجعي)**، حيث تساوي side موجب واحد إذا اشتريت، وسالب واحد إذا بعت.

تظهر معظم الالتباسات في قاعدة تحديد الإشارة. فإذا تبع شراءك انخفاض السعر الوسطي، يكون markout سالباً: لقد اشتريت، ثم انخفض السعر، ولذلك حصل الطرف الذي باع لك على نتيجة أفضل من تلك الصفقة. وهذا هو adverse selection معبَّراً عنه في صورة رقم. أما إذا تبع البيع انخفاض السعر الوسطي، فيكون markout موجباً، لأن الإشارة تنعكس تبعاً لجانب الصفقة. لكل تنفيذ طرفان، ويكون markout أحد الطرفين مساوياً لـ markout الطرف الآخر مع عكس الإشارة.

الأسعار المرجعية الثلاثة

يحدد السعر المرجعي الذي تطرحه ما الذي يقيسه markout.

  • سعر التنفيذ. يصبح markout مقياساً نقدياً: قيمة المركز عند t+h مقارنةً بما دفعته. ويكون spread الذي دفعته أو حصلت عليه ضمنياً في هذه القيمة.
  • السعر الوسطي عند لحظة التنفيذ. يستبعد هذا القياس spread ويعزل حركة السوق بعد تداولك، ولذلك فهو أوضح مقياس لـ adverse selection.
  • السعر المعروض على الجانب الذي تداولت عليه. يوضح القياس مقارنةً بالسعر الأفضل الذي أخذته أو بالسعر الأفضل الذي عرضته، مدى مقارنة التنفيذ بالسعر الذي كان متاحاً فعلياً.

تعتمد تحليلات جودة التنفيذ على المقياس الثاني لقياس adverse selection، وعلى الأول لقياس الربح والخسارة. ويظهر كلاهما في اللوحة الأولى أدناه، باستخدام مجموعة واحدة من التنفيذات.

منحنى markout وما يعنيه شكله

عند حساب الإحصاء نفسه على آجال زمنية متعددة، تحصل على منحنى. ويحمل شكله معلومات تتجاوز أي قيمة منفردة.

  • يصف المنحنى الذي يهبط بشدة خلال الثانية الأولى ويبقى منخفضاً تدفقاً يجري اصطياده: إذ يتحرك السعر ضد التنفيذ تقريباً فوراً.
  • يصف المنحنى الذي يواصل الهبوط لدقائق تدفقاً حمل معلومات حقيقية عن الاتجاه الذي كان السعر سيسلكه.
  • يصف المنحنى المستقر قرب الصفر تدفقاً محايداً. فبعد مرور خمس دقائق، يبدو السعر الوسطي كما كان عند التنفيذ.
  • يمثّل المنحنى الذي يبدأ سالباً ثم يصعد نحو الصفر الشكل الذي يبحث عنه market maker منفذ بصورة سلبية ويحصل على rebates. ويكون الهبوط المبكر ناتجاً عن spread وimpact الفوري، بينما تعكس عودة المنحنى اقتراب السوق من مستواه السابق.

يمثل اختيار الأفق قراراً بحد ذاته بشأن ما تقيسه. فعند أقل من ثانية، يقرأ markout في الغالب أثر زمن الاستجابة وموقعك في قائمة الانتظار. وعند تمديده إلى دقيقة، يقرأ المعلومات قصيرة الأجل الموجودة في التدفق. وبعد خمس دقائق، تبدأ حركة السوق العادية في حجب أثر التنفيذ نفسه.

منحنى markout فعلي، تنفيذًا بعد تنفيذ

تأخذ اللوحة أدناه كل print على INTC خلال الجلسة النظامية في 10 يونيو 2026، وتصنفه على أنه شراء بمبادرة المشتري أو بيع بمبادرة البائع مقارنةً بآخر quote في الثانية السابقة لتسجيله، ثم تحسب متوسط markout ذي الإشارة عند 5 من الآجال الزمنية. وتمتد سلسلتان على التنفيذات نفسها: تقيس إحداهما من السعر الوسطي عند التنفيذ، وتقيس الأخرى من سعر التنفيذ.

الاستعلاممنحنى markout لـ INTC، 10 يونيو 2026، مقاسًا من قاعدتي مرجع
استعلام 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
Run this yourself

عبر 900593 من التنفيذات المصنفة، تسجل سلسلة القياس من السعر الوسطي 3.068 نقطة أساس عند 1 sec، و2.977 نقطة أساس عند 5 min. نقطة الأساس تساوي واحداً من مئة من الواحد في المئة من السعر، ولذلك يحرك التنفيذ الواحد قيمة ضئيلة للغاية، بينما تحرك مليون سهم أموالاً حقيقية.

تبدأ سلسلة القياس من سعر التنفيذ عند -0.488 نقطة أساس. وتمثل المسافة بين السلسلتين عند أقصر أفق نصف spread الفعلي: أي مقدار ابتعاد التنفيذ عن السعر الوسطي. يدفع taker هذا المقدار عند الدخول، ويحصل عليه maker. وكل ما يأتي بعد الأفق الأول يمثل حركة السوق.

حجم التنفيذ وشكل المنحنى

لا يتوزع adverse selection بالتساوي بين التنفيذات. وعند تقسيم الجلسة نفسها حسب حجم print، تظهر التنفيذات الصغيرة والصفقات الكبيرة التي تبلغ ألف سهم أو أكثر على المحاور نفسها.

الاستعلامالمنحنى نفسه، مقسّم حسب حجم الصفقة: تنفيذات صغيرة مقابل كتل
استعلام 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
Run this yourself

عند أفق 5 min، تسجل prints التي تقل عن ألف سهم متوسطاً قدره 2.983 نقطة أساس، بينما تسجل 11588 من prints التي تبلغ ألف سهم أو أكثر متوسطاً قدره 2.495. ولا تنهي مجموعتا التنفيذ اليوم عند المستوى نفسه، حتى إذا ملأت quote الحجم الإجمالي نفسه مقابلهما.

كيف تتحول markouts إلى أرقام spread في تقارير التنفيذ

يمثل markout الحد المفقود في التحليل التقليدي لتفكيك spread. ويعبّر effective spread عما دفعه taker فعلياً: ضعف المسافة ذات الإشارة من السعر الوسطي إلى print. اقسم هذا المبلغ إلى جزأين. الجزء الأول هو realized spread، أي ما يحتفظ به maker بعد تحرك السوق. والجزء الثاني هو adverse selection، وهو 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_time
Run this yourself

خلال نصف الساعة التي تبدأ عند 09:30 بتوقيت Eastern، يبلغ متوسط effective spread 10.651 نقطة أساس. ومنه 8.313 يمثل مكوّن adverse selection عند أفق ستين ثانية، بينما يمثل 2.338 ما يحتفظ به maker. وتغطي اللوحة 13 من فترات نصف الساعة.

وتُعرض هذه المكونات حسب venue في تقارير التنفيذ بموجب القاعدتين 605 و606، كما أنها تمثل الأساس الحسابي لادعاءات price improvement المرتبطة بـ قاعدة أقل من السنت وprice improvement. وrebate هو رصيد ثابت لكل سهم. أما adverse selection فهو تكلفة متغيرة لكل سهم في التنفيذات التي تحصل عليها quote فعلياً. وتمثل مقارنة أحدهما بالآخر عبر منحنى مقاس، بدلاً من الاعتماد على جدول رسوم معلن، جوهر التحقق من رسوم maker taker وrebates، وتأتي إلى جانب الآليات الموضحة في لماذا يخسر market makers المال.

كيف حُسبت هذه الأرقام

تقرأ كل لوحة quotes وprints على INTC من الجلسة النظامية في 10 يونيو 2026، من 09:30 إلى 16:00 بتوقيت Eastern. وتُختزل quotes إلى سعر وسطي واحد لكل ثانية، وهو آخر سعر سُجل داخل تلك الثانية. ويُصنَّف print على أنه شراء بمبادرة المشتري عندما يقع فوق السعر الوسطي للثانية السابقة، وعلى أنه بيع بمبادرة البائع عندما يقع تحته، وفق قاعدة quote القياسية. أما prints التي تقع تماماً عند ذلك السعر الوسطي فتُستبعد بدلاً من تخمين جانبها، ولذلك لا تدخل تنفيذات منتصف السعر في العينة. ويضمن استخدام السعر الوسطي للثانية السابقة مرجعاً ألا يستند القياس إلى معلومات مستقبلية. وتُحسب الآجال الزمنية بالثواني الكاملة بدءاً من ثانية تسجيل print، ولا يدخل التنفيذ في أفق معين إلا عند وجود quote في الثانية المستهدفة.

الأسئلة الشائعة

ما هو markout في التداول؟

markout هو التغير ذو الإشارة في السعر الوسطي خلال أفق زمني ثابت بعد التنفيذ. وتعني القيمة الموجبة أن السوق تحرك في اتجاه صفقتك بعد تنفيذها. وتعني القيمة السالبة أنه تحرك في الاتجاه الآخر، وهو تعريف adverse selection.

هل يعني markout السالب دائماً أن التنفيذ كان سيئاً؟

لا. يكون markout السالب بعد ثانية واحدة في أمر قابل للتنفيذ في الغالب هو spread الذي دفعه الأمر، أي تكلفة الحصول على التنفيذ فوراً. والأهم هو معرفة ما إذا كان المنحنى يواصل الهبوط عند الآجال الأطول أو يستقر.

ما الفرق بين markout وslippage؟

تقارن slippage التنفيذ بسعر قرار أو بسعر الوصول، ولذلك تقيّم المسار الكامل للأمر. أما markout فيقارن التنفيذ بالسعر الوسطي عند أفق زمني بعد التنفيذ، ولذلك يقيّم ما حدث تالياً. يقيس الأول الأمر الأصلي، بينما يقيس الثاني التنفيذ الفردي.

ما الأفق الزمني الذي ينبغي استخدامه مع markout؟

يعتمد ذلك على الغرض من التنفيذ. تقيس الآجال الأقل من ثانية جودة التنفيذ الحساس لزمن الاستجابة، بينما تمثل الدقيقة الواحدة الاختيار الشائع لقياس adverse selection في الأسهم السائلة. ويجعل نشر الأفق إلى جانب القيمة markoutين قابلين للمقارنة فعلياً.

ما علاقة markout بـ effective spread؟

ينقسم effective spread إلى realized spread ومكوّن adverse selection، ويكون هذا المكوّن مساوياً لـ markout المقاس من السعر الوسطي مضروباً في اثنين. وعند تغيير الأفق، يتغير الانقسام بين المكوّنين أيضاً. لذلك لا يكتمل إحصاء spread المنشور من دون تحديد أفقه الزمني.


تتضمن كل لوحة هنا SQL الذي أنتجها. افتح إحدى اللوحات، وبدّل ticker أو التاريخ، ثم أعد بناء منحنى markout نفسه من الصفر على منصة Strasmore.