Qué es el NBBO y cómo funciona
El NBBO es la cotización consolidada que indica el mejor bid y ask disponible en el mercado. Conozca cómo su broker debe igualar este precio para cada ticker.
El NBBO, o la mejor oferta y demanda nacional, es la cotización consolidada de una acción en EE. UU.: representa el precio más alto que cualquier comprador ofrece y el precio más bajo que cualquier vendedor pide, en todas las bolsas simultáneamente. Es la cotización que muestra su aplicación y el punto de referencia que su broker debe igualar o mejorar en su orden. Cada cifra presentada a continuación proviene de registros de cotizaciones reales; se adjunta la consulta.
¿Qué es el NBBO? Una definición clara
Una acción de EE. UU. no se negocia en un solo lugar. NYSE, Nasdaq y más de una docena de otras bolsas operan un libro de órdenes para el mismo ticker, cada una con su propia mejor oferta de compra (bid) y de venta (ask). El NBBO consolida esos valores: la mejor oferta de compra disponible en cualquier mercado y la mejor oferta de venta disponible en cualquier mercado, junto con la cantidad de acciones disponibles en cada una. Esta consolidación es realizada por los procesadores de información de valores, o SIPs, que son servicios de utilidad de mercado operados conjuntamente por las bolsas.
Dos detalles son importantes desde el inicio. El bid y el ask pueden estar en dos bolsas distintas al mismo tiempo. Además, no es necesario un cambio de precio para generar una actualización: un cambio en el tamaño de la orden al mismo mejor precio también genera un nuevo registro. Los operadores llaman a los dos mejores precios the touch; la diferencia entre ellos es el bid-ask spread.
Cómo leer una cotización NBBO: precios, tamaños y ritmo
Aquí se presentan diez registros consecutivos del NBBO para Coca-Cola (KO) desde las 1:30 p.m. hora del Este en una sesión completa reciente; la cotización nacional tal como llega.
El SQL exacto detrás de cada cifra
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 10Lea la primera fila como dos ofertas vigentes, con marca de 13:30:02.886 ET. La mejor oferta de compra: $83.3 por 200 acciones. La mejor oferta de venta: $83.31 por 200 acciones. La diferencia entre ambas fue de 1¢.
El recuento de acciones es el size at the touch (tamaño en el precio de contacto), que representa la liquidez mostrada en los dos mejores precios. Una orden mayor a ese tamaño consume dicha liquidez y ejecuta el resto en los siguientes precios del libro. El tamaño mostrado es un mínimo, no un inventario completo: a menudo existe más interés no mostrado en o entre los dos precios, incluyendo en dark pools.
Ahora lea las filas hacia abajo. Los 10 registros ocurrieron dentro de un margen de 484.95 milisegundos respecto al primero. No existe un horario fijo; el SIP publica la información cada vez que cambia un mejor precio, y cualquiera de estos cuatro eventos genera una fila: una mejor oferta de compra (bid), una mejor oferta de venta (ask), un cambio en el número de acciones en cualquiera de los dos mejores precios, o un exchange reemplazando a otro en la parte superior. Para una visión detallada de la microestructura, consulte el análisis profundo de microestructura.
¿Incluye el NBBO los odd lots?
Por lo general, no. La cotización nacional se construye únicamente con interés de round-lot. Una orden por menos acciones de lo que constituye un round lot es un odd lot: puede permanecer en el libro de una bolsa a un precio mejor que el national best bid, negociarse allí y nunca aparecer en el NBBO.
El round lot ya no es de exactamente cien acciones. Bajo las reglas de cotización enmendadas de la Reg NMS de la SEC, este se divide por precio de la acción: cien acciones hasta los $250, cuarenta desde los $250.01 hasta los $1,000, diez desde los $1,000.01 hasta los $10,000, y una por encima de eso. Los niveles son visibles en la cinta; el panel toma el tamaño de bid más pequeño que aparezca en la cotización consolidada para seis nombres a través de los rangos.
El SQL exacto detrás de cada cifra
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, cotizando alrededor de $13.9, nunca muestra un bid menor a 100 acciones en esa hora; lo mismo ocurre con Coca-Cola a $84.18. Apple, a $314.36, baja a 40; AutoZone, a $3030.52 por acción, baja hasta 10, con un bid mediano mostrado de 10. El piso sigue el nivel de precio. El interés de odd-lot con mejor precio puede permanecer dentro del spread publicado sin mostrarse, por lo que el verdadero mejor precio disponible es a veces mejor de lo que implica el NBBO.
Por qué la cotización de su app no es exactamente el NBBO en tiempo real
La cotización que lee en un teléfono ha recorrido este camino: motor de emparejamiento de la bolsa → SIP → proveedor de datos → broker → pantalla. Cada registro tiene dos marcas de tiempo —la de la propia bolsa y la del SIP al momento de la publicación— y la diferencia entre ambas es el paso de consolidación.
El SQL exacto detrás de cada cifra
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)La mediana de la brecha en SPY fue de 229.1 microsegundos —millonésimas de segundo— y en Apple fue de 203.4. La cola de la distribución es más amplia que el centro: el percentil 99 de Nvidia alcanzó los 536.9 microsegundos. El SIP no es lento en un sentido humano. Otros dos factores sí lo son.
Primero, sus datos pueden tener retraso deliberado. Los feeds de cotizaciones gratuitos en aplicaciones minoristas y sitios de gráficos suelen tener un retraso de quince minutos bajo los términos de licencia de las bolsas; la transmisión en tiempo real es un servicio de pago.
Segundo, las firmas profesionales no esperan al SIP. Cada bolsa también vende un feed directo desde su propio motor de emparejamiento. Una firma con colocación (colocated) lee este feed y calcula su propio mejor bid y offer antes de que llegue la versión del SIP de ese evento —una ventaja de microsegundos, decisiva para un market maker que cotiza ambos lados durante todo el día.
¿Con qué frecuencia se actualiza el NBBO? Acciones líquidas vs. poco líquidas
Cada acción que cotiza tiene un NBBO, y su tasa de actualización sirve como indicador de liquidez. La tabla muestra el promedio de sesiones completas recientes para cuatro activos con alto volumen de negociación y dos empresas de baja capitalización — Nathan's Famous (NATH) y Seneca Foods (SENEA).
El SQL exacto detrás de cada cifra
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, el ETF del S&P 500, promedió 3.428 millones de actualizaciones del NBBO por sesión, lo cual es 2031 veces el valor del activo más bajo de la tabla. Nvidia promedió 1.85 millones y Apple 1.336 millones. Luego se observa una caída drástica: Seneca Foods registró 8097 actualizaciones en una sesión promedio y Nathan's Famous 1688. Ninguna persona puede leer una pantalla al ritmo de SPY: el NBBO es un feed diseñado para software.
Cuándo se actualiza más rápido el NBBO: la apertura frente al mediodía
La tasa de actualización también mantiene un ritmo diario. El gráfico muestra el promedio de actualizaciones del NBBO de Apple por minuto en intervalos de media hora (hora del Este); la última columna muestra cada intervalo como un porcentaje del de las 9:30.
El SQL exacto detrás de cada cifra
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_timeEn la media hora posterior a la subasta de apertura, la cotización nacional de Apple se actualizó 5657 veces por minuto en promedio, y el intervalo de las 10:00 mantuvo ese ritmo al 89.5% del mismo. El volumen de datos disminuye hacia el mediodía: el intervalo de las 2:30 registró 1973 actualizaciones por minuto, lo que representa el 34.9% del ritmo de apertura. El acercamiento al cierre a las 3:30 solo recupera parte del volumen — 3345 por minuto, el 59.1% de la apertura — por lo que la mayor actividad de cotización ocurrió en la primera hora y no en la última. Fuera del horario regular, el flujo de datos es casi nulo, bajando a 17 actualizaciones por minuto tras la campana de las 4:00 p.m.
What happens to the NBBO during a trading halt?
When a stock moves too far too fast, the limit-up/limit-down rules pause it for five minutes. The quote neither vanishes nor stays live: it stops being refreshed, and the last record before the pause is the frame left on your screen. GameStop (GME) tripped such a pause just after 11:00 a.m. Eastern on May 14, 2024; the panel tracks its quote updates and trades, minute by minute, across it.
El SQL exacto detrás de cada cifra
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_minIn the minute before the pause, 11:00, GameStop's consolidated quote updated 4511 times against 12419 trades. Then both columns fall off a shelf: 0 quote records at 11:02 and 0 at 11:03, with 0 trades to match — a quote that has stopped moving, in a stock that has stopped trading. Quoting returns at 11:06, the reopening minute, with 4155 updates and 14007 trades, the heaviest trade minute in the table. A halted stock's last NBBO is a fossil, not a tradable price; the January 2021 GameStop session shows what a chain of such pauses does to a tape.
Por qué su broker debe ejecutarlo al NBBO o mejor
El NBBO es un referente regulatorio. La Regulación NMS —el conjunto de reglas de estructura de mercado de la SEC, adoptado en 2005— incluye una regla de protección de órdenes, la Regla 611: un mercado no puede ejecutar a un precio peor que una cotización protegida mostrada en otra bolsa. Los brokers también tienen la obligación de ofrecer best execution a sus clientes, medida respecto al NBBO: una orden de compra a mercado debe ejecutarse al mejor ask nacional o uno inferior; una orden de venta a mercado, al mejor bid nacional o uno superior.
La mayoría de los lectores minoristas pasan esto por alto: su orden a mercado generalmente nunca llega a una bolsa. La mayor parte del flujo marketable minorista se dirige a wholesalers —market makers fuera de bolsa que pagan por el derecho de ejecutarlo— y se ejecuta internamente, registrándose en una instalación de reporte fuera de bolsa. El NBBO sigue aplicándoles: el wholesaler debe igualar o mejorar la cotización nacional en el momento de la ejecución, y compite por el flujo al mejorarla —ejecuta una fracción de centavo dentro del spread, lo que se conoce como price improvement. El NBBO es el precio de referencia, no el lugar de ejecución; el tipo de orden que elija determina si usted cruza el spread o no.
Preguntas frecuentes
¿Incluye el NBBO los lotes impares (odd lots)?
No. La cotización nacional se compone únicamente de cotizaciones de lotes estándar (round-lot). Según la Reg NMS, el tamaño del lote estándar varía según el precio: desde 100 acciones para precios menores a $250, hasta una sola acción para precios superiores a $10,000. La oferta más pequeña registrada para Ford fue de 100 acciones, frente a las 10 de AutoZone, cuyas acciones tienen un costo mucho mayor. Los lotes impares con mejores precios se encuentran dentro del spread publicado, pero no se muestran.
¿Por qué la cotización en mi aplicación de corretaje es diferente al NBBO en vivo?
Existen dos razones, y ninguna tiene que ver con el SIP. Los feeds gratuitos para minoristas suelen tener un retraso de 15 minutos debido a las reglas de licencias de las bolsas, a menos que se pague por tiempo real. Además, los datos consolidados son una captura de pantalla publicada: el paso de consolidación registró una mediana de 229.1 microsegundos en SPY, mientras que las firmas con feeds directos de la bolsa ven el evento antes.
¿Qué sucede con el NBBO cuando se suspende una acción?
Se congela. Durante la pausa de cinco minutos por limit-up/limit-down de GameStop mencionada arriba, la cinta registró 0 actualizaciones de cotización y 11:03 y 0 operaciones. La última cotización permanece en pantalla pero no es negociable; una subasta de reapertura establece la siguiente.
¿Existe el NBBO fuera del horario de mercado?
Sí. Las cotizaciones consolidadas se transmiten de 4:00 a.m. a 8:00 p.m. ET, por lo que existe una cotización nacional durante el premarket y after-hours trading — a una fracción del ritmo diurno: Apple tuvo 65 actualizaciones en el último bloque del premarket frente a 5657 tras la apertura.
Notas de datos: ventanas y filtros
Las ventanas móviles terminan tres días antes de su generación (existe un breve retraso de ingesta en el extremo frontal del feed) y solo cuentan sesiones completas: días en los que SPY registra todas las barras de un minuto del horario regular de 390 minutos. El panel de Coca-Cola excluye registros de un solo lado y mercados cruzados; los paneles de conteo toman cada registro tal cual (locked and crossed markets cubre los excluidos). El panel de GameStop está vinculado a una fecha fija, utilizando las barras de un minuto de SPY como eje temporal, por lo que los minutos de pausa se muestran como ceros.
Cada panel se entrega con el SQL que lo produjo: abra uno, sustituya su propio ticker y cuente sus actualizaciones de NBBO en la terminal Strasmore.