Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Trade markout là gì? Giải thích chất lượng khớp lệnh

Trade markout là gì và quy ước dấu hoạt động ra sao? Xem đường cong markout thực tế từ một giây đến năm phút để đánh giá execution quality.

Trade markout là mức thay đổi của giá mid trong một khoảng thời gian cố định sau khi lệnh được khớp, được đo từ thời điểm giao dịch đó được thực hiện. Giá mid tăng theo hướng có lợi cho giao dịch thì markout dương. Giá mid đi ngược hướng giao dịch thì markout âm; đây là điều các trading desk gọi là adverse selection. Khoảng thời gian bạn chọn, từ một giây đến năm phút, quyết định chỉ số này đang trả lời câu hỏi nào.

Trade markout là gì?

Hãy bắt đầu với giá mid: điểm nằm giữa bid tốt nhất và offer tốt nhất, tức midpoint của NBBO. Markout lấy giá mid tại một thời điểm được chọn sau khi lệnh khớp, trừ đi giá tham chiếu, rồi gắn dấu theo phía giao dịch.

**markout tại thời điểm h = side * (giá mid tại t+h - giá tham chiếu)**, trong đó side bằng cộng một nếu bạn mua và bằng trừ một nếu bạn bán.

Quy ước dấu thường là nguyên nhân gây nhầm lẫn. Nếu bạn mua và giá mid sau đó giảm, markout sẽ âm: bạn đã mua, giá giảm, và bên bán cho bạn đã có giao dịch có lợi hơn. Đó là adverse selection được thể hiện bằng một con số. Nếu bạn bán và giá mid sau đó giảm, markout sẽ dương vì dấu thay đổi theo phía giao dịch. Mỗi giao dịch khớp có hai phía, nên markout của một phía là markout của phía kia với dấu ngược lại.

Ba mức giá tham chiếu

Mức giá tham chiếu được dùng để trừ đi sẽ quyết định markout đo lường điều gì.

  • Giá khớp lệnh. Markout trở thành giá trị bằng tiền: giá trị của vị thế tại t+h so với số tiền bạn đã trả. Phần spread bạn trả hoặc nhận được nằm trong chỉ số này.
  • Giá mid tại thời điểm lệnh khớp. Cách này loại spread khỏi phép đo và chỉ phản ánh thị trường đã di chuyển thế nào sau khi bạn giao dịch. Đây là cách đọc adverse selection rõ nhất.
  • Báo giá ở phía bạn giao dịch. Đo so với mức giá bạn lấy hoặc mức giá bạn đặt sẽ cho biết giao dịch khớp so với mức giá thực tế đang có sẵn như thế nào.

Phân tích chất lượng khớp lệnh thường dùng cách thứ hai để đo adverse selection và cách thứ nhất để đo lãi lỗ. Cả hai đều xuất hiện trong biểu đồ đầu tiên bên dưới, trên cùng một tập hợp giao dịch khớp.

Đường cong markout và ý nghĩa hình dạng

Tính cùng một chỉ số tại nhiều khoảng thời gian, bạn sẽ có một đường cong. Hình dạng của đường cong cung cấp nhiều thông tin hơn bất kỳ một con số đơn lẻ nào.

  • Đường cong giảm mạnh trong giây đầu tiên rồi duy trì ở mức thấp cho thấy dòng lệnh bị bắt trước: giá gần như lập tức đi ngược giao dịch khớp.
  • Đường cong tiếp tục giảm trong nhiều phút cho thấy dòng lệnh chứa thông tin thực về hướng đi của giá.
  • Đường cong đi ngang quanh mức không cho thấy dòng lệnh lành tính. Sau năm phút, giá mid gần như không khác thời điểm giao dịch khớp.
  • Đường cong bắt đầu âm rồi tăng trở lại về gần mức không là hình dạng mà một market maker thụ động thu rebate kỳ vọng. Mức giảm ban đầu phản ánh spread cộng với tác động tức thời, còn phần phục hồi cho thấy thị trường quay trở lại.

