NBBO คืออะไร National Best Bid and Offer คืออะไร
ทำความรู้จัก NBBO หรือราคาเสนอซื้อและเสนอขายที่ดีที่สุดในระดับประเทศ ซึ่งเป็นเกณฑ์มาตรฐานที่โบรกเกอร์ต้องเสนอราคาให้เท่ากับหรือดีกว่าข้อมูลจากทุกตลาด
NBBO หรือ National Best Bid and Offer คือราคาเสนอซื้อและเสนอขายที่ดีที่สุดในระดับประเทศสำหรับหุ้นในสหรัฐฯ ซึ่งเป็นราคาเสนอซื้อที่สูงที่สุดและราคาเสนอขายที่ต่ำที่สุดจากทุกตลาดหลักทรัพย์พร้อมกัน ราคาดังกล่าวคือราคาที่แสดงบนแอปพลิเคชันของคุณ และเป็นเกณฑ์มาตรฐานที่โบรกเกอร์ต้องเสนอราคาให้เท่ากับหรือดีกว่าเมื่อดำเนินการตามคำสั่งซื้อขายของคุณ ข้อมูลตัวเลขทั้งหมดด้านล่างนี้มาจากบันทึกราคาจริงตามคำสั่งสืบค้นที่แนบมา
NBBO คืออะไร? คำจำกัดความแบบเข้าใจง่าย
หุ้นในสหรัฐฯ ไม่ได้ซื้อขายในสถานที่เดียว ตลาด NYSE, Nasdaq และตลาดหลักทรัพย์อื่นๆ อีกกว่าสิบแห่ง ต่างมีสมุดคำสั่งซื้อขาย (order book) สำหรับ ticker เดียวกัน โดยแต่ละแห่งจะมีราคา bid และ ask ที่ดีที่สุดเป็นของตนเอง NBBO จะรวบรวมข้อมูลเหล่านั้นเข้าด้วยกัน โดยแสดงราคา bid ที่สูงที่สุดจากทุกตลาด และราคา ask ที่ต่ำที่สุดจากทุกตลาด พร้อมกับจำนวนหุ้นที่มีอยู่ในแต่ละราคา การรวบรวมข้อมูลนี้ดำเนินการโดย securities information processors หรือ SIPs ซึ่งเป็นหน่วยงานด้านข้อมูลตลาดที่ตลาดหลักทรัพย์ต่างๆ ดำเนินการร่วมกัน
มีสองประเด็นสำคัญที่ควรทราบ ราคา bid และ ask อาจปรากฏอยู่บนสองตลาดหลักทรัพย์ที่แตกต่างกันในเวลาเดียวกัน นอกจากนี้ การเปลี่ยนแปลงราคาไม่ใช่อันเดียวที่ทำให้เกิดการอัปเดตข้อมูล แต่การเปลี่ยนแปลงจำนวนหุ้น (size) ณ ราคาที่ดีที่สุดเดิม ก็ถือเป็นการบันทึกข้อมูลใหม่เช่นกัน นักเทรดเรียกราคาที่ดีที่สุดทั้งสองนี้ว่า the touch ส่วนส่วนต่างระหว่างราคาดังกล่าวคือ bid-ask spread
วิธีการอ่านราคา NBBO: ราคา ขนาด และความเร็ว
นี่คือข้อมูลบันทึก NBBO จำนวนสิบรายการติดต่อกันของ Coca-Cola (KO) เมื่อเวลา 13:30 น. ตามเวลาฝั่งตะวันออก (Eastern Time) ของช่วงการซื้อขายปกติครั้งล่าสุด ซึ่งเป็นราคาเสนอซื้อขายระดับประเทศตามที่เกิดขึ้นจริง
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH (
SELECT max(session_date)
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS regular_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime(today() - 10)
AND window_start < toDateTime(today() - 3)
GROUP BY session_date
HAVING regular_bars = 390
)
) AS last_session
SELECT substring(toString(toTimeZone(sip_timestamp, 'America/New_York')), 12, 12) AS et_time,
round((toUnixTimestamp64Nano(sip_timestamp) - min(toUnixTimestamp64Nano(sip_timestamp)) OVER ()) / 1e6, 2) AS elapsed_ms,
bid_size AS bid_shares,
toFloat64(bid_price) AS best_bid,
toFloat64(ask_price) AS best_ask,
ask_size AS ask_shares,
round((toFloat64(ask_price) - toFloat64(bid_price)) * 100, 1) AS spread_cents
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'KO'
AND sip_timestamp >= toDateTime(last_session, 'America/New_York') + INTERVAL 13 HOUR + INTERVAL 30 MINUTE
AND sip_timestamp < toDateTime(last_session, 'America/New_York') + INTERVAL 14 HOUR
AND bid_price > 0
AND ask_price > bid_price
ORDER BY sip_timestamp, sequence_number
LIMIT 10อ่านแถวแรกในฐานะข้อเสนอซื้อและขายที่ตั้งค้างไว้ ณ เวลา 13:30:02.886 ET ราคาเสนอซื้อที่ดีที่สุดคือ $83.3 สำหรับจำนวน 200 หุ้น และราคาเสนอขายที่ดีที่สุดคือ $83.31 สำหรับจำนวน 200 หุ้น โดยมีส่วนต่างระหว่างราคา (spread) อยู่ที่ 1¢
จำนวนหุ้นคือ size at the touch ซึ่งหมายถึงสภาพคล่องที่แสดง ณ ราคาที่ดีที่สุดสองลำดับ หากมีคำสั่งซื้อขายที่มีขนาดใหญ่กว่าจำนวนนี้ จะทำให้สภาพคล่องดังกล่าวหมดไป และส่วนที่เหลือจะถูกจับคู่ที่ราคาถัดไปในสมุดคำสั่งซื้อขาย (order book) ทั้งนี้ จำนวนหุ้นที่แสดงเป็นเพียงระดับขั้นต่ำ ไม่ใช่ปริมาณทั้งหมดในตลาด เนื่องจากมักจะมีคำสั่งซื้อขายอื่นที่ไม่ได้แสดงผล (un-displayed) อยู่ที่ระดับราคาหรือระหว่างสองราคานี้ รวมถึงใน dark pools
ลำดับถัดมาคือการอ่านข้อมูลตามแถว ข้อมูลทั้ง 10 รายการเกิดขึ้นภายในช่วงเวลา 484.95 มิลลิวินาทีจากรายการแรก ข้อมูลนี้ไม่มีกำหนดเวลาที่แน่นอน เนื่องจาก SIP จะเผยแพร่ข้อมูลทุกครั้งที่มีการเปลี่ยนแปลงราคา โดยเหตุการณ์ใดเหตุการณ์หนึ่งจากสี่กรณีต่อไปนี้จะทำให้เกิดการบันทึกข้อมูลหนึ่งแถว ได้แก่ การเสนอซื้อที่ดีกว่าเดิม, การเสนอขายที่ดีกว่าเดิม, การเปลี่ยนแปลงจำนวนหุ้นที่ราคาที่ดีที่สุดลำดับใดลำดับหนึ่ง หรือการที่ตลาดหลักทรัพย์แห่งหนึ่งเข้ามาแทนที่อีกแห่งหนึ่งในลำดับราคาที่ดีที่สุด หากต้องการดูข้อมูลเชิงลึกตลอดทั้งวันทำการ โปรดดูที่ การเจาะลึกโครงสร้างตลาดระดับจุลภาค
NBBO รวม odd lots หรือไม่?
โดยส่วนใหญ่แล้วคือไม่ NBBO ถูกสร้างขึ้นจากความต้องการซื้อขายในรูปแบบ round-lot เท่านั้น คำสั่งซื้อขายที่มีจำนวนหุ้นน้อยกว่า round lot เรียกว่า odd lot: ซึ่งอาจวางรออยู่ในสมุดคำสั่งของตลาดหลักทรัพย์ด้วยราคาที่ดีกว่า national best bid และสามารถจับคู่ซื้อขายที่นั่นได้ โดยที่ราคาดังกล่าวจะไม่ปรากฏใน NBBO
ปัจจุบัน round lot ไม่ได้กำหนดไว้ที่ 100 หุ้นเสมอไป ภายใต้กฎการเสนอราคา Reg NMS ฉบับแก้ไขของ SEC ได้มีการแบ่งระดับตามราคาหุ้น ดังนี้: 100 หุ้น สำหรับหุ้นที่มีราคาไม่เกิน $250, 40 หุ้น สำหรับราคาตั้งแต่ $250.01 ถึง $1,000, 10 หุ้น สำหรับราคาตั้งแต่ $1,000.01 ถึง $10,000 และจำนวนหนึ่งหุ้นสำหรับราคาที่สูงกว่านั้น ระดับเหล่านี้สามารถตรวจสอบได้จาก tape โดยระบบจะเลือกขนาด bid ที่เล็กที่สุดที่เคยปรากฏใน consolidated quote สำหรับหุ้น 6 ตัวในแต่ละช่วงราคา
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH (
SELECT max(session_date)
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS regular_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime(today() - 10)
AND window_start < toDateTime(today() - 3)
GROUP BY session_date
HAVING regular_bars = 390
)
) AS last_session
SELECT ticker,
round(quantileDeterministic(0.5)(toFloat64(bid_price), toUInt64(sequence_number)), 2) AS share_price,
min(bid_size) AS smallest_quoted_size,
round(quantileDeterministic(0.5)(toFloat64(bid_size), toUInt64(sequence_number)), 0) AS median_bid_size
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('F', 'KO', 'NVDA', 'AAPL', 'SPY', 'AZO')
AND sip_timestamp >= toDateTime(last_session, 'America/New_York') + INTERVAL 10 HOUR
AND sip_timestamp < toDateTime(last_session, 'America/New_York') + INTERVAL 11 HOUR
AND bid_price > 0
AND bid_size > 0
GROUP BY ticker
ORDER BY share_priceFord ซึ่งเสนอราคาอยู่ที่ประมาณ $13.9 ไม่เคยแสดง bid ที่มีขนาดเล็กกว่า 100 หุ้นในช่วงชั่วโมงนั้น เช่นเดียวกับ Coca-Cola ที่ราคา $84.18 ส่วน Apple ที่ราคา $314.36 มีขนาดลดลงเหลือ 40; AutoZone ที่ราคา $3030.52 ต่อหุ้น ลดลงเหลือ 10 โดยมีค่า median ของ bid ที่แสดงคือ 10 ทั้งนี้ระดับราคาจะเปลี่ยนไปตามช่วงราคาของหุ้น ความต้องการซื้อขายแบบ odd lot ที่มีราคาดีกว่าอาจวางอยู่ ภายใน spread ที่ประกาศไว้โดยไม่ถูกแสดงผล ดังนั้นราคาที่ดีที่สุดที่หาได้จริงอาจดีกว่าที่ NBBO ระบุไว้ในบางครั้ง
ทำไมราคาในแอปของคุณถึงไม่ใช่ NBBO แบบเรียลไทม์
ราคาที่คุณเห็นบนโทรศัพท์มือถือต้องผ่านขั้นตอนดังนี้: เครื่องมือจับคู่คำสั่งซื้อขายของตลาดหลักทรัพย์ → SIP → ผู้ให้บริการข้อมูล → โบรกเกอร์ → หน้าจอ ทุกรายการข้อมูลจะมีเวลาบันทึกสองชุด คือ เวลาจากตลาดหลักทรัพย์เอง และเวลาที่ SIP เผยแพร่ข้อมูล ซึ่งช่องว่างระหว่างเวลาทั้งสองนี้คือขั้นตอนการรวบรวมข้อมูล (consolidation step)
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH (
SELECT max(session_date)
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS regular_bars
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime(today() - 10)
AND window_start < toDateTime(today() - 3)
GROUP BY session_date
HAVING regular_bars = 390
)
) AS last_session
SELECT ticker,
round(quantileDeterministic(0.5)((toUnixTimestamp64Nano(sip_timestamp) - toUnixTimestamp64Nano(participant_timestamp)) / 1000.0, toUInt64(sequence_number)), 1) AS median_micros,
round(quantileDeterministic(0.99)((toUnixTimestamp64Nano(sip_timestamp) - toUnixTimestamp64Nano(participant_timestamp)) / 1000.0, toUInt64(sequence_number)), 1) AS p99_micros
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'NVDA', 'AAPL', 'KO')
AND sip_timestamp >= toDateTime(last_session, 'America/New_York')
AND sip_timestamp < toDateTime(last_session + 1, 'America/New_York')
AND participant_timestamp > toDateTime64('2020-01-01 00:00:00', 9)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'NVDA', 'AAPL', 'KO'], ticker)ค่ากลางของช่องว่างเวลาของ SPY วัดได้ 229.1 ไมโครวินาที (หนึ่งในล้านส่วนของวินาที) และของ Apple อยู่ที่ 203.4 ส่วนข้อมูลในกลุ่มปลายแถว (tail) มีค่าสูงกว่าค่ากลาง โดยค่าเปอร์เซ็นไทล์ที่ 99 ของ NVDA อยู่ที่ 536.9 ไมโครวินาที ทั้งนี้ SIP ไม่ได้ทำงานช้าในความรู้สึกของมนุษย์ แต่มีอีกสองปัจจัยที่ทำให้เกิดความล่าช้า
ประการแรก ข้อมูลของคุณอาจถูกหน่วงเวลาโดยเจตนา ข้อมูลราคาฟรีในแอปสำหรับรายย่อยและเว็บไซต์กราฟเทคนิค มักถูกหน่วงเวลาไว้ 15 นาทีตามเงื่อนไขการอนุญาตใช้สิทธิ์ของตลาดหลักทรัพย์ ส่วนการส่งข้อมูลแบบเรียลไทม์นั้นเป็นบริการแบบต้องชำระเงิน
ประการที่สอง บริษัทมืออาชีพไม่รอข้อมูลจาก SIP แต่ละตลาดหลักทรัพย์มีการขายข้อมูลโดยตรงจากเครื่องมือจับคู่คำสั่งซื้อขายของตนเองด้วย บริษัทที่ตั้งเซิร์ฟเวอร์ในศูนย์ข้อมูลเดียวกับตลาดหลักทรัพย์ (colocated firm) จะอ่านข้อมูลนี้และคำนวณราคา Bid และ Offer ที่ดีที่สุดของตนเอง ก่อนที่ข้อมูลชุดเดียวกันจาก SIP จะส่งมาถึง ซึ่งความได้เปรียบเพียงไม่กี่ไมโครวินาทีนี้มีความสำคัญอย่างยิ่งสำหรับ market maker ที่ต้องเสนอราคาซื้อและขายตลอดทั้งวัน
NBBO มีความถี่ในการอัปเดตบ่อยแค่ไหน? หุ้นที่มีสภาพคล่องสูงเทียบกับหุ้นที่มีสภาพคล่องต่ำ
หุ้นจดทะเบียนทุกตัวมี NBBO และอัตราการอัปเดตคือตัวชี้วัดสภาพคล่อง ตารางนี้แสดงค่าเฉลี่ยจากการซื้อขายเต็มเซสชันล่าสุดของหุ้นที่มีปริมาณการซื้อขายสูงสี่ตัว และหุ้นขนาดเล็กที่มีสภาพคล่องต่ำสองตัว ได้แก่ Nathan's Famous (NATH) และ Seneca Foods (SENEA)
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT ticker,
uniqExact(toDate(toTimeZone(sip_timestamp, 'America/New_York'))) AS sessions,
round(count() / uniqExact(toDate(toTimeZone(sip_timestamp, 'America/New_York')))) AS avg_updates_per_session,
round(count() / uniqExact(toDate(toTimeZone(sip_timestamp, 'America/New_York'))) / 1e6, 3) AS avg_updates_per_session_m,
round((count() / uniqExact(toDate(toTimeZone(sip_timestamp, 'America/New_York')))) / min(count() / uniqExact(toDate(toTimeZone(sip_timestamp, 'America/New_York')))) OVER (), 0) AS multiple_of_quietest
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'NVDA', 'AAPL', 'KO', 'SENEA', 'NATH')
AND sip_timestamp >= toDateTime(today() - 10)
AND sip_timestamp < toDateTime(today() - 3)
AND toDate(toTimeZone(sip_timestamp, 'America/New_York')) IN (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime(today() - 10)
AND window_start < toDateTime(today() - 3)
GROUP BY session_date
HAVING countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) = 390
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'NVDA', 'AAPL', 'KO', 'SENEA', 'NATH'], ticker)SPY ซึ่งเป็น S&P 500 ETF มีค่าเฉลี่ยการอัปเดต NBBO อยู่ที่ 3.428 ล้าน ครั้งต่อเซสชัน หรือคิดเป็น 2031 เท่าของหุ้นที่มีการซื้อขายเงียบที่สุดในตาราง โดย NVDA มีค่าเฉลี่ยที่ 1.85 ล้าน และ Apple อยู่ที่ 1.336 ล้าน จากนั้นข้อมูลก็ลดลงอย่างรวดเร็ว: Seneca Foods มีการอัปเดตเฉลี่ยอยู่ที่ 8097 ครั้งต่อเซสชัน และ Nathan's Famous อยู่ที่ 1688 ครั้ง ไม่มีมนุษย์คนใดสามารถอ่านหน้าจอได้เร็วเท่ากับอัตราของ SPY เนื่องจาก NBBO เป็นฟีดข้อมูลที่สร้างขึ้นเพื่อซอฟต์แวร์
ช่วงเวลาที่ NBBO มีการอัปเดตเร็วที่สุด: ช่วงเปิดตลาดเทียบกับช่วงกลางวัน
อัตราการอัปเดตมีการเปลี่ยนแปลงตามจังหวะในแต่ละวัน กราฟนี้แสดงค่าเฉลี่ยการอัปเดต NBBO ของ Apple ต่อนาที โดยแบ่งเป็นช่วงเวลาละครึ่งชั่วโมง (เวลา Eastern Time) คอลัมน์สุดท้ายแสดงค่าในแต่ละช่วงเป็นเปอร์เซ็นต์เมื่อเทียบกับช่วงเวลา 9:30
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT et_time,
avg_updates_per_minute,
round(100 * avg_updates_per_minute / maxIf(avg_updates_per_minute, et_time = '09:30') OVER (), 1) AS pct_of_opening_bucket
FROM (
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
round(count() / (uniqExact(toDate(toTimeZone(sip_timestamp, 'America/New_York'))) * 30)) AS avg_updates_per_minute
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime(today() - 10)
AND sip_timestamp < toDateTime(today() - 3)
AND toDate(toTimeZone(sip_timestamp, 'America/New_York')) IN (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime(today() - 10)
AND window_start < toDateTime(today() - 3)
GROUP BY session_date
HAVING countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) = 390
)
GROUP BY et_time
HAVING et_time >= '04:00' AND et_time < '20:00'
)
ORDER BY et_timeในช่วงครึ่งชั่วโมงหลังจากการ ประมูลเปิดตลาด ราคาเสนอซื้อขายระดับประเทศของ Apple มีการอัปเดตเฉลี่ย 5657 ครั้งต่อนาที และช่วงเวลา 10:00 ยังคงรักษาความเร็วไว้ที่ 89.5% ของอัตราดังกล่าว จากนั้นปริมาณการซื้อขายจะลดลงในช่วงกลางวัน โดยช่วงเวลา 2:30 มีการอัปเดต 1973 ครั้งต่อนาที หรือคิดเป็น 34.9% ของความเร็วช่วงเปิดตลาด การอัปเดตในช่วง 3:30 ก่อนปิดตลาดฟื้นตัวขึ้นเพียงบางส่วน โดยอยู่ที่ 3345 ต่อนาที หรือคิดเป็น 59.1% ของช่วงเปิดตลาด ดังนั้นช่วงที่มีการเสนอราคาหนาแน่นที่สุดจึงอยู่ในชั่วโมงแรก ไม่ใช่ชั่วโมงสุดท้าย และนอกเวลาทำการปกติ ปริมาณการซื้อขายจะลดลงจนเกือบเงียบสงบ โดยเหลือเพียง 17 ครั้งต่อนาที หลังจากสัญญาณระฆังเวลา 16:00 น.
จะเกิดอะไรขึ้นกับ NBBO ในระหว่างการระงับการซื้อขาย?
เมื่อราคาหุ้นเคลื่อนที่เร็วและรุนแรงเกินไป กฎ limit-up/limit-down จะสั่งหยุดการซื้อขายชั่วคราวเป็นเวลาห้านาที ราคาเสนอซื้อเสนอขาย (quote) จะไม่หายไปและไม่แสดงผลแบบเรียลไทม์ แต่จะหยุดการอัปเดต โดยข้อมูลล่าสุดก่อนการระงับการซื้อขายจะค้างอยู่บนหน้าจอ GameStop (GME) ถูกระงับการซื้อขายลักษณะนี้ในช่วงหลังเวลา 11:00 น. ตามเวลาฝั่งตะวันออกของวันที่ 14 พฤษภาคม 2024 โดยตารางนี้จะติดตามการอัปเดตราคาและรายการซื้อขายของหุ้นดังกล่าวแบบนาทีต่อนาทีในช่วงเวลาดังกล่าว
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH spine AS (
SELECT toStartOfMinute(toTimeZone(window_start, 'America/New_York')) AS et_min
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2024-05-14 10:57:00', 'America/New_York')
AND window_start < toDateTime('2024-05-14 11:12:00', 'America/New_York')
),
gme_trades AS (
SELECT toStartOfMinute(toTimeZone(window_start, 'America/New_York')) AS et_min,
sum(transactions) AS trades
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'GME'
AND window_start >= toDateTime('2024-05-14 10:57:00', 'America/New_York')
AND window_start < toDateTime('2024-05-14 11:12:00', 'America/New_York')
GROUP BY et_min
),
gme_quotes AS (
SELECT toStartOfMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min,
count() AS nbbo_updates
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'GME'
AND sip_timestamp >= toDateTime('2024-05-14 10:57:00', 'America/New_York')
AND sip_timestamp < toDateTime('2024-05-14 11:12:00', 'America/New_York')
GROUP BY et_min
)
SELECT formatDateTime(spine.et_min, '%H:%i') AS et_time,
ifNull(gme_quotes.nbbo_updates, 0) AS nbbo_updates,
toUInt64(ifNull(gme_trades.trades, 0)) AS trades
FROM spine
LEFT JOIN gme_quotes ON gme_quotes.et_min = spine.et_min
LEFT JOIN gme_trades ON gme_trades.et_min = spine.et_min
ORDER BY spine.et_minในหนึ่งนาทีก่อนการระงับการซื้อขาย 11:00 ราคาเสนอซื้อเสนอขายรวม (consolidated quote) ของ GameStop มีการอัปเดต 4511 ครั้ง เทียบกับรายการซื้อขาย 12419 รายการ หลังจากนั้นข้อมูลทั้งสองคอลัมน์จะหยุดลง โดยมีรายการราคาเสนอซื้อเสนอขาย 0 รายการ ที่ 11:02 และ 0 รายการ ที่ 11:03 พร้อมด้วยรายการซื้อขาย 0 รายการ ซึ่งหมายถึงราคาที่หยุดเคลื่อนไหวในหุ้นที่หยุดการซื้อขาย การเสนอราคาจะกลับมาอีกครั้งในเวลา 11:06 ซึ่งเป็นนาทีที่เปิดการซื้อขายใหม่ โดยมีการอัปเดต 4155 ครั้ง และรายการซื้อขาย 14007 รายการ ซึ่งเป็นนาทีที่มีปริมาณการซื้อขายสูงสุดในตาราง ราคา NBBO ล่าสุดของหุ้นที่ถูกระงับการซื้อขายคือข้อมูลในอดีต ไม่ใช่ราคาที่สามารถซื้อขายได้ เซสชันของ GameStop ในเดือนมกราคม 2021 แสดงให้เห็นว่าการระงับการซื้อขายที่เกิดขึ้นต่อเนื่องกันส่งผลอย่างไรต่อข้อมูลการซื้อขาย (tape)
ทำไมโบรกเกอร์ต้องจับคู่คำสั่งซื้อขายของคุณที่ราคา NBBO หรือราคาที่ดีกว่า
NBBO คือเกณฑ์มาตรฐานตามกฎระเบียบ Regulation NMS ซึ่งเป็นกฎระเบียบโครงสร้างตลาดของ SEC ที่ประกาศใช้ในปี 2005 โดยมีกฎการคุ้มครองคำสั่งซื้อขาย (Rule 611) ระบุว่า ตลาดซื้อขายไม่สามารถดำเนินการซื้อขายในราคาที่แย่กว่าราคาเสนอซื้อขายที่ได้รับการคุ้มครอง (protected quote) ซึ่งแสดงอยู่ในตลาดอื่นได้ นอกจากนี้ โบรกเกอร์ยังมีหน้าที่ต้องดำเนินการให้เกิด best execution แก่ลูกค้า โดยวัดจาก NBBO กล่าวคือ คำสั่งซื้อแบบ market order ควรได้รับการจับคู่ที่ราคา national best ask หรือต่ำกว่า และคำสั่งขายแบบ market order ควรได้รับการจับคู่ที่ราคา national best bid หรือสูงกว่า
นักลงทุนรายย่อยส่วนใหญ่มักไม่ทราบข้อมูลนี้: คำสั่ง market order ของคุณมักไม่ได้ส่งไปยังตลาดซื้อขายโดยตรง ปริมาณคำสั่งซื้อขายของรายย่อยส่วนใหญ่จะถูกส่งไปยัง wholesalers ซึ่งเป็นผู้ดูแลสภาพคล่องนอกตลาด (off-exchange market makers) ที่ยอมจ่ายเงินเพื่อสิทธิในการจับคู่คำสั่งเหล่านั้น และดำเนินการซื้อขายภายในระบบของตนเอง โดยจะรายงานผลการซื้อขายผ่านระบบรายงานนอกตลาด อย่างไรก็ตาม NBBO ยังคงเป็นเกณฑ์ควบคุมผู้ดูแลสภาพคล่องเหล่านี้ โดยผู้ดูแลสภาพคล่องต้องเสนอราคาที่เท่ากับหรือดีกว่าราคาเสนอขายระดับประเทศ ณ ขณะที่มีการจับคู่คำสั่ง และต้องแข่งขันกันเพื่อดึงดูดปริมาณคำสั่งซื้อขายด้วยการเสนอราคาที่ดีกว่า ซึ่งเป็นการจับคู่ในราคาที่ดีกว่าราคาเสนอขายเพียงเล็กน้อยภายในส่วนต่าง spread หรือที่เรียกว่า price improvement ทั้งนี้ NBBO คือราคาอ้างอิง ไม่ใช่สถานที่ซื้อขาย และ ประเภทคำสั่งที่คุณเลือก จะเป็นตัวกำหนดว่าคุณจะต้องซื้อขายข้ามส่วนต่าง spread หรือไม่
คำถามที่พบบ่อย
NBBO รวมการซื้อขายแบบ odd lots หรือไม่?
ไม่รวม ราคาเสนอซื้อเสนอขายระดับประเทศ (national quote) รวบรวมจากราคาเสนอซื้อเสนอขายแบบ round-lot เท่านั้น และตามกฎ Reg NMS ได้มีการแบ่งระดับ round lot ตามราคา โดยกำหนดไว้ที่ 100 หุ้น สำหรับราคาต่ำกว่า $250 ไปจนถึง 1 หุ้น สำหรับราคาที่สูงกว่า $10,000 ราคาเสนอซื้อที่ต่ำที่สุดที่แสดงใน tape สำหรับ Ford คือ 100 หุ้น เทียบกับ 10 สำหรับ AutoZone ซึ่งมีราคาหุ้นสูงกว่ามาก ส่วน odd lots ที่มีราคาดีกว่าจะรวมอยู่ใน spread ที่ประกาศไว้แต่ไม่ได้แสดงผลออกมา
ทำไมราคาในแอปพลิเคชันของโบรกเกอร์ถึงต่างจาก NBBO แบบเรียลไทม์?
มีสองสาเหตุ ซึ่งไม่ใช่ความผิดพลาดของ SIP ข้อมูลฟรีสำหรับรายย่อยมักจะล่าช้า 15 นาทีตามกฎการอนุญาตใช้สิทธิ์ของตลาดหลักทรัพย์ เว้นแต่คุณจะจ่ายเงินเพื่อซื้อข้อมูลแบบเรียลไทม์ และข้อมูลแบบรวมศูนย์ (consolidated data) คือภาพถ่ายข้อมูล ณ ช่วงเวลาหนึ่ง โดยค่ามัธยฐานของขั้นตอนการรวมข้อมูลของ SPY วัดได้ 229.1 microseconds ในขณะที่บริษัทที่ใช้ข้อมูลโดยตรงจากตลาดหลักทรัพย์จะเห็นเหตุการณ์ได้เร็วกว่า
เกิดอะไรขึ้นกับ NBBO เมื่อหุ้นถูกระงับการซื้อขาย?
ราคาจะถูกแช่แข็ง ในช่วงที่ GameStop ถูกระงับการซื้อขายแบบ limit-up/limit-down เป็นเวลาห้านาทีตามตัวอย่าง tape แสดงการอัปเดตราคา 0 ครั้ง และมีการซื้อขาย 11:03 และ 0 ครั้ง ราคาล่าสุดจะยังคงแสดงบนหน้าจอแต่ไม่สามารถซื้อขายได้ โดยการประมูลเพื่อเปิดตลาดอีกครั้ง (reopening auction) จะเป็นตัวกำหนดราคาถัดไป
NBBO มีอยู่หรือไม่ในช่วงนอกเวลาทำการ?
มี ข้อมูลราคาแบบรวมศูนย์จะส่งต่อตั้งแต่เวลา 4:00 น. ถึง 20:00 น. ตามเวลา ET ดังนั้นราคาในระดับประเทศจึงมีอยู่ตลอดช่วง การซื้อขายช่วง premarket และ after-hours โดยมีปริมาณน้อยกว่าช่วงเวลาปกติมาก: Apple มีการอัปเดต 65 ครั้งในช่วงนาทีสุดท้ายของ premarket เทียบกับ 5657 ครั้งหลังตลาดเปิด
หมายเหตุข้อมูล: ช่วงเวลาและตัวกรอง
ช่วงเวลาแบบ Rolling windows จะสิ้นสุดลงสามวันก่อนการสร้างข้อมูล (เนื่องจากมีระยะเวลาหน่วงในการนำเข้าข้อมูลที่ส่วนหน้าของฟีด) และนับเฉพาะเซสชันที่สมบูรณ์เท่านั้น ซึ่งหมายถึงวันที่ SPY มีการบันทึกแท่งกราฟรายนาทีครบทั้ง 390 แท่งในช่วงเวลาทำการปกติ ชุดข้อมูล Coca-Cola จะไม่รวมรายการที่มีราคาเสนอซื้อเสนอขายเพียงด้านเดียวหรือราคาที่ตัดกัน (crossed records) ส่วนชุดข้อมูลการนับจะใช้ทุกรายการตามที่ปรากฏ (ตลาดที่ถูกล็อกและตลาดที่ราคาตัดกัน จะครอบคลุมรายการที่ถูกยกเว้นเหล่านั้น) ชุดข้อมูล GameStop จะถูกกำหนดไว้ที่วันที่คงที่ โดยใช้แท่งกราฟรายนาทีของ SPY เป็นแกนเวลา ดังนั้นนาทีที่ถูกระงับการซื้อขายจะแสดงค่าเป็นศูนย์
ทุกชุดข้อมูลมาพร้อมกับ SQL ที่ใช้ในการสร้างข้อมูล — คุณสามารถเปิดไฟล์ เลือก ticker ของคุณเอง และนับจำนวนการอัปเดต NBBO บนเทอร์มินัลของ Strasmore ได้