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

什么是锁定市场与交叉市场:数据实测与 Reg NMS

锁定市场指最优买价等于最优卖价,交叉市场指最优买价高于最优卖价。本文讲清 Reg NMS 为何禁止这两类报价,并用真实的全市场报价数据测量它们各自出现的频率。

锁定市场(locked market)指的是某只股票的最优买价恰好等于其最优卖价的那一刻——买卖价差正好为零。交叉市场(crossed market)走得更远:最优买价高于最优卖价。美国的市场规则禁止交易所展示这两类报价,然而它们在合并报价记录中却屡见不鲜。本页给出两者的定义,讲清规则本身,并测量它们各自出现的频率。

什么是锁定市场?

每只美国股票在同一时刻都有两个价格:买价(bid),即任何买方愿意支付的最高价;以及卖价(ask),即任何卖方愿意接受的最低价。卖价通常高于买价,两者之间的差额就是买卖价差,也就是立刻成交所内含的成本。

锁定市场就是这个差额收窄到零的那一刻:一只股票报价为买价 $10.00 / 卖价 $10.05,价差为五美分;若最优卖价降到 $10.00 而买价保持不动,这笔报价就在 $10.00 / $10.00 上被锁定了。

在单一交易所内部,这种状态无法持续——$10.00 的买单遇上 $10.00 的卖单会当场成交。锁定报价只能存活于交易所之间。美国股票同时在十几家交易所交易,而 NBBO(全国最优买卖报价,也就是您的券商 App 上显示的那个报价)把所有交易所的最优买价和最优卖价拼接在一起。一家交易所的 $10.00 买价与另一家交易所的 $10.00 卖价,会把全国报价锁住,而这两家交易所各自的订单簿都没有出现锁定。

什么是交叉市场?

交叉市场把通常的次序颠倒了过来:最优买价高于最优卖价——比如 $10.02 的买价对上 $10.00 的卖价。纸面上任何人都可以按 $10.00 买入、按 $10.02 卖出,无风险地赚走每股两美分。正是这笔白捡的钱决定了交叉报价无法持久:专业机构——其中就包括为大多数股票双边报价的做市商——会在套利真正出现的瞬间把它拿走,而拿走这个动作本身就消耗掉了这两笔报价。数据里留下的只是那一闪:一条被夹在某家交易所的更新与另一家交易所的更新之间的交叉记录。

Reg NMS 为什么禁止锁定与交叉报价

这条禁令写在 Regulation NMS(全国市场系统规则,SEC 于 2005 年通过的美国股票跨交易所交易规则手册)之中。第 610(d) 条要求每家交易所在常规交易时段内阻止其会员展示会锁定或交叉受保护报价(其他交易所上可自动执行的最优买卖报价)的报价。其用意是:一笔等于别人卖价的买价现在就能成交,规则手册希望它被路由出去并执行掉,而不是作为一对相互矛盾的报价一直挂在那里展示。

规则中有一条边界对下文的数据很重要:它管的是展示,而不是存在。每家交易所只能决定自己的订单簿展示什么;合并记录则是实时跨交易所拼装出来的,各条行情线路彼此赛跑。锁定的 NBBO 可以就这样出现在合并记录里,而没有任何一个参与者违反规则。

锁定与交叉报价为什么仍会出现在报价记录上

答案是速度。交易所以微秒为单位更新报价,合并行情在每一次更新时重建。两类再平常不过的事件把锁定与交叉记录送了进去:

  • 赛跑。 一家交易所把买价提到 $10.00,而另一家仍在展示 $10.00 的卖价。拼接之后,NBBO 在较慢的一方更新之前一直读作锁定;同一场赛跑若多冲出一美分,读出来就是交叉。
  • 陈旧记录与单边记录。 有些记录只带一侧——有买价没有卖价,或者反过来。交投清淡的股票一天中处在这种状态的时间要长得多,下文的普查会显示这一点。

