ทำไมคำสั่งซื้อขาย Options ถึงไม่ได้รับการจับคู่
ทำความเข้าใจปัจจัยที่ทำให้คำสั่งซื้อขาย Options ของคุณไม่ได้รับการจับคู่ ทั้งกฎการจัดสรรของตลาดหลักทรัพย์ ขนาดคำสั่งที่ค้างอยู่ และกลไกการส่งคำสั่งแบบหลายขาที่ซับซ้อน
สาเหตุที่คำสั่งซื้อขาย Options ของคุณไม่ได้รับการจับคู่ มักเกิดจากกลไกเบื้องหลังที่หน้าจอเทรดรายย่อยไม่แสดงให้เห็น ไม่ว่าจะเป็นตำแหน่งของคำสั่งในคิวการจัดสรรของตลาดหลักทรัพย์ ขนาดของคำสั่งที่ยังคงค้างอยู่ ความกว้างของตลาดจริง หรือความเป็นไปได้ในการจับคู่ราคา Net price ของคำสั่งแบบหลายขา (multi-leg) ราคาที่แสดงบนหน้าจอเป็นเพียงภาพสะท้อนของสิ่งที่ใครบางคนเต็มใจจะซื้อขายในช่วงเวลาหนึ่งเท่านั้น การส่งคำสั่งที่ราคาดังกล่าวเพียงแค่ทำให้คุณเข้าไปอยู่ในคิว แต่ไม่ได้การันตีว่าคุณจะอยู่เป็นลำดับแรก
ราคาเสนอซื้อขาย Options คือคำสัญญาว่าคุณจะซื้อขายได้ที่ราคานั้นใช่หรือไม่
ไม่ใช่ ราคาเสนอ (quote) เป็นข้อเสนอสองด้านที่ผู้ส่งคำสั่งสามารถยกเลิกหรือเปลี่ยนราคาได้ทันที และขนาดที่แสดงไว้ก็ใช้ได้เฉพาะในช่วงเวลานั้นเท่านั้น สำหรับสินทรัพย์อ้างอิงที่มีการซื้อขายคึกคัก ราคา Bid และ Ask ของสัญญาเดียวอาจถูกอัปเดตหลายครั้งต่อวินาที บทความ คู่มือส่วนต่างราคาเสนอซื้อขาย Options ของเราอธิบายถึงความหมายของทั้งสองฝั่ง สิ่งที่ตัดสินว่าคำสั่งจะได้รับการจับคู่หรือไม่ คือระยะเวลาที่ราคาเสนอนั้นคงอยู่
ตารางด้านล่างแสดงจำนวนการอัปเดตราคาเสนอทั้งหมดที่ระบบได้รับสำหรับสัญญา Options ของ Apple ในช่วงเวลา 30 วินาทีที่กำหนด เริ่มตั้งแต่เวลา 14:00:00 น. ตามเวลา ET ในวันที่ 17 มิถุนายน 2026 โดยแบ่งเป็นรายวินาที
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
formatDateTime(toTimeZone(sip_timestamp, 'America/New_York'), '%H:%i:%S') AS et_time,
round(count() / 1000, 1) AS quote_updates_k,
round(count() / uniqExact(ticker), 1) AS updates_per_contract
FROM global_markets.cache_options_quotes
WHERE ticker IN
(
SELECT ticker
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-17'
)
AND sip_timestamp >= toDateTime('2026-06-17 18:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-17 18:00:30', 'UTC')
GROUP BY et_time
ORDER BY et_timeในวินาทีแรก ระบบได้รับข้อมูลการอัปเดตราคาเสนอประมาณ 0.9 พันรายการสำหรับสัญญาเหล่านั้น หรือคิดเป็นประมาณ 1.9 ครั้งต่อสัญญาในหนึ่งวินาที คำสั่งซื้อขายของคุณไม่สามารถเดินทางได้เร็วขนาดนั้น เมื่อการคลิกของคุณกลายเป็นข้อความที่ไปถึงตลาดหลักทรัพย์ สมุดคำสั่งซื้อขาย (order book) ก็เปลี่ยนไปแล้ว
การวางคำสั่งที่ราคาดีที่สุดจะทำให้คุณได้คิวแรกใช่หรือไม่
ไม่เสมอไป ตลาดหลักทรัพย์ส่วนใหญ่ใช้หลักการจัดลำดับตามราคาและเวลา (price-time priority) คือใครมาก่อนที่ราคานั้นจะได้ก่อน แต่ตลาด Options มีกฎเพิ่มเติมอีกสองข้อที่ทำให้คำสั่งที่วางรอไว้ไม่ได้รับการจับคู่
คำสั่งจากลูกค้าทั่วไป (public customer) จะได้รับสิทธิก่อน เกือบทุกตลาด Options ในสหรัฐฯ ให้ความสำคัญกับคำสั่งจากลูกค้าทั่วไปเหนือกว่าคำสั่งจาก Market maker และผู้ซื้อขายมืออาชีพที่วางราคาเดียวกัน ซึ่งส่วนนี้เป็นผลดีต่อเทรดเดอร์รายย่อย
หลังจากให้สิทธิลูกค้าทั่วไปแล้ว การจัดสรรจะใช้วิธีตามสัดส่วน (pro-rata) แทนที่จะเป็นลำดับเวลา คำสั่งซื้อขายที่เข้ามาใหม่จะถูกแบ่งให้กับคำสั่งที่วางรออยู่ตามสัดส่วนของขนาดคำสั่ง โดยมักจะมีส่วนเพิ่มเล็กน้อยให้กับผู้ที่วางราคานั้นเป็นคนแรก ขนาดของคำสั่งจึงเป็นตัวกำหนดสัดส่วน ไม่ใช่เวลาที่มาถึง
เมื่อรวมปัจจัยเหล่านี้ คำสั่งขนาด 1 สัญญาที่วางอยู่ข้างคำสั่งขนาด 500 สัญญา จะถูกนับเป็น 1 ใน 501 สัญญา ไม่ใช่การนับเป็นหนึ่งในสองคำสั่งในคิว คำสั่งซื้อขายขนาด 100 สัญญาที่เข้ามาใหม่จึงสามารถกวาดราคาไปได้โดยที่คำสั่งขนาดเล็กได้รับไปเพียงสัญญาเดียว
ตารางด้านล่างแบ่งกลุ่มการซื้อขาย Options ของ Apple ที่เกิดขึ้นจริงในวันที่ 17 มิถุนายน 2026 ตามขนาดการซื้อขาย แล้วเปรียบเทียบสัดส่วนของจำนวนรายการซื้อขายกับสัดส่วนของจำนวนสัญญาที่ซื้อขายจริงในแต่ละกลุ่ม
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH
(
SELECT count()
FROM global_markets.options_trades
WHERE underlying_symbol = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 00:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')
) AS day_prints,
(
SELECT sum(size)
FROM global_markets.options_trades
WHERE underlying_symbol = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 00:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')
) AS day_contracts
SELECT
multiIf(size = 1, '1 contract',
size <= 5, '2 to 5',
size <= 20, '6 to 20',
size <= 100, '21 to 100',
'over 100') AS size_bucket,
round(100 * count() / day_prints, 2) AS share_of_trades_pct,
round(100 * sum(size) / day_contracts, 2) AS share_of_volume_pct
FROM global_markets.options_trades
WHERE underlying_symbol = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 00:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')
GROUP BY size_bucket
ORDER BY min(size)การซื้อขายขนาด 1 สัญญาคิดเป็น 48.48% ของจำนวนรายการซื้อขายทั้งหมด และ 7.83% ของจำนวนสัญญาที่มีการเปลี่ยนมือ กลุ่ม over 100 มีสัดส่วนที่กลับกัน คือ 0.44% ของรายการซื้อขาย แต่ครอบคลุม 16.67% ของปริมาณการซื้อขายทั้งหมด ภายใต้การจัดสรรแบบ pro-rata ตัวเลขหลังจะเป็นตัวกำหนดว่าคำสั่งที่เข้ามาใหม่จะถูกจัดสรรให้คำสั่งที่วางรออยู่เท่าใด Market maker จะเสนอราคาซื้อขายทั้งสองฝั่งอย่างต่อเนื่องและบริหารจัดการสถานะไปพร้อมกัน ซึ่งเราได้อธิบายรายละเอียดไว้ใน คู่มือการทำกำไรของ Market maker
ทำไมคำสั่ง Options ของฉันถึงไม่ได้รับการจับคู่ที่ราคา Mid?
ราคา Mid คือค่าเฉลี่ยเลขคณิตระหว่างราคา Bid และ Ask ไม่มีใครถูกบังคับให้ต้องซื้อขายที่ราคานี้ ราคาที่ดำรงอยู่จริงเสมอคือราคาธรรมชาติ (naturals) ได้แก่ราคา Ask หากคุณต้องการซื้อ และราคา Bid หากคุณต้องการขาย ทุกสิ่งที่อยู่ระหว่างราคาธรรมชาติและราคา Mid คือการต่อรองที่จะจบลงเมื่อโมเดลของอีกฝั่งประเมินราคาที่ฝั่งของคุณ หรือเมื่อมีคำสั่งซื้อขายจากลูกค้าทั่วไปอีกรายเข้ามาต้องการฝั่งตรงข้าม
ขอบเขตของการต่อรองนี้ขึ้นอยู่กับความกว้างของตลาด ซึ่งจะแปรผันอย่างมากตามราคาของสัญญา ตารางด้านล่างใช้ช่วงเวลา 30 วินาทีเดิม จัดกลุ่มราคาเสนอ Options ของ Apple ตามราคาของสัญญา และรายงานค่ามัธยฐานของส่วนต่างราคา (spread) เป็นเซนต์ ควบคู่ไปกับส่วนต่างราคาในรูปแบบเปอร์เซ็นต์ของราคา Mid
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
price_bucket,
round(quantileExact(0.5)(spread) * 100, 1) AS median_spread_cents,
round(quantileExact(0.5)(100 * spread / mid), 1) AS spread_pct_of_mid
FROM
(
SELECT
toFloat64(ask_price) - toFloat64(bid_price) AS spread,
(toFloat64(ask_price) + toFloat64(bid_price)) / 2 AS mid,
multiIf(mid < 0.50, 'under $0.50',
mid < 2.00, '$0.50 to $2',
mid < 5.00, '$2 to $5',
mid < 15.00, '$5 to $15',
'$15 and up') AS price_bucket,
multiIf(mid < 0.50, 1, mid < 2.00, 2, mid < 5.00, 3, mid < 15.00, 4, 5) AS bucket_order
FROM global_markets.cache_options_quotes
WHERE ticker IN
(
SELECT ticker
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-17'
)
AND sip_timestamp >= toDateTime('2026-06-17 18:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-17 18:00:30', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
)
GROUP BY price_bucket
ORDER BY min(bucket_order)สัญญาในกลุ่ม under $0.50 มีส่วนต่างราคาเฉลี่ยที่ 17 เซนต์ หรือคิดเป็น 75% ของราคา Mid ส่วนสัญญาในกลุ่ม $15 and up มีส่วนต่างราคาที่ 170 เซนต์ หรือ 3.8% ของราคา Mid ในเชิงเซนต์ สัญญาที่มีราคาสูงจะมีส่วนต่างราคาที่กว้างกว่า แต่ในเชิงเปอร์เซ็นต์ สัญญาที่มีราคาถูกจะมีตลาดที่กว้างกว่ามาก และการวางคำสั่งที่ราคา Mid ของสัญญาเหล่านี้เท่ากับเป็นการขอให้คู่สัญญาเสียส่วนต่างราคาไปเป็นจำนวนมาก สภาพคล่องและความผันผวน ส่งผลต่อความกว้างของส่วนต่างราคาในทิศทางที่ต่างกัน และสัญญา Options สองตัวบนสินทรัพย์อ้างอิงเดียวกันอาจมีพฤติกรรมที่ต่างกันโดยสิ้นเชิง
การใช้ Market order เทียบกับ Limit order จะตัดปัญหาเรื่องราคาออกไป แต่จะนำปัญหาอื่นมาแทนที่ Market order จะจับคู่กับสิ่งที่อยู่ในสมุดคำสั่งซื้อขาย ณ ขณะนั้น ซึ่งใน Options ที่มีสภาพคล่องต่ำ อาจอยู่ห่างจากราคาล่าสุดที่หน้าจอของคุณแสดงหลายช่วงราคา (ticks)
ทำไมคำสั่งแบบ Spread ถึงไม่ได้รับการจับคู่ทั้งที่ดูเหมือนว่าแต่ละขาจะทำได้?
คำสั่งแบบหลายขา (multi-leg) จะไม่ไปอยู่ในสมุดคำสั่งซื้อขายของแต่ละขาแยกกัน แต่จะถูกส่งไปยังสมุดคำสั่งซื้อขายแบบซับซ้อน (complex order book) และจับคู่เป็นชุดเดียวตามราคา Net price ตลาดหลักทรัพย์จะจับคู่กับคำสั่งแบบซับซ้อนอื่น หรือจับคู่กับสมุดคำสั่งของแต่ละขาเมื่อราคารวมกันดีกว่าราคา Net ของคุณ โดยจะไม่มีการจับคู่จนกว่าทั้งชุดจะประเมินราคาได้
สมมติว่าคุณทำ Call spread สองขา ขา Long มีราคาเสนอที่ 1.20 ดอลลาร์ (Bid) และ 1.35 ดอลลาร์ (Ask) ขา Short มีราคาเสนอที่ 0.60 ดอลลาร์ (Bid) และ 0.72 ดอลลาร์ (Ask) การซื้อทั้งชุดที่ราคาธรรมชาติจะมีต้นทุน 1.35 ลบด้วย 0.60 เท่ากับ 0.75 ดอลลาร์ (debit) การขายที่ราคาธรรมชาติจะได้รับเงิน 1.20 ลบด้วย 0.72 เท่ากับ 0.48 ดอลลาร์ (credit) ตลาดของชุดคำสั่งนี้จึงอยู่ที่ 0.48 ดอลลาร์ (Bid) ถึง 0.75 ดอลลาร์ (Ask) โดยมีราคา Mid อยู่ที่ 0.615 ดอลลาร์ การดูแต่ละขาแยกกันไม่สามารถบอกได้ว่าราคา 0.62 ดอลลาร์จะจับคู่ได้หรือไม่ สมุดคำสั่งรวมจะมีตลาดสองฝั่งและคำสั่งที่วางรออยู่ของตัวเอง
ผลที่ตามมาคือ สองประการ ประการแรก ขาที่ซื้อขายได้ที่ราคาของคุณบนหน้าจอแยกขา ไม่ได้หมายความว่า Spread ของคุณจะได้รับการจับคู่ เพราะคำสั่งของคุณไม่ได้อยู่ในสมุดคำสั่งนั้นตั้งแต่แรก ประการที่สอง การตั้งราคา Spread ในรูปแบบของแต่ละขาแทนที่จะเป็นราคา Net คือการตั้งราคาเทียบกับสมุดคำสั่งที่ไม่มีอยู่จริง
ทำไมคำสั่งถึงไม่ได้รับการจับคู่ใน Strike ที่ไม่มีปริมาณการซื้อขาย?
ไม่มีอะไรผิดปกติ Strike ส่วนใหญ่ที่จดทะเบียนมักไม่มีการซื้อขายในแต่ละวัน รายการสัญญาจะแสดงทุก Strike ที่ตลาดเปิดให้ซื้อขาย แต่ส่วนใหญ่จะถูกเสนอราคาไว้โดยไม่มีการเคลื่อนไหว บางครั้งนานหลายสัปดาห์ ปริมาณการซื้อขาย (Volume) นับจำนวนสัญญาที่มีการเปลี่ยนมือในวันนี้ ส่วนสถานะคงค้าง (Open interest) นับสถานะที่ยังคงค้างอยู่ ซึ่งความแตกต่างระหว่างสองค่านี้ได้อธิบายไว้ใน คู่มือปริมาณการซื้อขาย vs สถานะคงค้าง ของเรา
ตารางด้านล่างวัดความบางของ Strike ที่อยู่ไกลจากราคาปัจจุบัน โดยนำสัญญา Apple ทุกตัวที่มีอายุเหลือ 20 ถึง 45 วันในช่วงเดือนพฤษภาคมและมิถุนายน 2026 มาจัดกลุ่มตามระยะห่างจากราคาอ้างอิงในวันนั้น และรายงานค่ามัธยฐานของปริมาณการซื้อขายรายวันควบคู่ไปกับสัดส่วนของวันที่ไม่มีการซื้อขายถึง 10 สัญญา
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
moneyness_bucket,
round(quantileExact(0.5)(toFloat64(volume)), 0) AS median_daily_volume,
round(100 * countIf(volume < 10) / count(), 1) AS share_under_10_lots_pct
FROM
(
SELECT
abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) AS gap,
multiIf(gap < 0.02, '0% to 2% from spot',
gap < 0.05, '2% to 5% from spot',
gap < 0.10, '5% to 10% from spot',
gap < 0.20, '10% to 20% from spot',
'more than 20% from spot') AS moneyness_bucket,
multiIf(gap < 0.02, 1, gap < 0.05, 2, gap < 0.10, 3, gap < 0.20, 4, 5) AS bucket_order,
volume
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= '2026-05-01'
AND date < '2026-07-01'
AND days_to_expiry BETWEEN 20 AND 45
AND underlying_close > 0
)
GROUP BY moneyness_bucket
ORDER BY min(bucket_order)สัญญาในกลุ่ม 0% to 2% from spot มีปริมาณการซื้อขายมัธยฐานรายวันอยู่ที่ 354 สัญญา โดยมี 2% ของวันที่มีการซื้อขายต่ำกว่า 10 สัญญา สัญญาในกลุ่ม more than 20% from spot มีปริมาณการซื้อขายมัธยฐานที่ 6 สัญญาต่อวัน และ 55.4% ของวันที่มีการซื้อขายต่ำกว่า 10 สัญญา คำสั่งที่วางรออยู่ใน Strike เหล่านี้กำลังรอคำสั่งซื้อขายที่ไม่มีวันมาถึง และคู่สัญญาเพียงรายเดียวที่เหลืออยู่คือ Market maker ที่เป็นผู้เสนอราคา Strike นั้นตั้งแต่แรก
สิ่งที่กลไกเหล่านี้เปลี่ยนไปเกี่ยวกับคำสั่งซื้อขายของคุณ
- Spread จะถูกตั้งราคาตาม Net price สมุดคำสั่งแบบซับซ้อนจะจับคู่เป็นชุด และราคาของขาเดียวไม่มีผลในสมุดคำสั่งนี้
- ราคา Mid ทำหน้าที่เป็นจุดอ้างอิง ราคาที่พร้อมใช้งานเสมอในตลาดที่กว้างคือราคาธรรมชาติ (Ask สำหรับการซื้อ และ Bid สำหรับการขาย)
- ขนาดของคำสั่งเป็นตัวกำหนดสัดส่วนการจับคู่แบบ pro-rata คำสั่งขนาด 1 สัญญาที่วางอยู่ข้างคำสั่งขนาดใหญ่จะได้รับส่วนแบ่งตามสัดส่วนของสิ่งที่เข้ามาใหม่
- Strike ที่เงียบเหงาเป็นปัญหาเรื่องการเสนอราคามากกว่าเรื่องคำสั่งซื้อขาย เพราะไม่มีคำสั่งซื้อขายเข้ามาจับคู่
คำถามที่พบบ่อย
ทำไมคำสั่ง Limit order ของฉันถึงไม่ได้รับการจับคู่ทั้งที่อยู่ที่ราคา Bid?
การวางคำสั่งที่ราคา Bid จะทำให้คุณเข้าไปอยู่ในคิวที่ราคานั้น แต่ตลาด Options จะจัดสรรการจับคู่ตามสถานะลูกค้าและขนาดของคำสั่ง ไม่ใช่ตามเวลาที่มาถึงเพียงอย่างเดียว คำสั่งขนาดเล็กที่วางอยู่ข้างคำสั่งขนาดใหญ่จะได้รับส่วนแบ่งตามสัดส่วนของสิ่งที่เข้ามา ซึ่งอาจถูกปัดเศษลงจนเหลือศูนย์ในกรณีที่มีการซื้อขายเพียงเล็กน้อย
ตลาด Options จับคู่คำสั่งตามลำดับที่มาถึงหรือไม่?
ส่วนใหญ่ไม่เป็นเช่นนั้น คำสั่งจากลูกค้าทั่วไปจะได้รับสิทธิก่อนคำสั่งจาก Market maker และผู้ซื้อขายมืออาชีพที่ราคาเดียวกัน และขนาดที่เหลือมักจะถูกจัดสรรแบบ pro-rata ตามสัดส่วนของขนาดคำสั่งที่วางรออยู่ บางตลาดอาจเพิ่มสิทธิพิเศษให้กับผู้ที่วางราคาก่อน
การจ่ายราคาธรรมชาติ (paying the natural) ในคำสั่ง Options หมายถึงอะไร?
ราคาธรรมชาติคือราคาที่แสดงอยู่แล้วในฝั่งของคุณ ได้แก่ราคา Ask เมื่อคุณซื้อ และราคา Bid เมื่อคุณขาย คำสั่งที่ราคาธรรมชาติสามารถจับคู่กับราคาเสนอปัจจุบันได้ทันที ในขณะที่คำสั่งที่ราคา Mid ต้องรอให้อีกฝั่งปรับราคาเข้ามาหา
เป็นเรื่องปกติหรือไม่ที่ Option ที่ไม่มีปริมาณการซื้อขายจะไม่ได้รับการจับคู่เลย?
ใช่ Strike ส่วนใหญ่ที่จดทะเบียนมักไม่มีการซื้อขายในแต่ละวัน และคำสั่งที่วางรออยู่จะแข่งขันเพื่อรอคำสั่งซื้อขายที่ไม่มีเข้ามา ราคาที่แสดงอยู่มักเป็นภาระหน้าที่ของ Market maker และการจับคู่จะขึ้นอยู่กับว่าราคานั้นเป็นราคาที่พวกเขาต้องการในขณะนั้นหรือไม่
วิธีการสร้างตารางเหล่านี้
ตารางราคาเสนอทั้งสองตารางอ่านข้อมูลจากช่วงเวลา 30 วินาทีที่กำหนด คือ 14:00:00 น. ถึง 14:00:30 น. ET ในวันที่ 17 มิถุนายน 2026 โดยจำกัดเฉพาะสัญญา Options ของ Apple ที่มีข้อมูล Greeks รายวันในวันที่ดังกล่าว การกำหนดช่วงเวลาช่วยให้ตัวเลขเหล่านี้คงที่ทุกครั้งที่สร้างเนื้อหาใหม่ การสำรวจ Strike ครอบคลุมเดือนพฤษภาคมและมิถุนายน 2026 และรวมสัญญาที่ไม่มีปริมาณการซื้อขายไว้ด้วย ความถี่ที่ Strike จดทะเบียนไม่มีการซื้อขายคือสิ่งที่ตารางนี้วัดผล เวลาที่จัดเก็บเป็น UTC และถูกแปลงเป็นเวลา Eastern ในแต่ละคำสั่งค้นหา
ทุกตารางด้านบนมีคำสั่ง SQL ที่ใช้สร้างข้อมูลอยู่ด้านล่าง หากต้องการวัดผลแบบเดียวกันกับสัญญาที่คุณติดตาม สามารถสอบถามเป็นภาษาอังกฤษธรรมดาได้ที่ Strasmore terminal