ความแตกต่างของข้อมูล MBO และ MBP ใน Order Book
เจาะลึกความแตกต่างระหว่างข้อมูล MBO และ MBP ในการแสดงผล Order Book ทั้งรูปแบบการส่งข้อมูลแบบรายคำสั่งเทียบกับการรวมยอดตามระดับราคา รวมถึงข้อดีและต้นทุนในการใช้งานจริง
ข้อมูล MBO และ MBP ใน order book คือความแตกต่างขนาดใหญ่ที่ซ่อนอยู่ภายใต้ชื่อเรียกที่ดูเล็กน้อย ผู้ให้บริการข้อมูลสองรายอาจขายสิ่งที่เรียกว่า "Level 2" ให้คุณได้ทั้งคู่ แต่ MBP (market by price) จะส่งยอดรวมของจำนวนหุ้นที่วางรออยู่ในแต่ละระดับราคา ในขณะที่ MBO (market by order) จะส่งคำสั่งซื้อขายทุกรายการออกมาเป็นเหตุการณ์แยกต่างหากพร้อม ID ประจำคำสั่ง ข้อมูลแบบหนึ่งคือการสรุปภาพรวมของสมุดคำสั่งซื้อขาย ส่วนอีกแบบคือบัญชีแยกประเภทที่ใช้สร้างสมุดคำสั่งนั้นขึ้นมา ซึ่งต้องใช้ปริมาณการรับส่งข้อมูลมากกว่ากันหลายเท่าตัว
สิ่งที่ข้อมูล order book แบบ MBP และ MBO บรรจุอยู่จริง
MBP หรือ market by price คือข้อมูลความลึกของตลาดแบบรวมยอด (aggregated depth) การอัปเดตแต่ละครั้งจะระบุฝั่ง ราคา ระดับราคา จำนวนหุ้นรวมที่วางรออยู่ และบางครั้งอาจระบุจำนวนคำสั่งซื้อขายที่อยู่เบื้องหลังระดับราคานั้น ผลิตภัณฑ์ที่ขายในชื่อ MBP-10 จะให้ข้อมูลระดับราคาที่ดีที่สุดสิบอันดับในแต่ละฝั่ง ซึ่งเป็นข้อมูลชุดเดียวกับที่แสดงในตารางราคา (ladder) บนแพลตฟอร์มเทรดและกราฟความลึก (depth chart) ทุกรูปแบบ
MBO หรือ market by order คือกระแสข้อมูลเหตุการณ์ (event stream) ข้อความแต่ละชุดจะระบุคำสั่งซื้อขายหนึ่งรายการ ได้แก่ ID ฝั่ง ราคา จำนวนหุ้นที่แสดง และสิ่งที่เพิ่งเกิดขึ้นกับคำสั่งนั้น โดยไม่มีการรวมยอดใดๆ ทั้งสิ้น หากมีคำสั่งซื้อขายสี่สิบรายการวางรออยู่ที่ราคาเดียวกัน จะมีข้อความแยกกันสี่สิบชุดส่งออกมา และคุณต้องเก็บข้อมูลทั้งสี่สิบรายการไว้ในหน่วยความจำเพื่อให้ทราบยอดรวมของระดับราคานั้น
คู่มือข้อมูลตลาด Level 1 เทียบกับ Level 2 ของเราครอบคลุมความหมายของระดับชั้นข้อมูลที่โบรกเกอร์รายย่อยใช้ MBO และ MBP คือชื่อเรียกที่แม่นยำสำหรับสิ่งที่อยู่ภายในกล่องเมื่อผู้ให้บริการระบุว่า "Level 2" และชื่อรูปแบบข้อมูล (schema) คือสิ่งที่คุณควรสอบถามให้ชัดเจน
การดำเนินการของข้อความที่ฟีด MBO ส่งออกมา
ฟีด MBO คืออนุกรมวิธานของการดำเนินการที่กระทำต่อ ID คำสั่งซื้อขาย โดยมีสี่ประเภทที่กินปริมาณการรับส่งข้อมูลส่วนใหญ่:
- Add: คำสั่งซื้อขายใหม่เข้าสู่สมุดคำสั่งที่ระดับราคาหนึ่งพร้อม ID ใหม่
- Modify: ID ที่มีอยู่เดิมมีการเปลี่ยนแปลงราคาหรือจำนวนหุ้น การเพิ่มจำนวนหุ้นหรือการขยับราคาจะทำให้คำสั่งนั้นไปต่อท้ายคิวในระดับราคาใหม่ ส่วนการลดจำนวนหุ้นโดยปกติจะยังคงลำดับเดิมไว้
- Cancel: ID ออกจากสมุดคำสั่ง ไม่ว่าทั้งหมดหรือบางส่วน
- Trade หรือ fill: คำสั่งซื้อขายเชิงรุก (aggressive order) จับคู่กับ ID ที่วางรออยู่หนึ่งรายการหรือมากกว่า ทำให้จำนวนหุ้นในคำสั่งเหล่านั้นลดลงหรือหายไป
MBP ไม่มีคำศัพท์เหล่านี้เลย การอัปเดตของ MBP เป็นเพียงการแจ้งสถานะของระดับราคาว่า ณ ขณะนี้มีจำนวนหุ้นเท่าใด ไม่ว่าจำนวนหุ้นจะหายไปจากการยกเลิก (cancel) หรือการจับคู่ (fill) การอัปเดตที่แสดงออกมาจะเหมือนกันทุกประการ แผงข้อมูลด้านล่างแสดงขีดจำกัดดังกล่าวบนสมุดคำสั่งที่บางที่สุดเท่าที่จะเป็นไปได้ คือข้อมูล top of book แบบรวมยอด โดยมีหนึ่งระดับราคาต่อฝั่งและเป็น MBP-1 ตามชื่อเรียกนี้
SQL เบื้องหลังตัวเลขแต่ละตัว
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)ในช่วงครึ่งชั่วโมงนั้น 17.6% ของข้อความทำให้ราคาเสนอซื้อที่ดีที่สุดเปลี่ยนไป 17.4% เป็นการเพิ่มจำนวนหุ้นที่ราคาเสนอซื้อเดิม 12% เป็นการลดจำนวนหุ้นที่ราคาเสนอซื้อเดิม และ 53% ปล่อยให้ราคาเสนอซื้อคงเดิมในขณะที่อีกฝั่งขยับไป แต่ละกลุ่มเป็นข้อความสรุปยอดสุทธิเกี่ยวกับระดับราคาหนึ่งๆ โดยไม่มีการระบุ ID คำสั่งซื้อขาย และไม่มีการคำนวณใดที่จะกู้คืน ID ที่หายไปได้
สิ่งที่แต่ละ schema สามารถและไม่สามารถตอบได้
MBP-10 ตอบคำถามที่ว่า "มีจำนวนหุ้นอยู่เท่าใด" ได้แก่ รูปทรงของตารางราคา ความไม่สมดุลของสมุดคำสั่ง (book imbalance) สภาพคล่องที่วางรออยู่ใกล้ราคาตลาด และตัวกราฟความลึกเอง ระดับราคาที่รวมยอดแล้วเพียงพอสำหรับคำถามเหล่านี้ทั้งหมด
MBO ตอบคำถามที่ว่า "เกิดอะไรขึ้นกับคำสั่งซื้อขายนี้" ได้แก่ มีจำนวนหุ้นวางรออยู่ข้างหน้าคุณเท่าใดเมื่อคุณส่งคำสั่งเข้าไป คำสั่งซื้อขายอยู่รอดนานแค่ไหนก่อนจะถูกยกเลิก และความน่าจะเป็นที่คำสั่งซื้อขายแบบ passive ที่ราคาตลาดจะถูกจับคู่ก่อนที่ราคาจะขยับหนีไป ปริมาณเหล่านี้ไม่มีอยู่ในรูปแบบรวมยอด และการรวมคำสั่งซื้อขายเข้าเป็นยอดรวมระดับราคาจะทำลายลำดับที่กำหนดคำสั่งเหล่านั้นไปจนหมดสิ้น
ตำแหน่งในคิว (queue position) คือตัวอย่างที่ชัดเจนที่สุด และมีความหมายเฉพาะภายใต้ การจับคู่แบบ price-time priority เทียบกับ pro-rata ซึ่งลำดับการเข้ามาถึงเป็นตัวตัดสินว่าใครจะได้จับคู่ก่อน สิ่งที่ทำให้เรื่องนี้สำคัญคือขนาดของการจับคู่ (print size) เนื่องจากระดับราคาหนึ่งจะถูกเติมเต็มด้วยการจับคู่ย่อยๆ หลายรายการ ไม่ใช่รายการใหญ่เพียงรายการเดียว
SQL เบื้องหลังตัวเลขแต่ละตัว
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)การจับคู่ที่ต่ำกว่า 100 หุ้น หรือ odd lot คิดเป็น 92.3% ของการซื้อขายในช่วงเวลานั้น และกลุ่มที่ใหญ่ที่สุดคือ 1000 or more shares คิดเป็น 0.1% หากฟีดการจับคู่ขนาดนั้นไปยังระดับราคาที่แสดงหุ้น 4,000 หุ้น คำสั่งที่เข้ามาต่อคิวเป็นลำดับสุดท้ายอาจต้องรอผ่านการจับคู่ไปหลายสิบรายการโดยที่ยังไม่ถูกจับคู่ MBP แสดงให้คุณเห็นตัวเลข 4,000 แต่ MBO แสดงให้คุณเห็นลำดับแถว
ไม่มี schema ใดแสดงจำนวนหุ้นที่ซ่อนอยู่ คำสั่งซื้อขายแบบ iceberg จะแสดงจำนวนหุ้นเพียงเล็กน้อยและรีเฟรชด้วย ID ใหม่ทุกครั้งที่จำนวนหุ้นที่แสดงถูกจับคู่จนหมด ดังนั้นจำนวนหุ้นสำรองจึงไม่ปรากฏในข้อความใดๆ เลย
การสร้างสมุดคำสั่งใหม่จาก MBO คือ state machine
ฟีด MBP มอบคำตอบให้คุณสำเร็จรูป แต่ฟีด MBO มอบข้อมูลนำเข้าให้คุณและคาดหวังให้คุณประมวลผลได้อย่างถูกต้องแม่นยำ:
- เริ่มต้นจาก snapshot หรือจากสมุดคำสั่งที่ว่างเปล่าบวกกับข้อความล้างข้อมูลของตลาด
- นำการดำเนินการ Add, Modify, Cancel และ Fill ทุกรายการมาใช้ตามลำดับที่เคร่งครัด โดยอ้างอิงจาก ID คำสั่งซื้อขาย
- รักษาดัชนีชุดที่สองตามระดับราคา เนื่องจากเป็นสิ่งที่กลยุทธ์ของคุณใช้อ่านข้อมูล
- ติดตามเลขลำดับ (sequence numbers) และทำการซิงค์ใหม่จาก snapshot ล่าสุดทุกครั้งที่พบว่ามีข้อมูลขาดหายไป
โหมดความล้มเหลวของระบบนี้จะเงียบเชียบ หากคุณพลาดข้อความ Cancel ไปหนึ่งรายการ คำสั่งซื้อขายที่เป็นผีจะค้างอยู่ในสมุดคำสั่งของคุณไปตลอดช่วงการซื้อขาย ทำให้ระดับราคานั้นสูงเกินจริงโดยไม่มีการแจ้งเตือนใดๆ ทั้งสิ้น ในขณะที่ MBP จะเสื่อมสภาพอย่างนุ่มนวลกว่ามาก เพราะการอัปเดตแต่ละครั้งจะระบุยอดรวมของระดับราคาใหม่ ดังนั้นค่าที่ผิดพลาดจะถูกเขียนทับภายในเวลาเพียงไม่กี่ข้อความ
นอกจากนี้ MBO ยังมีอยู่เฉพาะในฟีดตรงจากตลาด (direct venue feeds) ซึ่งหมายถึงหนึ่งสมุดคำสั่งต่อหนึ่งตลาด ดังนั้นคุณจึงต้องรันและรวมข้อมูลจากหลายแหล่งเข้าด้วยกัน ข้อมูล consolidated tape เป็นเพียงการสรุปโดยโครงสร้าง ซึ่งเป็นประเด็นที่อธิบายไว้ใน SIP เทียบกับฟีดตรงจากตลาด
ต้นทุนของรายละเอียดที่เพิ่มขึ้นในแบนด์วิดท์
จำนวนข้อความคือวิธีที่ซื่อตรงที่สุดในการประเมินความแตกต่างของราคา แผงข้อมูลด้านล่างนับจำนวนข้อความ top-of-book แบบรวมยอดเทียบกับการจับคู่จริงในช่วงครึ่งชั่วโมงเดียวกันสำหรับหุ้นห้าตัวที่เป็นที่รู้จักกันดี
SQL เบื้องหลังตัวเลขแต่ละตัว
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 มีปริมาณการรับส่งข้อมูล quote ต่อการจับคู่สูงที่สุด โดยมี 9.6 ข้อความต่อการซื้อขายหนึ่งครั้ง และ 510 พันข้อความในเวลาสามสิบนาที ความแตกต่างระหว่างหุ้นทั้งห้าตัวนั้นกว้างมาก ที่ด้านล่างของแผงข้อมูล MSFT มีข้อความ quote เพียง 0.7 ข้อความต่อการจับคู่ ซึ่งน้อยกว่าหนึ่งข้อความต่อการซื้อขายหนึ่งครั้ง โปรดจำไว้ว่าคอลัมน์นั้นนับอะไร: หนึ่งระดับราคาต่อฝั่ง บนฟีดที่รวมทุกตลาดเข้าเป็นราคาเสนอซื้อและเสนอขายที่ดีที่สุดเพียงราคาเดียว ผลิตภัณฑ์ที่มีความลึกสิบระดับจะคูณจำนวนนี้ขึ้นไปอีก และฟีดแบบรายคำสั่งจะคูณมันเข้าไปอีกครั้ง เพราะคำสั่งซื้อขายแต่ละรายการที่อยู่เบื้องหลังแต่ละระดับราคาในแต่ละตลาดจะสร้างการ Add, Modify และ Cancel ของตัวเอง ไม่ว่ามันจะถูกจับคู่หรือไม่ก็ตาม การคำนวณแบบเดียวกันนี้ปรากฏในสเกลที่ใหญ่กว่าใน ขนาดของฟีด quote ออปชัน
กลยุทธ์ของคุณต้องการฟีด order book แบบใด?
งานส่วนใหญ่รันบน MBP-10 ได้ กราฟความลึก ฟีเจอร์ความไม่สมดุล การวัดสภาพคล่อง ณ ระดับราคา แบบจำลองต้นทุนการซื้อขาย และคำถามวิจัยเกือบทุกข้อเกี่ยวกับจำนวนหุ้นที่วางรออยู่ ณ ที่ใด สามารถหาคำตอบได้จากระดับราคาที่รวมยอดแล้ว โดยใช้ปริมาณข้อความเพียงเศษเสี้ยวเดียว
MBO เป็นสิ่งจำเป็นเมื่อคำตอบขึ้นอยู่กับคำสั่งซื้อขายเฉพาะรายการ เช่น ตำแหน่งในคิว อายุของคำสั่งซื้อขาย พฤติกรรมการยกเลิก และความน่าจะเป็นในการจับคู่แบบ passive ที่ราคาตลาด กลยุทธ์ที่ตัดสินความเป็นความตายจากการที่คำสั่งซื้อขายของคุณอยู่ในคิวลึก 200 หุ้นหรือ 20,000 หุ้น ไม่สามารถหาคำตอบได้จากข้อมูลที่รวมยอดแล้ว และคุณต้องจ่ายต้นทุนในส่วนของค่าธรรมเนียมใบอนุญาต แบนด์วิดท์ พื้นที่จัดเก็บข้อมูล และวิศวกรรมที่ต้องใช้เพื่อให้สมุดคำสั่งที่สร้างขึ้นใหม่มีความถูกต้องตลอดทั้งวัน
วิธีการสร้างแผงข้อมูลเหล่านี้
- ฟีดที่อยู่เบื้องหลังทุกแผงคือข้อมูล consolidated top of book แบบหนึ่งระดับราคาต่อฝั่ง บวกกับข้อมูลการซื้อขาย (trade tape) นี่ไม่ใช่ฟีดความลึกและไม่ใช่ฟีดแบบรายคำสั่ง ดังนั้นแผงข้อมูลเหล่านี้จึงแสดงให้เห็นถึงประเด็นเรื่องปริมาณข้อความมากกว่าการสุ่มตัวอย่างข้อมูล MBO โดยตรง
- ช่วงเวลาถูกกำหนดไว้ที่วันที่ในอดีต คือ 10:00 ถึง 10:30 น. ตามเวลา ET ของวันที่ 16 มิถุนายน 2026 ซึ่งจัดเก็บไว้เป็น 14:00 ถึง 14:30 น. UTC การกำหนดช่วงเวลาที่แน่นอนช่วยให้ตัวเลขมีความเสถียรในการสร้างข้อมูลใหม่
- แผงการจำแนกประเภทจะระบุป้ายกำกับข้อความแต่ละรายการเทียบกับข้อความก่อนหน้าตามลำดับ มันไม่สามารถแยกการยกเลิก (cancel) ออกจากการจับคู่ (fill) ได้ ซึ่งเป็นข้อจำกัดที่บทความนี้อธิบายไว้
คำถามที่พบบ่อย
ข้อมูลตลาด MBO และ MBP แตกต่างกันอย่างไร?
MBP หรือ market by price จะรวมยอดจำนวนหุ้นที่แสดงในแต่ละระดับราคาและส่งการอัปเดตหนึ่งครั้งต่อระดับราคา ส่วน MBO หรือ market by order จะส่งคำสั่งซื้อขายทุกรายการพร้อม ID ประจำคำสั่ง รวมถึงเหตุการณ์ Add, Modify, Cancel และ Fill ที่เกิดขึ้นกับคำสั่งนั้น
ข้อมูล Level 2 เหมือนกับข้อมูล MBO หรือไม่?
โดยปกติแล้วไม่เหมือนกัน "Level 2" ที่โบรกเกอร์รายย่อยมักหมายถึงข้อมูลความลึกแบบรวมยอด ซึ่งก็คือ MBP ที่มีระดับราคาห้าถึงยี่สิบระดับ ผู้ให้บริการบางรายทำการตลาดฟีดแบบรายคำสั่งภายใต้ชื่อระดับชั้นเดียวกัน ดังนั้นชื่อ schema ไม่ใช่ชื่อระดับชั้น จึงเป็นตัวตัดสินว่าข้อมูลใดจะถูกส่งมาถึงคุณ
ฟีด MBO ใหญ่กว่าฟีด MBP มากแค่ไหน?
ใหญ่กว่าหลายเท่าตัว โดยแปรผันตามตลาดและสัญลักษณ์หุ้น ข้อมูล consolidated top of book เพียงอย่างเดียวมีปริมาณถึง 9.6 ข้อความต่อการจับคู่สำหรับหุ้นที่มีการซื้อขายหนาแน่นที่สุดในแผงข้อมูลด้านบน ฟีดแบบรายคำสั่งจะเพิ่มการ Add, Modify และ Cancel ทุกรายการที่อยู่เบื้องหลังทุกระดับราคาในทุกตลาด รวมถึงคำสั่งซื้อขายส่วนใหญ่ที่ไม่เคยถูกจับคู่เลย
คุณสามารถสร้างสมุดคำสั่ง MBP ขึ้นใหม่จากข้อมูล MBO ได้หรือไม่?
ได้ และนั่นคือขั้นตอนการทำงานปกติ: นำเหตุการณ์คำสั่งซื้อขายแต่ละรายการไปใช้กับสมุดคำสั่งที่อ้างอิงด้วย ID คำสั่งซื้อขาย จากนั้นจึงเผยแพร่ยอดรวมระดับราคา แต่ในทางกลับกันนั้นเป็นไปไม่ได้ เมื่อคำสั่งซื้อขายถูกรวมยอดเข้าเป็นระดับราคาแล้ว ID รายบุคคลและลำดับการเข้ามาถึงของคำสั่งเหล่านั้นจะหายไป
แผงข้อมูลทุกแผงที่นี่มาพร้อมกับ SQL ที่ใช้สร้างข้อมูลนั้นโดยตรง หากต้องการนับข้อความเดียวกันในสัญลักษณ์หุ้นหรือช่วงเวลาอื่น สามารถสอบถามคำถามด้วยภาษาอังกฤษทั่วไปได้ที่เทอร์มินัล Strasmore