本页的计数口径:锁定 = 买价等于卖价且两侧均为正;交叉 = 买价高于一个为正的卖价;单边 = 任一侧为零或缺失。没有任何数据被悄悄丢弃——单边记录单独占一列。

锁定与交叉市场多久出现一次?

先从整条报价记录看起:2026-07-17 当天全部挂牌代码的每一次 NBBO 更新——这是我们普查窗口内最近一个已完成的交易日。

查询全市场报价普查:该交易日全部 NBBO 更新中的锁定、交叉与单边记录
每个数字背后的完整 SQL
WITH (
    SELECT max(toDate(toTimeZone(window_start, 'America/New_York')))
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY' AND window_start < toDateTime(today() - 3)
) AS census_day
SELECT
    formatDateTime(census_day, '%Y-%m-%d') AS session_date,
    round(count() / 1e6, 0) AS updates_m,
    round(countIf(bid_price = ask_price AND bid_price > 0) / 1e6, 2) AS locked_m,
    round(countIf(bid_price > ask_price AND ask_price > 0) / 1e3, 1) AS crossed_k,
    round(countIf(bid_price = ask_price AND bid_price > 0) / toFloat64(greatest(countIf(bid_price > ask_price AND ask_price > 0), 1)), 0) AS locked_per_crossed,
    round(countIf(bid_price >= ask_price AND ask_price > 0 AND bid_price > 0) / toFloat64(count()) * 1e4, 1) AS locked_or_crossed_per_10k,
    round(countIf(bid_price <= 0 OR ask_price <= 0) / toFloat64(count()) * 1e4, 1) AS one_sided_per_10k
FROM global_markets.cache_stocks_quotes
WHERE sip_timestamp >= toDateTime(census_day)
  AND sip_timestamp < toDateTime(census_day + 1)

这个交易日共有 565 百万次报价更新:其中 10.31 百万次锁定、84.7 千次交叉——合计每 10,000 次更新中有 184 次,锁定与交叉的数量之比为 122 比一。缺失一侧的记录为每 10,000 次 2.6 次。7月7日市场回顾在它测量的每一个价差旁边都披露了同一组计数。

全市场的比率把成千上万只差异极大的股票混在了一起。下表把这项普查改在一组固定的十只股票上重跑——八只家喻户晓的代码,加上两只真正清淡的小盘股:Nathan's Famous (NATH) 和 Seneca Foods (SENEA)——窗口为最近若干个已完成的交易日,含延长交易时段,并在旁边列出每只股票的典型报价价差。

查询分股票普查:八只流动性充沛的代码与两只清淡小盘股,最近若干个已完成交易日
每个数字背后的完整 SQL
SELECT ticker,
       round(count() / 1e3, 1) AS updates_k,
       round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price), bid_price > 0 AND ask_price >= bid_price) * 100, 1) AS median_spread_cents,
       countIf(bid_price = ask_price AND bid_price > 0) AS locked_records,
       countIf(bid_price > ask_price AND ask_price > 0) AS crossed_records,
       round(countIf(bid_price >= ask_price AND ask_price > 0 AND bid_price > 0) / toFloat64(count()) * 1e4, 1) AS locked_or_crossed_per_10k,
       round(countIf(bid_price <= 0 OR ask_price <= 0) / toFloat64(count()) * 1e4, 1) AS one_sided_per_10k
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'NVDA', 'MSFT', 'TSLA', 'KO', 'AMD', 'NATH', 'SENEA')
  AND sip_timestamp >= toDateTime(today() - 10)
  AND sip_timestamp < toDateTime(today() - 3)
GROUP BY ticker
ORDER BY ticker

把价差那一列对着比率读。可口可乐的典型报价宽度为 1 美分,每 10,000 次更新中有 248.2 次出现锁定或交叉报价;英伟达(3 美分)为每 10,000 次 58.8 次,SPY(2 美分)为 57.7 次。AMD 在延长交易日内的典型报价宽度为 44 美分,结果仅为每 10,000 次 8.2 次。一次锁定需要两家交易所在同一瞬间落到同一个美分上——典型报价越宽,这段路就越长。

