So sánh dữ liệu sổ lệnh MBO và MBP trong giao dịch
Tìm hiểu sự khác biệt giữa dữ liệu MBO và MBP trong sổ lệnh. Bài viết phân tích cách thức hoạt động, chi phí vận hành và ứng dụng thực tế của từng loại dữ liệu này.
Dữ liệu sổ lệnh MBO và MBP là một sự khác biệt lớn ẩn sau một cái tên nhỏ. Hai nhà cung cấp đều có thể bán cho bạn thứ gọi là "Level 2": MBP (market by price) gửi tổng khối lượng tại mỗi mức giá, trong khi MBO (market by order) gửi từng lệnh riêng lẻ dưới dạng một sự kiện kèm ID định danh. Một bên là bản tóm tắt của sổ lệnh; bên kia là sổ cái dùng để xây dựng nên sổ lệnh đó, và nó tiêu tốn lưu lượng dữ liệu lớn hơn gấp nhiều lần.
Dữ liệu sổ lệnh MBP và MBO thực sự chứa những gì
MBP, hay market by price, là độ sâu thị trường đã được tổng hợp. Mỗi bản cập nhật cho biết bên (mua/bán), mức giá, tổng khối lượng hiển thị tại đó, và đôi khi là số lượng lệnh đứng sau mức giá đó. Một sản phẩm bán dưới dạng MBP-10 cung cấp cho bạn mười mức giá tốt nhất ở mỗi bên, đây chính là bảng giá (ladder) trên các nền tảng giao dịch và các bậc thang trong mọi biểu đồ độ sâu thị trường.
MBO, hay market by order, là một luồng sự kiện. Mỗi thông điệp chỉ định một lệnh cụ thể: ID, bên, giá, khối lượng hiển thị và những gì vừa xảy ra với lệnh đó. Không có gì được tổng hợp trước. Nếu có bốn mươi lệnh nằm cùng một mức giá, bốn mươi thông điệp riêng biệt sẽ đặt chúng vào đó, và bạn phải lưu giữ cả bốn mươi lệnh này trong bộ nhớ để biết tổng khối lượng của mức giá đó là bao nhiêu.
Hướng dẫn về dữ liệu thị trường Level 1 và Level 2 của chúng tôi đề cập đến ý nghĩa của các nhãn phân cấp dành cho nhà đầu tư cá nhân tại các công ty môi giới. MBO và MBP là những cái tên chính xác cho những gì nằm bên trong "chiếc hộp" khi nhà cung cấp nói "Level 2", và tên lược đồ (schema) mới là thứ đáng để bạn hỏi tới.
Các hành động thông điệp mà luồng dữ liệu MBO mang lại
Luồng dữ liệu MBO là một hệ thống phân loại các hành động áp dụng cho các ID lệnh. Bốn hành động chiếm phần lớn lưu lượng dữ liệu:
- Add (Thêm): một lệnh mới tham gia vào sổ lệnh tại một mức giá với một ID mới.
- Modify (Sửa đổi): một ID hiện có thay đổi về giá hoặc khối lượng. Việc tăng khối lượng hoặc thay đổi mức giá sẽ đẩy lệnh đó xuống cuối hàng đợi tại mức giá mới; việc giảm khối lượng thường giữ nguyên vị trí của lệnh.
- Cancel (Hủy): một ID rời khỏi sổ lệnh, toàn bộ hoặc một phần.
- Trade hoặc fill (Khớp lệnh): một lệnh chủ động thực thi đối với một hoặc nhiều ID đang chờ, làm giảm hoặc loại bỏ chúng.
MBP không mang bất kỳ từ vựng nào trong số đó. Một bản cập nhật MBP là một tuyên bố về một mức giá: mức giá này hiện có bao nhiêu khối lượng. Dù khối lượng đó mất đi do hủy lệnh hay do khớp lệnh, bản cập nhật trông vẫn giống hệt nhau. Bảng dưới đây hiển thị giới hạn đó trên sổ lệnh mỏng nhất có thể, tức là phần đỉnh sổ lệnh hợp nhất, với một mức giá mỗi bên và MBP-1 theo cách gọi này.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH
ordered AS
(
SELECT
row_number() OVER (ORDER BY sip_timestamp, sequence_number) AS msg_index,
bid_price,
bid_size,
lagInFrame(bid_price) OVER (ORDER BY sip_timestamp, sequence_number) AS prev_bid_price,
lagInFrame(bid_size) OVER (ORDER BY sip_timestamp, sequence_number) AS prev_bid_size
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
AND bid_price > 0
),
classified AS
(
SELECT multiIf(
bid_price != prev_bid_price, 'best bid price changed',
bid_size > prev_bid_size, 'size joined at the best bid',
bid_size < prev_bid_size, 'size left the best bid',
'bid untouched, ask side updated') AS message_type
FROM ordered
WHERE msg_index > 1
)
SELECT
message_type,
count() AS message_count,
round(100 * count() / sum(count()) OVER (), 1) AS share_pct
FROM classified
GROUP BY message_type
ORDER BY indexOf(['best bid price changed', 'size joined at the best bid', 'size left the best bid', 'bid untouched, ask side updated'], message_type)Trong nửa giờ đó, 17.6% thông điệp đã di chuyển giá mua tốt nhất sang một mức giá khác, 17.4% thêm khối lượng tại mức giá mua không đổi, 12% loại bỏ khối lượng tại mức giá mua không đổi, và 53% giữ nguyên mức giá mua trong khi bên còn lại di chuyển. Mỗi nhóm là một tuyên bố ròng về một mức giá. Không có nhóm nào nêu tên một lệnh cụ thể, và không có phép tính số học nào có thể khôi phục lại ID đã mất.
Mỗi lược đồ có thể và không thể trả lời những gì
MBP-10 trả lời các câu hỏi được đặt ra theo kiểu "có bao nhiêu khối lượng tại đó": hình dạng của bảng giá, sự mất cân bằng sổ lệnh, thanh khoản nằm gần mức giá trung bình, và chính biểu đồ độ sâu thị trường. Các mức giá đã tổng hợp là tất cả những gì cần thiết cho các mục đích này.
MBO trả lời các câu hỏi được đặt ra theo kiểu "chuyện gì đã xảy ra với lệnh này": có bao nhiêu khối lượng nằm trước lệnh của bạn khi bạn tham gia, các lệnh tồn tại bao lâu trước khi bị hủy, và xác suất một lệnh thụ động tại mức giá chạm (touch) được khớp trước khi giá di chuyển đi nơi khác. Những đại lượng đó không tồn tại ở dạng tổng hợp, và việc cộng các lệnh thành tổng mức giá sẽ phá hủy trình tự đã định nghĩa chúng.
Vị trí trong hàng đợi là ví dụ rõ ràng nhất, và nó chỉ mang ý nghĩa trong ưu tiên giá-thời gian so với khớp lệnh theo tỷ lệ, nơi thứ tự đến trước quyết định ai được khớp trước. Điều làm cho nó trở nên quan trọng là quy mô khớp lệnh (print size): một mức giá được lấp đầy bởi nhiều giao dịch nhỏ, chứ không phải một giao dịch lớn.
Câu lệnh SQL chính xác đằng sau mỗi con số
SELECT
multiIf(size < 100, '1 to 99 shares',
size < 200, '100 to 199 shares',
size < 500, '200 to 499 shares',
size < 1000, '500 to 999 shares',
'1000 or more shares') AS trade_size_bucket,
count() AS trade_count,
round(100 * count() / sum(count()) OVER (), 1) AS share_pct,
round(avg(size)) AS avg_shares
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
AND size > 0
GROUP BY trade_size_bucket
ORDER BY min(size)Các giao dịch dưới 100 cổ phiếu, hay lô lẻ (odd lot), chiếm 92.3% tổng số giao dịch trong khung thời gian đó, và nhóm lớn nhất hiện diện, 1000 or more shares, chiếm 0.1%. Nếu luồng dữ liệu truyền các giao dịch có quy mô đó vào một mức giá đang hiển thị 4.000 cổ phiếu, thì một lệnh tham gia hàng đợi cuối cùng có thể phải chờ qua hàng chục lần khớp lệnh mà vẫn không được thực thi. MBP cho bạn thấy con số 4.000. MBO cho bạn thấy từng hàng lệnh.
Không lược đồ nào hiển thị khối lượng ẩn. Một lệnh tảng băng trôi (iceberg order) chỉ hiển thị một phần nhỏ và làm mới bằng một ID mới mỗi khi phần hiển thị đó khớp hết, vì vậy phần dự trữ không bao giờ xuất hiện trong bất kỳ thông điệp nào.
Xây dựng lại sổ lệnh từ MBO là một máy trạng thái
Luồng dữ liệu MBP đưa sẵn cho bạn câu trả lời. Luồng dữ liệu MBO đưa cho bạn các dữ liệu đầu vào và yêu cầu bạn phải xử lý chính xác:
- Bắt đầu từ một ảnh chụp nhanh (snapshot), hoặc từ một sổ lệnh trống cộng với thông điệp xóa của sàn.
- Áp dụng mọi hành động thêm, sửa, hủy và khớp lệnh theo đúng trình tự, được định danh bằng ID lệnh.
- Duy trì một chỉ mục thứ hai theo mức giá, vì đó là thứ mà chiến lược của bạn đọc.
- Theo dõi các số thứ tự thông điệp, và đồng bộ lại từ một ảnh chụp nhanh mới bất cứ khi nào có thông điệp bị thiếu.
Chế độ lỗi ở đây rất âm thầm. Nếu bỏ lỡ một lệnh hủy, một lệnh "ma" sẽ nằm trong sổ lệnh của bạn trong suốt phần còn lại của phiên, làm thổi phồng mức giá đó mà không có bất kỳ ngoại lệ nào được đưa ra. MBP suy giảm hiệu năng một cách nhẹ nhàng hơn nhiều: mỗi bản cập nhật đều nêu lại tổng số của mức giá, vì vậy một giá trị bị lỗi sẽ bị ghi đè trong vòng vài thông điệp.
MBO cũng chỉ tồn tại trên các luồng dữ liệu trực tiếp từ sàn, mỗi sổ lệnh một sàn, nghĩa là bạn phải chạy và hợp nhất nhiều luồng dữ liệu. Băng tin hợp nhất (consolidated tape) là một bản tóm tắt theo cấu trúc, một sự phân tách được đề cập trong SIP so với luồng dữ liệu trực tiếp từ sàn.
Chi phí băng thông cho các chi tiết bổ sung
Số lượng thông điệp là cách trung thực nhất để định giá sự khác biệt. Bảng dưới đây đếm các thông điệp đỉnh sổ lệnh hợp nhất so với các giao dịch thực tế trong cùng nửa giờ cho năm mã cổ phiếu quen thuộc.
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH
quote_load AS
(
SELECT ticker, count() AS quote_messages
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'NVDA', 'MSFT', 'KO')
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
GROUP BY ticker
),
trade_load AS
(
SELECT ticker, count() AS trades
FROM global_markets.stocks_trades
WHERE ticker IN ('SPY', 'AAPL', 'NVDA', 'MSFT', 'KO')
AND sip_timestamp >= '2026-06-16 14:00:00'
AND sip_timestamp < '2026-06-16 14:30:00'
GROUP BY ticker
)
SELECT
q.ticker AS ticker,
round(q.quote_messages / 1000, 1) AS quote_messages_thousands,
round(t.trades / 1000, 2) AS trades_thousands,
round(q.quote_messages / t.trades, 1) AS quotes_per_trade_ratio
FROM quote_load AS q
INNER JOIN trade_load AS t ON t.ticker = q.ticker
ORDER BY quotes_per_trade_ratio DESCSPY mang lưu lượng báo giá nặng nhất trên mỗi giao dịch, 9.6 thông điệp cho mỗi giao dịch và 510 nghìn thông điệp trong ba mươi phút. Sự chênh lệch giữa năm mã này rất lớn: ở cuối bảng, MSFT chạy 0.7 thông điệp báo giá trên mỗi giao dịch, ít hơn một thông điệp cho mỗi giao dịch. Hãy nhớ cột đó đếm cái gì: một mức giá mỗi bên, trên một luồng dữ liệu đã gộp mọi sàn giao dịch thành một mức giá mua và bán tốt nhất duy nhất. Một sản phẩm độ sâu mười mức giá sẽ nhân con số đó lên, và một luồng dữ liệu theo từng lệnh sẽ nhân nó lên một lần nữa, vì mỗi lệnh đứng sau mỗi mức giá trên mỗi sàn đều tạo ra lệnh thêm, lệnh sửa và lệnh hủy riêng, bất kể nó có khớp hay không. Phép tính tương tự xuất hiện ở quy mô lớn hơn trong quy mô của luồng dữ liệu báo giá quyền chọn.
Chiến lược cần loại luồng dữ liệu sổ lệnh nào?
Hầu hết các công việc đều chạy trên MBP-10. Các biểu đồ độ sâu, các tính năng mất cân bằng, đo lường thanh khoản tại mức giá, các mô hình chi phí thực thi, và hầu hết mọi câu hỏi nghiên cứu về việc có bao nhiêu khối lượng đang nằm ở đâu đều có thể trả lời được từ các mức giá tổng hợp, với một phần nhỏ lưu lượng thông điệp.
MBO là yêu cầu bắt buộc khi câu trả lời phụ thuộc vào một lệnh cụ thể: vị trí trong hàng đợi, thời gian tồn tại của lệnh, hành vi hủy lệnh, xác suất khớp lệnh thụ động tại mức giá chạm. Một chiến lược sống còn dựa trên việc nó đang đứng ở vị trí 200 cổ phiếu hay 20.000 cổ phiếu trong hàng đợi không thể đạt được từ dữ liệu tổng hợp, và nó phải trả giá bằng phí bản quyền, băng thông, lưu trữ và kỹ thuật để giữ cho sổ lệnh được tái tạo luôn chính xác suốt cả ngày.
Cách các bảng này được xây dựng
- Luồng dữ liệu đằng sau mỗi bảng là đỉnh sổ lệnh hợp nhất, một mức giá mỗi bên, cộng với băng tin giao dịch. Đây không phải là luồng dữ liệu độ sâu và không phải luồng dữ liệu theo từng lệnh, vì vậy các bảng này minh họa cho lập luận về khối lượng thông điệp thay vì lấy mẫu chính MBO.
- Các cửa sổ thời gian được cố định vào một ngày trong quá khứ, từ 10:00 đến 10:30 sáng giờ ET ngày 16 tháng 6 năm 2026, được lưu trữ là 14:00 đến 14:30 UTC. Các cửa sổ cố định giúp các con số ổn định qua các lần tái tạo.
- Bảng phân loại dán nhãn mỗi thông điệp dựa trên thông điệp trước đó theo trình tự. Nó không thể tách biệt một lệnh hủy khỏi một lệnh khớp, đây chính là hạn chế chính xác mà bài viết này mô tả.
FAQ
Sự khác biệt giữa dữ liệu thị trường MBO và MBP là gì?
MBP, market by price, tổng hợp khối lượng hiển thị tại mỗi mức giá và gửi một bản cập nhật cho mỗi mức giá. MBO, market by order, gửi từng lệnh riêng lẻ với ID riêng, cùng với các sự kiện thêm, sửa, hủy và khớp lệnh xảy ra với lệnh đó.
Dữ liệu Level 2 có giống dữ liệu MBO không?
Thường là không. "Level 2" tại một công ty môi giới bán lẻ hầu như luôn có nghĩa là độ sâu thị trường đã tổng hợp, tức là MBP với từ năm đến hai mươi mức giá. Một vài nhà cung cấp tiếp thị luồng dữ liệu theo từng lệnh dưới cùng tên phân cấp, vì vậy tên lược đồ, chứ không phải tên phân cấp, mới là thứ quyết định những gì đến trên đường truyền.
Luồng dữ liệu MBO lớn hơn luồng dữ liệu MBP bao nhiêu?
Lớn hơn gấp nhiều lần, tùy thuộc vào sàn giao dịch và mã chứng khoán. Chỉ riêng đỉnh sổ lệnh hợp nhất đã chạy ở mức 9.6 thông điệp trên mỗi giao dịch cho mã bận rộn nhất trong bảng trên. Một luồng dữ liệu theo từng lệnh bổ sung thêm mọi lệnh thêm, sửa và hủy đằng sau mỗi mức giá trên mỗi sàn, bao gồm cả phần lớn các lệnh không bao giờ khớp.
Bạn có thể xây dựng lại sổ lệnh MBP từ dữ liệu MBO không?
Có, và đó là quy trình thông thường: áp dụng từng sự kiện lệnh vào một sổ lệnh được định danh bằng ID lệnh, sau đó xuất bản tổng số của các mức giá. Điều ngược lại là không thể: một khi các lệnh đã được cộng vào tổng mức giá, các ID riêng lẻ và thứ tự đến của chúng đã mất đi.
Mỗi bảng ở đây đều đi kèm với mã SQL chính xác bên dưới nó. Để đếm cùng các thông điệp đó trên một mã chứng khoán hoặc phiên giao dịch khác, hãy đặt câu hỏi bằng tiếng Anh đơn giản trên thiết bị đầu cuối Strasmore.