Strasmore Research
学习 Matt Connor作者: Matt Connor · 更新于 2026-07-23 · data as of July 23, 2026 · refreshed weekly

什么是 NBBO 全国最佳买卖报价

了解NBBO如何汇总全市场最优报价,以及经纪商如何执行订单。通过KO的实时Tick数据,深入研究报价更新的节奏。

NBBO(全国最佳买卖报价)是美国股票的合并报价:它涵盖了所有交易所的最高买入价和最低卖出价。这是您的应用程序所显示的报价,也是经纪商在执行订单时必须达到或优于该价格的基准。下文所有数据均来自真实的报价记录,查询详情请见附件。

什么是 NBBO?通俗定义

美股并非在单一场所交易。NYSE、Nasdaq 以及其他十余个交易所都会为同一代码运行订单簿,且各自分别拥有最佳买价和卖价。NBBO 将这些报价汇总:它将全市场最高的买价和最低的卖价并列显示,并附带各处的成交量。这种汇总由证券信息处理器(SIPs)完成,这是由各交易所共同运营的市场基础设施。

有两个细节需要注意。买价和卖价可能同时存在于两个不同的交易所。此外,价格变动并非更新的唯一条件:即使价格不变,仅成交量变化也会触发新记录。交易员将这两个最佳价格称为“the touch”;两者之间的差额即为 买卖价差

如何解读 NBBO 报价:价格、规模与节奏

以下是近期一个完整交易日内,东部时间下午 1:30 时 Coca-Cola (KO) 的连续十条 NBBO 记录——即实际接收到的全国报价。

查询KO — 近期交易日 ET 1:30 p.m. 起连续 10 次 NBBO 更新
每个数字背后的完整 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 股。买卖价差为 1¢。

股份数量即为触价规模 (size at the touch) ——即在两个最优价格上显示的流动性。若订单规模超过该数值,则会消耗该规模并以订单簿中的下一个价格成交。显示的规模仅为最低限度,而非全部库存:通常在两个价格之上或两者之间,还存在未显示的交易意向,包括 暗池 中的订单。

请向下阅读各行。所有 10 记录与第一条记录的时间间隔均在 484.95 毫秒以内。报价并无固定时间表——每当最优买卖价发生变化时,SIP 就会发布报价。以下任何一种情况都会产生一条新记录:买价或卖价变好、最优价格对应的股份数量变化,或者交易所排名发生更替。如需查看完整的交易日视图,请参阅 微观结构深度解析

NBBO 是否包含零股交易?

通常不包含。全国最佳买卖报价(NBBO)仅由标准股(round-lot)报价构成。少于标准股数量的订单称为“零股(odd lot)”:此类订单可能以优于全国最佳买价的价格挂在交易所订单簿上,并在此成交,但永远不会出现在 NBBO 中。

标准股不再统一为 100 股。根据 SEC 修订后的 Reg NMS 报价规则,标准股根据股价分层:250 美元以下为 100 股;250.01 美元至 1,000 美元为 40 股;1,000.01 美元至 10,000 美元为 10 股;超过该价格则为 1 股。分层信息在行情记录中可见——面板会提取在合并报价中,跨越六个标的、各价格区间内出现的最小买单规模。

查询NBBO 显示的最小规模 — 不同价格档位的 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_price

Ford 报价约在 $13.9,该小时内从未显示小于 100 股的买单;Coca-Cola 在 $84.18 也是如此。Apple 在 $314.36 时降至 40;AutoZone 在每股 $3030.52 时降至 10,显示的买单中位数位 10。报价底线随价格区间变动。价格更优的零股订单可能隐藏在已公布的价差之内而不显示,因此真实的最佳可用价格有时会优于 NBBO 所显示的水平。

为什么您的应用报价与实时 NBBO 不符

您在手机上看到的报价经过了以下路径:交易所撮合引擎 → SIP → 数据供应商 → 券商 → 屏幕。每条记录都包含两个时间戳:交易所的时间戳和 SIP 发布时的时间戳。两者之间的差距即为整合步骤所需的时间。

查询交易所时间戳至 SIP 时间戳 — 整合步骤(微秒)
每个数字背后的完整 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。长尾分布比中位数更明显:Nvidia 的第 99 百分位延迟达到 536.9 微秒。从人类感官来看,SIP 并不慢,但有两个因素会导致延迟。

首先,您的数据可能是故意延迟的。根据交易所的许可条款,零售应用和图表网站提供的免费报价通常会有 15 分钟的延迟;实时流数据通常需要付费订阅。

其次,专业机构不会等待 SIP。每家交易所都会销售其撮合引擎的直接数据源。托管在交易所附近的机构会读取该数据,并在 SIP 发布相关事件之前计算出自己的最佳买卖价。这种微秒级的优势,对于全天进行双向报价的 做市商 而言至关重要。