清淡的股票几乎不留痕迹:Nathan's Famous 在 13.2 千次更新中打印出 0 条锁定记录和 0 条交叉记录,Seneca Foods 在 44.5 千次更新中对应 0 条和 0 条。属于它们的是另外一列:单边记录在 Nathan's Famous 为每 10,000 次 24.3 次、在 Seneca Foods 为 19.1 次,而 SPY 只有 0 次。锁定与交叉记录出现在报价又快又窄的地方;单边记录出现在报价稀少的地方。

锁定与交叉报价集中出现在什么时候?

按股票的普查回答了「在哪里」,时钟回答「在什么时候」。下面是这组固定股票按 30 分钟美东时间分桶的锁定或交叉比率,覆盖 4:00 a.m. 至 8:00 p.m. ET(北京时间 16:00 至次日 08:00),并在旁边列出每个时段的更新流量。

查询按 30 分钟美东时间分桶的每万次更新锁定或交叉记录数,固定股票组,含延长交易时段
每个数字背后的完整 SQL
SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
       round(countIf(bid_price >= ask_price AND ask_price > 0 AND bid_price > 0) / toFloat64(count()) * 1e4, 1) AS locked_or_crossed_per_10k,
       round(count() / 1e6, 2) AS updates_m
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'NVDA', 'MSFT', 'TSLA', 'KO', 'AMD', 'NATH', 'SENEA')
  AND sip_timestamp >= toDateTime(today() - 10)
  AND sip_timestamp < toDateTime(today() - 3)
GROUP BY et_time
HAVING et_time >= '04:00' AND et_time < '20:00'
ORDER BY et_time

比率在整个交易日中逐步攀升。05:00 的盘前时段(北京时间 17:00)在 0.43 百万次更新上测得每 10,000 次 4.8 次;09:30 时段——常规交易的头半小时,由开盘集合竞价开启,即北京时间 21:30——在 10.61 百万次更新上跑出每 10,000 次 30.1 次。此后比率一路向收盘走高,在 15:30 时段(北京时间次日 03:30)达到每 10,000 次 84.1 次,那正是通往收盘集合竞价的冲刺阶段。一行凭证把这个形状钉住了:

查询凭证:锁定与交叉记录总数,以及按交易时段划分的比率(盘前、开盘、午间、收盘,美东时间)
每个数字背后的完整 SQL
SELECT
    round(countIf(is_locked) / 1e3, 1) AS locked_k,
    round(countIf(is_crossed) / 1e3, 1) AS crossed_k,
    round(countIf(is_locked) / toFloat64(greatest(countIf(is_crossed), 1)), 1) AS locked_per_crossed,
    round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 240 AND 569) / toFloat64(countIf(et_minute BETWEEN 240 AND 569)) * 1e4, 1) AS premarket_per_10k,
    round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 570 AND 599) / toFloat64(countIf(et_minute BETWEEN 570 AND 599)) * 1e4, 1) AS opening_half_hour_per_10k,
    round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 720 AND 779) / toFloat64(countIf(et_minute BETWEEN 720 AND 779)) * 1e4, 1) AS midday_hour_per_10k,
    round(countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)) * 1e4, 1) AS closing_half_hour_per_10k,
    round((countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)))
        / (countIf((is_locked OR is_crossed) AND et_minute BETWEEN 570 AND 599) / toFloat64(countIf(et_minute BETWEEN 570 AND 599))), 1) AS close_to_open_ratio,
    round((countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)))
        / (countIf((is_locked OR is_crossed) AND et_minute BETWEEN 720 AND 779) / toFloat64(countIf(et_minute BETWEEN 720 AND 779))), 1) AS close_to_midday_ratio,
    round((countIf((is_locked OR is_crossed) AND et_minute BETWEEN 930 AND 959) / toFloat64(countIf(et_minute BETWEEN 930 AND 959)))
        / (countIf((is_locked OR is_crossed) AND et_minute BETWEEN 240 AND 569) / toFloat64(countIf(et_minute BETWEEN 240 AND 569))), 1) AS close_to_premarket_ratio
