Cos'è l'NBBO National Best Bid and Offer
Scopri cos'è l'NBBO, la quotazione consolidata che il broker deve eguagliare. Analisi del meccanismo di aggregazione dei prezzi tra tutti gli exchange.
L'NBBO, il national best bid and offer, è la quotazione consolidata per un'azione statunitense: rappresenta il prezzo più alto offerto da un acquirente e il prezzo più basso richiesto da un venditore, considerando simultaneamente ogni exchange. È la quotazione visualizzata dalla vostra app e il benchmark che il vostro broker deve eguagliare o superare per il vostro ordine. Ogni dato riportato di seguito deriva da record di quotazione reali, query allegata.
Cos'è l'NBBO? Una definizione semplice
Un'azione statunitense non viene scambiata in un unico luogo. NYSE, Nasdaq e oltre una dozzina di altri exchange gestiscono ciascuno un order book per lo stesso ticker, ognuno con il proprio best bid e ask. L'NBBO aggrega questi dati: il miglior bid disponibile ovunque e il miglior ask disponibile ovunque, affiancati alle quantità disponibili su ciascuna borsa. Questa aggregazione è eseguita dai securities information processors, o SIPs, ovvero utility di mercato gestite congiuntamente dagli exchange.
Due dettagli sono fondamentali. Il bid e l'ask possono trovarsi contemporaneamente su due exchange diversi. Inoltre, un aggiornamento non richiede necessariamente una variazione di prezzo: anche una variazione di dimensione al medesimo miglior prezzo genera un nuovo record. I trader chiamano i due migliori prezzi the touch; la differenza tra essi è lo bid-ask spread.
Come leggere una quotazione NBBO: prezzi, size e velocità
Ecco dieci record NBBO consecutivi per Coca-Cola (KO) delle 13:30 ET di una recente sessione completa — la quotazione nazionale così come arriva effettivamente.
L'esatto SQL dietro ogni numero
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 10Leggere la prima riga come due offerte attive, con timestamp 13:30:02.886 ET. Il miglior Bid: $83.3 per 200 azioni. Il miglior Ask: $83.31 per 200 azioni. Lo spread tra i due è di 1¢.
Il numero di azioni rappresenta la size at the touch — la liquidità visualizzata ai due prezzi migliori. Un ordine superiore a tale size la esaurisce e riempie il resto ai prezzi successivi nel book. La size visualizzata è un limite minimo, non l'inventario completo: spesso esiste ulteriore interesse non visualizzato ai due prezzi o tra di essi, inclusi i dark pools.
Ora leggere le righe successive. Tutti i 10 record sono arrivati entro 484.95 millisecondi dal primo. Non esiste un orario prestabilito — il SIP pubblica i dati ogni volta che cambia un miglior prezzo, e una riga viene generata da uno di quattro eventi: un miglior bid, un miglior ask, una variazione della size al miglior prezzo o un exchange che sostituisce un altro in cima al book. Per un'analisi dettagliata della microstruttura, consultare il approfondimento sulla microstruttura.
L'NBBO include gli odd lot?
In genere, no. La quotazione nazionale è composta esclusivamente da interessi round-lot. Un ordine per un numero di azioni inferiore a un round lot è un odd lot: può essere inserito nel book di un exchange a un prezzo migliore rispetto al national best bid, essere scambiato a quel prezzo e non apparire mai nell'NBBO.
Il round lot non è più una cifra fissa di cento azioni. Secondo le regole di quotazione della Reg NMS modificata dalla SEC, è suddiviso per prezzo delle azioni: cento azioni fino a $250, quaranta da $250,01 a $1.000, dieci da $1.000,01 a $10.000, una sopra tale soglia. I livelli sono visibili nel tape: il pannello rileva la dimensione minima del bid che appare nel quote consolidato per sei titoli attraverso le diverse fasce.
L'esatto SQL dietro ogni numero
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, con quotazione intorno a $13.9, non mostra mai un bid inferiore a 100 azioni in quell'ora; lo stesso vale per Coca-Cola a $84.18. Apple, a $314.36, scende a 40; AutoZone, a $3030.52 a azione, scende a 10, con un bid mediano visualizzato di 10. Il floor segue la fascia di prezzo. Interessi odd-lot con prezzi migliori possono trovarsi all'interno dello spread pubblicato senza essere visualizzati, pertanto il vero miglior prezzo disponibile è a volte migliore di quanto suggerito dall'NBBO.
Perché la quotazione della tua app non è esattamente l'NBBO in tempo reale
La quotazione che leggi su uno smartphone ha percorso questo tragitto: matching engine della borsa → SIP → vendor di dati → broker → schermo. Ogni record contiene due timestamp — il timestamp della borsa e quello del SIP alla pubblicazione — e la differenza tra i due rappresenta il passaggio di consolidamento.
L'esatto SQL dietro ogni numero
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)Il gap mediano su SPY è stato misurato a 229.1 microsecondi — un milionesimo di secondo — e quello di Apple a 203.4. La coda della distribuzione è più ampia rispetto al valore centrale: il 99° percentile di Nvidia è stato di 536.9 microsecondi. Il SIP non è lento in senso umano. Altre due componenti lo sono.
In primo luogo, i tuoi dati potrebbero essere ritardati intenzionalmente. I feed di quotazioni gratuiti nelle app retail e nei siti di analisi tecnica sono comunemente ritardati di quindici minuti in base ai termini di licenza della borsa; lo streaming in tempo reale è un servizio a pagamento.
In secondo luogo, le società professionali non aspettano il SIP. Ogni borsa vende anche un feed diretto dal proprio matching engine. Una società in colocazione legge il feed e calcola il proprio best bid e offer prima che arrivi la versione dell'evento tramite il SIP — un vantaggio di microsecondi, decisivo per un market maker che quota entrambi i lati per tutto il giorno.
Con quale frequenza si aggiorna l'NBBO? Titoli liquidi vs titoli poco scambiati
Ogni titolo quotato ha un NBBO e la sua frequenza di aggiornamento funge da indicatore di liquidità. La tabella riporta la media delle recenti sessioni complete per quattro titoli ad alto volume e due small cap poco scambiate — Nathan's Famous (NATH) e Seneca Foods (SENEA).
L'esatto SQL dietro ogni numero
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, l'ETF sull'S&P 500, ha registrato una media di 3.428 milioni di aggiornamenti NBBO per sessione — 2031 volte rispetto al titolo meno scambiato in tabella. Nvidia ha registrato una media di 1.85 milioni, Apple 1.336 milioni. Poi il crollo: Seneca Foods ha registrato 8097 aggiornamenti in una sessione media, Nathan's Famous 1688. Nessun operatore può leggere uno schermo alla velocità di SPY: l'NBBO è un feed progettato per il software.
Quando l'NBBO si aggiorna più velocemente: apertura rispetto a metà giornata
Anche la frequenza di aggiornamento segue un ritmo giornaliero. Il grafico mostra la media degli aggiornamenti NBBO di Apple al minuto, suddivisa in intervalli di mezz'ora (Eastern Time); l'ultima colonna indica ogni intervallo come percentuale rispetto a quello delle 9:30.
L'esatto SQL dietro ogni numero
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_timeNella mezz'ora successiva alla auction di apertura, l'NBBO nazionale di Apple si è aggiornato in media 5657 volte al minuto, e l'intervallo delle 10:00 ha mantenuto quel ritmo al 89.5% del valore iniziale. La frequenza diminuisce poi durante la parte centrale della giornata: l'intervallo delle 14:30 ha registrato 1973 aggiornamenti al minuto, pari al 34.9% del ritmo di apertura. La fase finale verso la chiusura delle 15:30 recupera solo parzialmente — 3345 al minuto, ovvero il 59.1% dell'apertura — pertanto l'attività di quoting più intensa si è concentrata nella prima ora e non nell'ultima. Al di fuori dell'orario regolare, il flusso di dati è quasi assente, scendendo a 17 aggiornamenti al minuto dopo la campana delle 16:00.
Cosa accade all'NBBO durante un trading halt?
Quando un titolo subisce una variazione troppo rapida, le regole limit-up/limit-down attivano una sospensione di cinque minuti. Il quote non scompare né rimane attivo: l'aggiornamento si interrompe e l'ultimo dato registrato prima della pausa rimane visibile a schermo. GameStop (GME) ha subito una sospensione di questo tipo poco dopo le 11:00 Eastern del 14 maggio 2024; il pannello monitora i suoi aggiornamenti di quote e le relative transazioni, minuto per minuto.
L'esatto SQL dietro ogni numero
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_minNel minuto precedente la sospensione, 11:00, il quote consolidato di GameStop si è aggiornato 4511 volte su 12419 trades. Successivamente, entrambi i valori si azzerano: 0 record di quote a 11:02 e 0 a 11:03, con 0 trades corrispondenti — un quote che ha smesso di muoversi in un titolo che ha smesso di scambiare. Il quoting riprende a 11:06, il minuto della riapertura, con 4155 aggiornamenti e 14007 trades, il minuto con il maggior volume di scambi nella tabella. L'ultimo NBBO di un titolo in halt è un dato statico, non un prezzo scambiabile; la sessione di GameStop di gennaio 2021 mostra l'effetto di una serie di tali sospensioni sul tape.
Perché il tuo broker deve eseguirti al NBBO o a condizioni migliori
Il NBBO è un parametro di riferimento normativo. La Regulation NMS — il regolamento sulla struttura del mercato adottato dalla SEC nel 2005 — include la Rule 611, una norma sulla protezione degli ordini: un venue non può eseguire a un prezzo peggiore rispetto a una protected quote visualizzata su un altro exchange. I broker hanno inoltre l'obbligo di garantire ai clienti la best execution, misurata rispetto al NBBO: un ordine di acquisto market deve essere eseguito al national best ask o a un prezzo inferiore; un ordine di vendita market al national best bid o a un prezzo superiore.
La maggior parte dei lettori retail non lo considera: il tuo ordine market solitamente non raggiunge mai un exchange. La maggior parte del flusso marketable retail viene indirizzata ai wholesalers — market maker off-exchange che pagano per avere il diritto di eseguirlo — ed è eseguita internamente, con segnalazione tramite una reporting facility off-exchange. Il NBBO rimane il parametro di riferimento anche per loro: il wholesaler deve eguagliare o migliorare la quotazione nazionale al momento dell'esecuzione, e compete per il flusso offrendo un prezzo migliore — esegue una frazione di centesimo all'interno dello spread, pratica nota come price improvement. Il NBBO è il prezzo di riferimento, non il venue; il tipo di ordine che scegli determina se effettuerai o meno il crossing dello spread.
FAQ
L'NBBO include i lotti dispari?
No. La quotazione nazionale è composta solo da lotti standard. Secondo il Reg NMS, la dimensione del lotto standard varia in base al prezzo: da 100 azioni per valori inferiori a $250, fino a una singola azione per valori superiori a $10.000. Il bid più basso registrato per Ford sopra tale soglia era di 100 azioni, contro le 10 di AutoZone, il cui titolo ha un prezzo molto più elevato. I lotti dispari con prezzi migliori sono inclusi nello spread pubblicato ma non vengono visualizzati.
Perché la quotazione nella mia app di brokerage è diversa dall'NBBO in tempo reale?
Ci sono due ragioni, nessuna delle quali riguarda il SIP. I feed retail gratuiti sono solitamente ritardati di 15 minuti per via delle regole di licenza delle borse, a meno che non si paghi per il tempo reale. Inoltre, i dati consolidati sono un'istantanea pubblicata: il processo di consolidamento ha richiesto una mediana di 229.1 microsecondi su SPY, mentre le società con feed diretti dalle borse vedono l'evento con maggiore anticipo.
Cosa succede all'NBBO quando un titolo è sospeso?
Si blocca. Durante la pausa di cinque minuti di GameStop per limit-up/limit-down sopra citata, il tape ha registrato 0 aggiornamenti della quotazione e 11:03 e 0 operazioni. L'ultima quotazione rimane a schermo ma non è scambiabile; sarà un'asta di riapertura a stabilire la successiva.
L'NBBO è disponibile dopo la chiusura dei mercati?
Sì. Le quotazioni consolidate sono trasmesse dalle 4:00 alle 20:00 ET, quindi esiste una quotazione nazionale durante il premarket e l'after-hours trading — con una velocità molto inferiore rispetto alla sessione diurna: Apple ha registrato 65 aggiornamenti nell'ultimo minuto di premarket rispetto a 5657 dopo l'apertura.
Note sui dati: finestre e filtri
Le finestre mobili terminano tre giorni prima della generazione (un breve ritardo di ingestione è presente all'inizio del feed) e contano solo le sessioni complete — ovvero i giorni in cui SPY stampa tutte le 390 candele minute delle ore regolari. Il panel di Coca-Cola esclude i record a lato singolo o incrociati; i panel di conteggio considerano ogni record così com'è (mercati bloccati e incrociati copre quelli esclusi). Il panel di GameStop è ancorato a una data fissa, utilizzando le candele minute di SPY come riferimento temporale, pertanto i minuti di sospensione appaiono come zeri.
Ogni panel include la SQL che lo ha prodotto — aprine una, sostituisci il tuo ticker e conta i suoi aggiornamenti NBBO sul terminale Strasmore.