Việc chọn khoảng thời gian cũng là quyết định về điều bạn muốn đo lường. Dưới một giây, markout chủ yếu phản ánh độ trễ và vị trí trong hàng đợi. Kéo dài đến một phút, chỉ số phản ánh thông tin ngắn hạn nằm trong dòng lệnh. Sau năm phút, xu hướng thông thường của thị trường bắt đầu lấn át tác động của chính giao dịch khớp.

Đường cong markout thực tế, theo từng giao dịch khớp

Biểu đồ bên dưới lấy toàn bộ giao dịch INTC trong phiên thông thường ngày 10 tháng 6 năm 2026, phân loại từng giao dịch là bên mua chủ động hoặc bên bán chủ động bằng cách so sánh với báo giá cuối cùng của giây trước đó, rồi tính trung bình markout có dấu tại 5 khoảng thời gian. Hai chuỗi được tính trên cùng một tập hợp giao dịch khớp: một chuỗi dùng giá mid tại thời điểm khớp làm cơ sở, chuỗi còn lại dùng giá khớp lệnh.

Truy vấnĐường cong markout của INTC, ngày 10 tháng 6 năm 2026, đo từ hai mốc tham chiếu
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Trong số 900593 giao dịch được phân loại, chuỗi dùng giá mid làm cơ sở ghi nhận 3.068 điểm cơ bản tại 1 sec2.977 điểm cơ bản tại 5 min. Một điểm cơ bản bằng một phần một trăm của một phần trăm giá, vì vậy một giao dịch khớp chỉ tạo ra sai số làm tròn, còn một triệu cổ phiếu có thể tạo ra khoản tiền đáng kể.

Chuỗi dùng giá khớp làm cơ sở bắt đầu ở -0.488 điểm cơ bản. Khoảng cách giữa hai chuỗi tại khoảng thời gian ngắn nhất là nửa spread hiệu dụng: khoảng cách từ giá mid đến mức giá giao dịch được thực hiện. Taker trả khoản này khi vào lệnh, còn maker nhận được khoản này. Mọi biến động sau khoảng thời gian đầu tiên đều là phần thị trường di chuyển.

Quy mô giao dịch và hình dạng đường cong

Adverse selection không phân bổ đồng đều giữa các giao dịch khớp. Chia cùng một phiên theo quy mô giao dịch sẽ đặt các giao dịch nhỏ và các lệnh lớn từ một nghìn cổ phiếu trở lên lên cùng một hệ trục.

Truy vấnCùng đường cong, phân tách theo quy mô lệnh khớp: lệnh nhỏ so với block
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Tại khoảng thời gian 5 min, các giao dịch dưới một nghìn cổ phiếu có mức trung bình là 2.983 điểm cơ bản, trong khi 11588 giao dịch từ một nghìn cổ phiếu trở lên có mức trung bình là 2.495. Hai báo giá được khớp với cùng tổng khối lượng nhưng thuộc hai nhóm này sẽ không kết thúc ngày ở cùng một vị thế.

Markout trở thành các chỉ số spread trong báo cáo khớp lệnh như thế nào

Markout là thành phần còn thiếu trong phép phân rã spread tiêu chuẩn. Effective spread là khoản mà taker thực sự trả: hai lần khoảng cách có dấu từ giá mid đến giá giao dịch. Chia khoản này thành hai phần. Một phần là realized spread, tức phần maker giữ lại sau khi thị trường di chuyển. Phần còn lại là adverse selection, bằng markout tính trên cơ sở giá mid nhân hai. Đẳng thức này chính xác: effective spread = realized spread + adverse selection.

Truy vấnEffective spread phân tách thành realized spread và adverse selection, theo mỗi nửa giờ
Câu lệnh SQL chính xác đằng sau mỗi con số
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

Trong nửa giờ bắt đầu từ 09:30 theo giờ miền Đông, effective spread bình quân là 10.651 điểm cơ bản. Trong đó, 8.313 là thành phần adverse selection tại khoảng thời gian sáu mươi giây và 2.338 là phần maker giữ lại. Biểu đồ bao phủ 13 khoảng nửa giờ.