FROM (
    SELECT
        bid_price = ask_price AND bid_price > 0 AS is_locked,
        bid_price > ask_price AND ask_price > 0 AS is_crossed,
        toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60 + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_minute
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('SPY', 'QQQ', 'AAPL', 'NVDA', 'MSFT', 'TSLA', 'KO', 'AMD', 'NATH', 'SENEA')
      AND sip_timestamp >= toDateTime(today() - 10)
      AND sip_timestamp < toDateTime(today() - 3)
)

在整个窗口内,这组固定股票打印出 270.7 千条锁定记录,对应 31.6 千条交叉记录——每一条交叉对应 8.6 条锁定。收盘前半小时的比率为每 10,000 次 84.1 次,是开盘半小时那 30.1 次的 2.8 倍,是午间一小时那 45.8 次的 1.8 倍。

展示禁令在 9:30 a.m. ET(北京时间 21:30)之前根本不适用,然而 4:00 至 9:30 的整段——盘前交易,其报价流量只有常规交易时段的一小部分——却只有每 10,000 次 13.7 次,而收盘前半小时是这个比率的 6.1 倍。这些记录聚集在报价又快又窄的地方,而不是规则手册最宽松的地方。

数据说明:窗口与范围
  • 全市场普查覆盖一整个 UTC 自然日,包含所有挂牌代码;固定股票组的面板覆盖最近若干个已完成交易日的滚动窗口,含延长交易时段(4:00 a.m. 至 8:00 p.m. ET,即北京时间 16:00 至次日 08:00)。每个窗口都在刷新日期之前三天结束——报价仓库在其前沿有一到两天的入库延迟。
  • 十只股票的表格是一组固定的核对样本,而非全市场排名;4:00 p.m. ET 之后的时段所对应的流量只有常规交易时段的一小部分(更新次数一列因此单独作图)。
  • 这些都是记录条数,而不是持续时长。逐笔更新的取证——纳秒级间隔,以及单个交易日 SPY 报价记录上的交叉与零买价凭证——收录在6月29日微观结构深度分析中。

FAQ

美股锁定市场是什么意思?

锁定市场是最优买价等于最优卖价的报价状态——价差为零。它产生于交易所之间:一家交易所的买价正好等于另一家交易所的卖价。Regulation NMS 禁止交易所在常规交易时段展示会造成这种状态的报价。

买价高于卖价是怎么回事?

买价高于卖价就是交叉市场。单一交易所的订单簿不可能维持这种状态——相互重叠的订单会立即成交——因此交叉的 NBBO 几乎总是两家交易所的报价被夹在更新过程中间的产物。

锁定市场和交叉市场违法吗?

对普通投资者来说不违法。Regulation NMS 第 610(d) 条要求交易所阻止其会员在常规交易时段展示锁定或交叉的报价。合并行情中那些转瞬即逝的记录,是各家交易所在略有差异的时刻更新所留下的痕迹。

锁定和交叉报价多久出现一次?

很频繁:仅 2026-07-17 一天,合并报价记录上就出现了 10.31 百万条锁定记录和 84.7 千条交叉记录——即每 10,000 次更新中有 184 次。报价越紧的股票,这个比率越是远高于清淡的股票;越接近收盘,也越高于开盘时。


本页的每一个数字都由一条已存储的查询渲染而成——展开任意面板下方的 SQL,即可看到一次锁定或一次交叉究竟是如何计数的。想在您自己交易的股票上跑同一份普查,在 Strasmore 终端上用自然语言提问即可。

#locked market#crossed market#market structure#quotes#流动性