วิธีประเมินลำดับคิวจากข้อมูล L2 ในตลาดหุ้น
ลำดับคิวเป็นตัวกำหนดว่าคำสั่งซื้อขายแบบ Passive จะได้รับส่วนต่างราคาหรือไม่ เรียนรู้วิธีประมาณการจากข้อมูล Order Book แบบรวมและปัจจัยในการเลือกใช้ข้อมูล MBO แทน
เหตุใดลำดับคิว (Queue Position) จึงเป็นความได้เปรียบทั้งหมด
คำสั่งซื้อขายแบบ Passive จะค้างอยู่ในสมุดคำสั่งซื้อ (Order Book) เพื่อรอให้ผู้อื่นเข้ามาจับคู่ด้วย ภายใต้หลักการ price-time priority ระบบจับคู่จะจัดลำดับคำสั่งที่ค้างอยู่โดยพิจารณาจากราคาเป็นอันดับแรก และเวลาที่ส่งคำสั่งเข้ามาเป็นอันดับที่สอง หากมีคำสั่งซื้อที่ราคา $10.00 อยู่แล้ว 10,000 หุ้น และคุณส่งคำสั่งเพิ่มเข้าไปอีก 100 หุ้นต่อท้าย คำสั่ง 10,000 หุ้นเหล่านั้นจะต้องถูกจับคู่หรือยกเลิกไปก่อนถึงจะถึงคิวของคุณ หากคุณยกเลิกแล้วส่งคำสั่งใหม่ที่ราคาเดิม คุณจะต้องไปต่อท้ายแถวใหม่อีกครั้ง
การจัดลำดับนี้เป็นตัวกำหนดผลลัพธ์ทางเศรษฐศาสตร์ หากคุณอยู่ใกล้ต้นแถว คุณจะได้รับการจับคู่บ่อยครั้งและได้รับส่วนต่างราคา (Spread) บวกกับค่าธรรมเนียมคืน (Rebate) สำหรับการเพิ่มสภาพคล่อง ซึ่งเป็นหัวข้อของ maker-taker fees and rebates หากคุณอยู่ท้ายแถว คุณจะได้รับการจับคู่ก็ต่อเมื่อคำสั่งซื้อขายฝั่งตรงข้ามเข้ามาในปริมาณมากเท่านั้น ซึ่งมักเกิดขึ้นในช่วงเวลาที่ราคากำลังจะขยับผ่านระดับราคาของคุณไป การจับคู่ที่ท้ายแถวจะกระจุกตัวอยู่ในช่วงเสี้ยววินาทีก่อนที่ราคาจะขยับผ่านระดับของคุณไป ราคาเดียวกัน คำสั่งเดียวกัน แต่ผลลัพธ์ทางธุรกิจต่างกันโดยสิ้นเชิง
สิ่งที่ข้อมูล Level 2 แสดงได้และแสดงไม่ได้
Level 1 คือราคาเสนอซื้อและเสนอขายที่ดีที่สุดพร้อมปริมาณที่แต่ละระดับราคา ส่วน Level 2 หรือที่เรียกว่า Market by Price จะเพิ่มความลึกของข้อมูลเข้าไปด้วย คือรายการระดับราคาพร้อมปริมาณรวมที่ค้างอยู่ในแต่ละระดับ ข้อมูลทั้งสองประเภทเป็นการรวมยอด และ Level 1 vs Level 2 market data ได้เปรียบเทียบความแตกต่างไว้อย่างครบถ้วน เมื่อคำสั่งซื้อที่ราคา $10.00 ลดลงจาก 10,000 หุ้นเหลือ 8,500 หุ้น ข้อมูลจะรายงานว่ามี 1,500 หุ้นหายไป แต่ไม่ได้ระบุว่าหุ้นเหล่านั้นถูกจับคู่ไป หรือเป็นคำสั่งซื้อที่ถูกยกเลิกไปหนึ่งรายการหรือสี่สิบรายการ หรือคำสั่งเหล่านั้นเคยอยู่ในลำดับใดของคิว
การจับคู่ซื้อขาย (Executions) คือส่วนที่มองเห็นได้ชัดเจน เนื่องจากเทปบันทึกการซื้อขาย (Tape) จะพิมพ์ทุกรายการที่มีการจับคู่พร้อมระบุขนาด คุณจึงหักลบยอดส่วนนี้ได้อย่างแม่นยำ ส่วนที่เหลือคือการยกเลิกคำสั่ง และการยกเลิกนี่เองคือจุดเริ่มต้นของการคาดเดา แผงข้อมูลด้านล่างนี้เปรียบเทียบจำนวนข้อความที่ระดับราคาดีที่สุด (Top of Book) กับรายการที่พิมพ์บนเทปสำหรับหุ้นที่มีสภาพคล่องตัวหนึ่งในช่วงการซื้อขายปกติ วันพุธที่ 10 มิถุนายน 2026
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
q.et_time AS et_time,
q.quote_updates AS quote_updates,
t.trades AS trades,
round(q.quote_updates / t.trades, 1) AS updates_per_trade
FROM
(
SELECT
formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
count() AS quote_updates
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 12:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY et_time
) AS q
INNER JOIN
(
SELECT
formatDateTime(toStartOfHour(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS trade_hour,
count() AS trades
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 12:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY trade_hour
) AS t ON q.et_time = t.trade_hour
ORDER BY et_timeชั่วโมง 08:00 อยู่ก่อนระฆังเปิดตลาด: ระดับราคาดีที่สุดมีการเปลี่ยนแปลง 0.8 ครั้งต่อการพิมพ์หนึ่งรายการ ซึ่งเป็นจำนวนข้อความที่น้อยกว่าจำนวนรายการที่พิมพ์ ในช่วงการซื้อขายปกติ อัตราส่วนนี้จะกลับกัน ในชั่วโมง 15:00 ระดับราคาดีที่สุดมีการเปลี่ยนแปลง 1.6 ครั้งต่อการพิมพ์หนึ่งรายการ จากข้อความทั้งหมด 233433 ข้อความในชั่วโมงนั้นเพียงชั่วโมงเดียว สิ่งที่เกิดขึ้นกับระดับราคาในตลาดเปิดส่วนใหญ่คือการที่คำสั่งซื้อขายเข้ามาและออกไปโดยไม่มีการจับคู่ และเหตุการณ์แต่ละอย่างนั้นทำให้ลำดับคิวของคุณขยับไปในปริมาณที่ไม่มีข้อมูลรวมยอดใดระบุไว้
สมมติฐานการยกเลิกแบบสม่ำเสมอ และจุดที่ทำให้คุณเข้าใจผิด
การคำนวณเบื้องต้นแบบมาตรฐานจะสมมติว่าการยกเลิกคำสั่งกระจายตัวอย่างสม่ำเสมอทั่วทั้งคิว ให้ x แทนสัดส่วนความลึกของคุณ คือจำนวนหุ้นที่อยู่ข้างหน้าคุณหารด้วยปริมาณรวมที่ค้างอยู่ในระดับราคาของคุณ แบบจำลองแบบสม่ำเสมอจะกำหนดโอกาสที่หุ้นที่ถูกยกเลิกจะอยู่ข้างหน้าคุณเท่ากับ x หรือเขียนได้ว่า p(x) = x หากคุณนั่งอยู่กึ่งกลางของคิว 10,000 หุ้น และเห็นหุ้น 1,000 หุ้นถูกยกเลิกโดยไม่มีการจับคู่ แบบจำลองจะเลื่อนลำดับของคุณขึ้นไป 500 ลำดับ
ในความเป็นจริง คิวมีความเบี่ยงเบน คำสั่งที่ค้างอยู่นานมักเป็นของผู้ที่ต้องการรอจริง ๆ ในขณะที่คำสั่งที่เพิ่งเข้ามาเมื่อครู่มีโอกาสสูงที่จะเป็นคำสั่งชั่วคราวที่หายไปภายในไม่กี่วินาที การยกเลิกคำสั่งจะกระจุกตัวอยู่บริเวณท้ายแถว ใกล้กับตำแหน่งของคุณและหลังคุณ จากหุ้น 1,000 หุ้นที่ถูกยกเลิก อาจมีเพียง 200 หุ้นที่อยู่ข้างหน้าคุณ แต่แบบจำลองกลับให้เครดิตคุณถึง 500 ลำดับ หากทำเช่นนี้ซ้ำ ๆ ตลอดทั้งวัน คิวจำลองจะขยับเร็วกว่าคิวจริง ข้อผิดพลาดนี้ส่งผลทางเดียวคือ: คุณจะเห็นการจับคู่มากกว่าและในจังหวะที่ดีกว่าที่คำสั่งจริงจะได้รับ
วิธีการที่คิวลดลง
การยกเลิกคำสั่งทำให้คุณขยับตำแหน่งโดยมองไม่เห็น ส่วนการจับคู่ซื้อขายทำให้คุณขยับตำแหน่งโดยมองเห็นได้ชัดเจนผ่านขนาดของรายการที่พิมพ์
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
multiIf(size < 100, 'under 100 shares',
size = 100, 'exactly 100 shares',
size <= 499, '101 to 499 shares',
size <= 999, '500 to 999 shares',
'1000 shares or more') AS trade_size_group,
round(100 * count() / sum(count()) OVER (), 1) AS share_of_prints_pct,
round(100 * sum(size) / sum(sum(size)) OVER (), 1) AS share_of_shares_pct
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 14:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
GROUP BY trade_size_group
ORDER BY min(size)รายการที่พิมพ์ต่ำกว่าหนึ่งหน่วยการซื้อขายมาตรฐาน (Round lot) คิดเป็น 90% ของจำนวนทั้งหมดในรอบนี้ และ 42.5% ของจำนวนหุ้น ส่วนรายการขนาดใหญ่ตั้งแต่หนึ่งพันหุ้นขึ้นไปคิดเป็น 0.2% ของรายการที่พิมพ์ และ 19.9% ของปริมาณการซื้อขายทั้งหมด คิวจะลดลงทีละน้อย ดังนั้นช่องว่างระหว่างลำดับที่ 2,000 กับ 3,500 จึงต้องอาศัยการรอคอยรายการที่พิมพ์หลายร้อยรายการ โปรแกรมจำลองที่ให้การจับคู่หลังจากมีการซื้อขายขนาดใหญ่สองรายการได้ข้ามข้อมูลส่วนใหญ่บนเทปไปแล้ว
คำสั่งที่คุณมองไม่เห็น
ข้อมูลความลึก (Depth feeds) มักมีการจำกัดจำนวน หากคุณได้รับข้อมูลสิบระดับราคาและคำสั่งของคุณค้างอยู่ที่ระดับที่สิบเอ็ด คำสั่งของคุณจะอยู่นอกเหนือข้อมูลที่เห็น: ไม่ทราบปริมาณที่อยู่ข้างหน้า และไม่ทราบคำสั่งที่ต่อท้ายเข้ามา ในจุดนั้นคุณกำลังสร้างตัวเลขขึ้นมาเองมากกว่าการประมาณการ สถานการณ์นี้เป็นเรื่องปกติไม่ใช่เรื่องแปลก เพราะคำสั่งที่ไม่ไล่ตามตลาดจะหลุดออกจากระดับราคาด้านในอย่างรวดเร็ว
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
formatDateTime(toStartOfFifteenMinutes(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
round(avg(toFloat64(bid_price)), 2) AS best_bid,
uniqExact(bid_price) AS bid_levels_touched
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= '2026-06-10 14:00:00'
AND sip_timestamp < '2026-06-10 20:00:00'
AND bid_price > 0
GROUP BY et_time
ORDER BY et_timeในกลุ่ม 10:00 ราคาเสนอซื้อที่ดีที่สุดเฉลี่ยอยู่ที่ $290.29 และมีการเปลี่ยนแปลงไปถึง 187 ระดับราคาที่แตกต่างกันภายในสิบห้านาที ราคาแต่ละระดับคือระดับราคาที่แยกจากกันสำหรับหุ้นที่เสนอราคาเป็นเซนต์ ดังนั้นข้อมูลที่แสดงสิบระดับจึงครอบคลุมช่วงราคาเพียงสิบเซนต์ คำสั่งที่ค้างอยู่ที่ราคาหนึ่งตลอดช่วงการซื้อขายแบบนี้อาจต้องอยู่ในระดับที่ลึกเกินกว่าที่เจ้าของจะมองเห็นได้เป็นเวลานาน
จุดที่ลำดับคิวมีค่ามากที่สุด
ลำดับคิวมีค่ามากที่สุดในกรณีที่ไม่สามารถปรับปรุงราคาได้ หุ้นที่ติดอยู่ที่ส่วนต่างราคาหนึ่งเซนต์ไม่มีช่องว่างให้แซงคิวด้วยราคาที่ดีกว่า: ทุกคนต่างวางคำสั่งที่ระดับราคาเดียวกัน และเวลาที่ส่งคำสั่งเข้ามาจะเป็นตัวตัดสินส่วนที่เหลือ ในกรณีที่ส่วนต่างราคากว้างหลายเซนต์ นักเทรดสามารถแซงหน้าคิวทั้งหมดได้ด้วยการเพิ่มราคาเพียงหนึ่งเซนต์ และการตัดสินใจเรื่องราคาก็มีความสำคัญเหนือกว่าลำดับคิว
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price - bid_price)) * 100, 2) AS avg_spread_cents,
round(100 * countIf(round(toFloat64(ask_price - bid_price) * 100) <= 1) / count(), 1) AS one_cent_pct
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'KO', 'NVDA', 'MSFT', 'BKNG')
AND sip_timestamp >= '2026-06-10 15:00:00'
AND sip_timestamp < '2026-06-10 19:00:00'
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY avg_spread_centsตลอดสี่ชั่วโมงในช่วงกลางวันของรอบเดียวกัน หุ้นที่แคบที่สุดในหกชื่อ คือ KO มีส่วนต่างราคาเฉลี่ย 1.18 เซนต์ และแสดงส่วนต่างราคาหนึ่งเซนต์ใน 82.5% ของการอัปเดตทั้งหมด ส่วนหุ้นที่กว้างที่สุด คือ MSFT มีค่าเฉลี่ย 8.46 เซนต์ โดยมีส่วนต่างราคาหนึ่งเซนต์ใน 1.1% ของการอัปเดต แบบจำลองคิวที่ปรับเทียบกับชื่อแรกจะไม่สามารถใช้กับชื่อที่สองได้ คำสั่งที่ค้างอยู่ระหว่างราคาเสนอซื้อและเสนอขาย ซึ่งครอบคลุมใน midpoint peg orders จะสร้างคิวของตัวเองภายใต้กฎเดียวกัน
การวินิจฉัยสี่ประการสำหรับการทดสอบย้อนหลังของคุณ
- เปรียบเทียบอัตราการจับคู่จำลองกับอัตราการจับคู่จริงของคุณในหุ้นตัวเดียวกันในช่วงเวลาเดียวกัน โปรแกรมจำลองที่จับคู่ได้ 70% ของคำสั่งซื้อขาย ในขณะที่ของจริงจับคู่ได้เพียง 40% กำลังอธิบายสมมติฐานของคุณ ไม่ใช่ตลาดจริง
- แบ่งการจับคู่จำลองออกเป็นสองกลุ่ม: กลุ่มที่ระดับราคายังคงอยู่หลังจากนั้น และกลุ่มที่เกิดขึ้นเฉพาะตอนที่ระดับราคานั้นถูกกวาดไปจนหมด กลุ่มที่ให้น้ำหนักกับแบบที่สองหมายความว่าโปรแกรมจำลองให้การจับคู่แก่คุณทันทีที่ราคาขยับผ่านคุณไป
- กำหนดขอบเขตของสมมติฐาน ให้รันโปรแกรมใหม่โดยสมมติว่าการยกเลิกคำสั่งทั้งหมดมาจากด้านหน้าของคิว จากนั้นรันอีกครั้งโดยสมมติว่ามาจากด้านหลัง การรันทั้งสองแบบนี้คือกรอบความผิดพลาดที่แท้จริงรอบค่า p(x) ที่คุณเลือก
- วัดว่าราคาของคุณอยู่นอกเหนือความลึกของข้อมูลที่คุณได้รับบ่อยแค่ไหน การจับคู่ที่เกิดขึ้นตรงนั้นคือสิ่งที่คุณสร้างขึ้นเอง Look-ahead bias in backtesting อธิบายความล้มเหลวเดียวกันนี้จากอีกมุมหนึ่ง: ผลลัพธ์ที่ขึ้นอยู่กับข้อมูลที่กลยุทธ์ไม่เคยมีจริง
เมื่อใดควรหยุดสร้างแบบจำลองและซื้อข้อมูลคำสั่งซื้อขาย
ข้อมูล Market-by-order (MBO) จะมีข้อความสำหรับคำสั่งซื้อขายแต่ละรายการ ตั้งแต่ช่วงที่เข้ามาจนถึงช่วงที่จับคู่หรือยกเลิก โดยแต่ละรายการจะมีรหัสระบุตัวตนเฉพาะ หากคุณเล่นข้อมูลย้อนหลังนี้ ลำดับของคุณในคิวจะเป็นตัวเลขที่นับได้จริงแทนที่จะเป็นการประมาณการ เมื่อคุณสมมติความล่าช้าที่สมเหตุสมผลสำหรับคำสั่งของคุณที่ส่งไปยังตลาด ข้อมูลนี้มีราคาสูงกว่าข้อมูลความลึกและใช้พื้นที่จัดเก็บมากกว่ามาก
การวินิจฉัยข้อที่ 3 คือกฎการตัดสินใจ หากกรอบทั้งด้านหน้าและด้านหลังยังคงทำให้กลยุทธ์มีกำไร สมมติฐานตรงกลางก็ถือว่าใช้ได้ แต่ถ้ากลยุทธ์ทำกำไรได้ภายใต้กรอบหนึ่งและขาดทุนภายใต้อีกกรอบหนึ่ง แสดงว่าแบบจำลองคิวคือตัวกลยุทธ์เอง และการซื้อข้อมูลแบบคำสั่งต่อคำสั่งนั้นคุ้มค่ากว่าการปกป้องการคาดเดา
ตลาดแบบ Pro-rata เปลี่ยนคำถาม
ตลาดฟิวเจอร์สและออปชันบางแห่งจะแบ่งคำสั่งซื้อขายที่เข้ามาให้กับคำสั่งที่ค้างอยู่ตามสัดส่วนของขนาดแทนที่จะเป็นลำดับเวลา เวลาจึงมีความสำคัญน้อยกว่ามากในตลาดเหล่านี้ และขนาดที่เสนอราคาจะกลายเป็นตัวแปรสำคัญ: การเพิ่มขนาดคำสั่งของคุณเป็นสองเท่าจะทำให้คุณได้รับส่วนแบ่งการจับคู่เพิ่มขึ้นประมาณสองเท่า ความล้มเหลวของแบบจำลองจะเปลี่ยนไปตามนั้น ไปสู่การเสนอขนาดที่มากกว่าที่คุณต้องการถือครอง Why options orders do not get filled ครอบคลุมถึงลักษณะดังกล่าวจากมุมมองของนักลงทุนรายย่อยในสมุดคำสั่งออปชัน
คำถามที่พบบ่อย
ลำดับคิว (Queue position) ในการเทรดคืออะไร?
ลำดับคิวคืออันดับของคุณในบรรดาคำสั่งซื้อขายที่ค้างอยู่ที่ราคาเดียวกันบนตลาดเดียวกัน ในสมุดคำสั่งซื้อที่ใช้หลักการ price-time priority คำสั่งที่อยู่ข้างหน้าคุณจะต้องถูกจับคู่หรือยกเลิกไปก่อน คำสั่งของคุณจึงจะถูกจับคู่ได้
คุณสามารถคำนวณลำดับคิวจากข้อมูล Level 2 ได้หรือไม่?
ไม่ได้อย่างแม่นยำ Level 2 แสดงปริมาณรวมต่อระดับราคาโดยไม่มีการระบุตัวตนของคำสั่ง ดังนั้นเมื่อปริมาณหายไปโดยไม่มีการพิมพ์รายการจับคู่ คุณไม่สามารถบอกได้ว่าหุ้นเหล่านั้นอยู่ข้างหน้าคุณหรือข้างหลังคุณ คุณสามารถประมาณการตัวเลขและกำหนดกรอบของการประมาณการได้ แต่ตัวเลขที่แน่นอนต้องใช้ข้อมูลแบบคำสั่งต่อคำสั่ง (Order-by-order)
เหตุใดอัตราการจับคู่ในการทดสอบย้อนหลัง (Backtest) มักจะสูงเกินไป?
สมมติฐานทั่วไปคือการกระจายการยกเลิกคำสั่งอย่างสม่ำเสมอทั่วทั้งคิว ในขณะที่การยกเลิกจริงจะกระจุกตัวอยู่บริเวณท้ายแถว แบบจำลองที่กระจายตัวอย่างสม่ำเสมอจะทำให้คำสั่งจำลองของคุณขยับเร็วกว่าคิวจริง ซึ่งปรากฏออกมาเป็นการจับคู่ที่มากกว่าและดีกว่าการเทรดจริง
ข้อมูล MBO คืออะไร?
ข้อมูล Market-by-order ให้ข้อความสำหรับคำสั่งซื้อขายแต่ละรายการ ตั้งแต่การเข้ามาจนถึงการจับคู่หรือยกเลิก เป็นข้อมูลที่ลำดับของคุณในคิวสามารถนับได้จริงแทนที่จะเป็นการสร้างแบบจำลอง ซึ่งมีความสำคัญที่สุดสำหรับกลยุทธ์ที่อยู่ในส่วนต่างราคาเพียงหนึ่งช่อง (One-tick spread)
ลำดับคิวมีความสำคัญในตลาดแบบ Pro-rata หรือไม่?
น้อยกว่า ตลาดแบบ Pro-rata จะแบ่งคำสั่งซื้อขายที่เข้ามาให้กับคำสั่งที่ค้างอยู่ตามขนาด ดังนั้นการส่งคำสั่งมาก่อนจึงช่วยคุณได้น้อย และขนาดที่เสนอราคาจะเป็นตัวตัดสิน การตรวจสอบว่าตลาดใช้แบบจำลองการจัดสรรแบบใดจึงต้องทำก่อนการสร้างแบบจำลองคิวใด ๆ
แผงข้อมูลทุกแผงที่นี่มีโค้ด SQL ที่ใช้สร้างข้อมูลนั้น เปลี่ยน Ticker เปลี่ยนวันที่ และถามคำถามเดียวกันเกี่ยวกับชื่อหุ้นที่คุณเทรดบนเทอร์มินัล Strasmore