Các thành phần này là những chỉ số được tổng hợp theo từng venue trong báo cáo khớp lệnh Rule 605 và 606, đồng thời là cơ sở tính toán cho các tuyên bố về price improvement gắn với quy tắc sub penny và price improvement. Rebate là khoản tín dụng cố định trên mỗi cổ phiếu. Adverse selection là chi phí biến đổi trên mỗi cổ phiếu đối với các giao dịch thực sự được khớp với báo giá. So sánh hai yếu tố này trên một đường cong được đo lường, thay vì chỉ dựa vào bảng phí công bố, là cơ sở kiểm tra cho phí và rebate maker taker, đồng thời bổ sung cho các cơ chế trong vì sao market maker thua lỗ.

Cách tính các chỉ số này

Mỗi biểu đồ sử dụng báo giá và giao dịch INTC trong phiên thông thường ngày 10 tháng 6 năm 2026, từ 09:30 đến 16:00 theo giờ miền Đông. Báo giá được quy về một giá mid cho mỗi giây, sử dụng báo giá cuối cùng được ghi nhận trong giây đó. Một giao dịch được phân loại là bên mua chủ động nếu được thực hiện cao hơn giá mid của giây trước đó, và là bên bán chủ động nếu được thực hiện thấp hơn mức giá này. Đây là quy tắc báo giá tiêu chuẩn. Các giao dịch đúng bằng giá mid đó bị loại bỏ thay vì phân loại phỏng đoán, nên giao dịch tại midpoint không nằm trong mẫu. Dùng giá mid của giây trước làm giá tham chiếu giúp giá tham chiếu không sử dụng thông tin tương lai. Các khoảng thời gian được tính theo số giây trọn vẹn kể từ giây diễn ra giao dịch. Một giao dịch khớp chỉ được đưa vào một khoảng thời gian nếu có báo giá trong giây mục tiêu.

Câu hỏi thường gặp

Markout trong giao dịch là gì?

Markout là mức thay đổi có dấu của giá mid trong một khoảng thời gian cố định sau khi giao dịch khớp. Giá thị trường di chuyển theo hướng giao dịch sau khi lệnh được khớp thì markout dương. Giá di chuyển theo hướng ngược lại thì markout âm; đây là định nghĩa của adverse selection.

Markout âm có phải lúc nào cũng cho thấy giao dịch khớp không tốt?

Không. Markout âm tại thời điểm một giây đối với một lệnh có thể khớp ngay phần lớn phản ánh spread mà lệnh phải trả để được khớp tức thời. Điều quan trọng hơn là đường cong có tiếp tục giảm tại các khoảng thời gian dài hơn hay đi ngang.

Markout khác slippage như thế nào?

Slippage so sánh giá khớp với giá quyết định hoặc giá tại thời điểm bắt đầu đặt lệnh, nên đánh giá toàn bộ quá trình của một lệnh. Markout so sánh giá khớp với giá mid tại một thời điểm sau khi khớp, nên đánh giá diễn biến tiếp theo. Một chỉ số đánh giá lệnh tổng thể, còn chỉ số kia đánh giá từng giao dịch khớp.

Nên dùng khoảng thời gian nào cho markout?

Điều này phụ thuộc vào mục đích của giao dịch khớp. Khoảng thời gian dưới một giây đánh giá chất lượng khớp lệnh nhạy với độ trễ, trong khi một phút là mốc mặc định phổ biến để đo adverse selection đối với các mã có thanh khoản cao. Công bố khoảng thời gian ngay cạnh con số là điều kiện để có thể so sánh hai markout.

Markout liên quan thế nào đến effective spread?

Effective spread được phân tách thành realized spread cộng với thành phần adverse selection. Thành phần này bằng markout trên cơ sở giá mid nhân hai. Khi thay đổi khoảng thời gian, tỷ trọng giữa hai thành phần cũng thay đổi. Vì vậy, một chỉ số spread được công bố sẽ không đầy đủ nếu không nêu rõ khoảng thời gian.


Mỗi biểu đồ trong bài này đi kèm SQL đã tạo ra biểu đồ đó. Hãy mở một truy vấn, thay ticker hoặc ngày giao dịch, và đường cong markout tương tự sẽ được dựng lại từ đầu trên terminal Strasmore.