NBBO 更新频率:高流动性与低流动性股票对比

每只上市股票都有 NBBO,其更新频率反映了流动性水平。下表统计了四只高交易量股票与两只低交易量小盘股(Nathan's Famous (NATH) 和 Seneca Foods (SENEA))近期完整交易日的平均数据。

查询每交易日 NBBO 更新次数 — 4 个高流动性标的 vs. 2 个低流动性小盘股
每个数字背后的完整 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)

标普 500 ETF (SPY) 每场交易的 NBBO 平均更新次数为 3.428 百万次,是表中交易最清淡股票的 2031 倍。Nvidia 平均更新 1.85 百万次,Apple 为 1.336 百万次。随后数据大幅下降:Seneca Foods 平均每场交易更新 8097 次,Nathan's Famous 为 1688 次。人类无法以 SPY 的速度阅读屏幕:NBBO 是为软件设计的行情数据流。

NBBO 更新最快的时间点:开盘与午间

更新频率呈现每日周期性。该图表以半小时为间隔(东部时间),统计了 Apple 每分钟的 NBBO 平均更新次数;最后一列显示各时段相对于 9:30 时段的百分比。

查询AAPL — 按半小时区间划分的平均每分钟 NBBO 更新次数 (ET, 4 a.m. 至 8 p.m.)
每个数字背后的完整 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。在常规交易时间之外,交易频率极低,下午 4:00 收盘后每分钟仅剩 17 次更新。

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.

查询GME, 2024-05-14 — LULD 暂停期间 5 分钟内的每分钟 NBBO 更新与成交量
每个数字背后的完整 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

In 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.

为什么您的经纪商必须以 NBBO 或更优价格成交

NBBO 是监管基准。SEC 于 2005 年通过的市场结构规则——Regulation NMS 中包含一项订单保护规则,即 Rule 611:交易场所的执行价格不得差于其他交易所显示的受保护报价。经纪商还对客户负有最佳执行义务,其衡量标准为 NBBO:市价买单的成交价应等于或低于全国最佳卖价,市价卖单的成交价应等于或高于全国最佳买价。

大多数散户投资者忽略了这一点:您的市价单通常不会到达交易所。大部分散户可执行订单会被路由至批发商——即通过支付费用获取订单执行权的场外做市商——并在其内部完成执行,最后向场外报告机构进行打印。NBBO 仍然约束这些批发商:批发商在执行瞬间必须匹配或优于全国报价;为了争夺订单流,他们会通过提供优于全国报价的价格来竞争,即在买卖价差内提供极小幅度的价格优势,这被称为价格改善。NBBO 是参考价格而非交易场所;您 选择的订单类型 决定了您是否会跨越价差成交。

常见问题

NBBO 是否包含零股(Odd Lots)?

不包含。全国报价仅由整股(Round-lot)报价汇编而成。根据 Reg NMS 规定,整股的定义随价格而异:250 美元以下为 100 股,10,000 美元以上低至 1 股。在 Ford 的案例中,行情显示其最低买价为 100 股,而 AutoZone 的最低买价为 10 股(其股价更高)。价格更优的零股包含在已公布的买卖价差内,但不会单独显示。

为什么我券商 App 中的报价与实时 NBBO 不同?

原因有两个,均与 SIP 无关。根据交易所许可规则,免费零售行情通常延迟 15 分钟,除非您购买了实时行情。此外,整合数据是发布的快照:SPY 的中位数整合步骤耗时 229.1 微秒,而使用交易所直连数据源的机构会更早看到事件。

股票停牌时 NBBO 会发生什么?

报价会冻结。在 GameStop 上述五分钟的限价涨跌停(LULD)暂停期间,行情记录了 0 次报价更新以及 11:03 次和 0 次交易。最后一次报价会保留在屏幕上,但无法交易;下一条报价将由复牌拍卖决定。

盘后交易时是否存在 NBBO?

存在。整合报价在东部时间凌晨 4:00 至晚上 8:00 期间持续传输,因此在 盘前和盘后交易 期间也存在全国报价,但频率远低于日内:在盘前最后阶段,Apple 每分钟仅有 65 次更新,而开盘后为 5657 次。

数据说明:时间窗口与过滤器

滚动窗口在生成前三天结束(数据源前端存在短暂摄取延迟),且仅计算完整交易日——即 SPY 打印了全部 390 个常规交易时段分钟线的数据日。Coca-Cola 数据组排除了单边和交叉记录;计数面板则按原样统计所有记录(锁定与交叉市场 涵盖了被排除的部分)。GameStop 数据组固定在特定日期,以 SPY 的分钟线作为时间基准,因此暂停期间的分钟线显示为零。


每个数据面板均附带生成该数据所需的 SQL 语句——您可以打开它,替换为您自己的代码,并在 Strasmore 终端上统计其 NBBO 更新次数。