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

开盘价差为何变宽?真实数据分析

通过逐笔报价分析开盘时段的价差溢价,对比 SPY、Apple 与 Etsy 的流动性差异,揭示价差随时间消退的规律。

开盘阶段的价差比美股常规交易时段的其他阶段都要宽。股票流动性越低,价差惩罚越严重。在下方的滚动窗口中,交易前半小时的 Etsy(中盘股)买卖价差中位数是正午时的 3.34x,Apple 是 2.02x。作为三者中报价最频繁的品种,SPY 的汇总比率为 1x;该比率呈水平线,这是由一美分价格网格造成的,而非自由开盘的结果。本页面基于逐笔报价进行计时。

市价单的价差成本

每只股票同时显示两个价格:买入价 (bid),即当前的最佳买入报价;以及卖出价 (ask),即当前的最佳卖出报价。两者之间的差距即为 买卖价差市价单(即按当前最佳价格立即成交的订单)需要支付该价差:买入时按卖出价成交,卖出时按买入价成交,差价归报价方所有,通常是 做市商。以下两个报价特性至关重要:报价随时间波动,且价格变动以整分为单位——高价 ETF 与低价中盘股所能达到的最小价差可能相同,均为一分钱。

价差时钟:同一种形态,三个流动性层级

本图表涵盖三个流动性层级:S&P 500 ETF (SPY)、超大盘股 Apple 以及中盘股 Etsy。在最近的数日窗口期内,每一个有效的 NBBO 更新(即您的经纪商显示的市场最佳买卖价,详情请参阅 NBBO 说明)均被归入常规交易时段的 30 分钟时间段内。每个时间段的中位数价差除以该股票的最窄价差,因此数值为 1 表示达到该股的最窄水平。

查询每半小时中位数价差,相对于各标的最窄档位的倍数(美东常规交易时段)
每个数字背后的完整 SQL
SELECT et_time,
       round(anyIf(rel, ticker = 'SPY'), 2) AS spy_x,
       round(anyIf(rel, ticker = 'AAPL'), 2) AS aapl_x,
       round(anyIf(rel, ticker = 'ETSY'), 2) AS etsy_x
FROM (
    SELECT ticker,
           et_time,
           median_bps / min(median_bps) OVER (PARTITION BY ticker) AS rel
    FROM (
        SELECT ticker,
               formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
               quantileExact(0.5)(toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000) AS median_bps
        FROM global_markets.cache_stocks_quotes
        WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
          AND sip_timestamp >= toDateTime(today() - 14)
          AND sip_timestamp < toDateTime(today() - 3)
          AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
          AND bid_price > 0
          AND ask_price > bid_price
        GROUP BY ticker, et_time
    )
)
GROUP BY et_time
ORDER BY et_time

教科书将日内模式称为“U型”:开盘时价差较宽,午间收窄,收盘前再次扩大。在此处的测量结果呈现为“滑雪坡”形态——针对那些价差有波动空间的股票。Etsy 的开盘价差是其最窄水平的 5.78 倍,到 10:30 时降至 2.99 倍,午餐时间为 1.86 倍;Apple 的开盘价差为 3.04 倍。对于这三只股票,价差最窄的半小时都在收盘阶段——分别为 1x、1x 和 1x。因此,交易者所认为的“收盘前”价差扩大,实际上发生在 收盘竞价 之后的盘后交易时段。

SPY 的曲线非常平稳:开盘时段为 1 倍,午间为 1 倍。其中位数价差全天几乎没有波动。这并非没有开盘溢价,而是受限于最小报价单位(penny grid)。

分分钱网格:紧凑型股票的溢价所在

SPY 的中位数价差在开盘时为 2¢,午间为 2¢ —— 这两个数值完全相同,因此中位数无法反映变化。但底层分布可以。本图表统计了每半小时内,处于一美分最小价差水平的报价更新占比。

查询每半小时报价更新中处于最小一美分价差的比例(美东常规交易时段)
每个数字背后的完整 SQL
SELECT et_time,
       round(100 * countIf(ticker = 'SPY' AND spread_c <= 1.0001) / countIf(ticker = 'SPY'), 1) AS spy_pct_penny,
       round(100 * countIf(ticker = 'AAPL' AND spread_c <= 1.0001) / countIf(ticker = 'AAPL'), 1) AS aapl_pct_penny,
       round(100 * countIf(ticker = 'ETSY' AND spread_c <= 1.0001) / countIf(ticker = 'ETSY'), 1) AS etsy_pct_penny
FROM (
    SELECT ticker,
           formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
           toFloat64(ask_price - bid_price) * 100 AS spread_c
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
      AND sip_timestamp >= toDateTime(today() - 14)
      AND sip_timestamp < toDateTime(today() - 3)
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
      AND bid_price > 0
      AND ask_price > bid_price
)
GROUP BY et_time
ORDER BY et_time

SPY 在开盘后的第一个半小时内,有 20.7% 的报价更新处于一美分底线,而最后一个半小时这一比例为 43.1%。Apple 的比例分别为 3.1% 和 30.6%;Etsy 的比例分别为 0.2% 和 8.3%。所有股票的开盘价差均比收盘价差更远离底线,尾部分布亦然:SPY 的 90% 分位开盘价差为 4¢,午间为 3¢ —— 是中位数的 1.32 倍,而中位数仅为 1 倍。SPY 存在溢价;但由于分分钱网格过于粗糙,中位数无法捕捉到这种变化。

为什么开盘时价差较宽?

开盘后的半小时内,三种情况会同时出现,且这些情况在午餐时间前都会消失。

  • 隔夜积压的信息集中释放。 在下午 4:00 收盘至次日 开盘竞价 之间,连续交易处于停滞状态,长达 17.5 小时的信息(如财报、业绩指引、海外市场动态)会不断堆积。首批报价是基于跳空后的价格,而非前一交易日的收盘价。
  • 价格发现过程仍在进行。 竞价机制会将积压的信息压缩成单一成交价;随后市场需要数分钟时间围绕该价格寻找波动区间。在寻找区间期间,报价重定价的速度最快。
  • 订单簿尚未填满。 盘前交易 的报价参与者较少,而开盘并不意味着订单簿会立即恢复完整。

停牌对时间的影响

停牌是上述机制的极端表现。根据涨跌幅限制 (LULD) 规则,若股票价格超出近期平均价格的波动区间,将触发五分钟的暂停交易;交易所也可以因等待新闻发布而停牌。停牌期间,市场上不存在可撮合的双向报价,屏幕上显示的 单边或交叉订单簿 并非可交易市场。交易通过复牌竞价重启,其首批报价需在短短几分钟内承担原本属于 9:30 开盘时的信息积压与价格发现压力。在开盘期间停牌的股票,其溢价成本会增加一倍。

盘前交易属于不同的市场

盘前交易通常由买卖盘深度不足驱动;本面板通过以基点 (bps) 为单位(即股价的百分之零点零一)来衡量该指标,以便在不同价格的股票之间进行比较。

查询各交易阶段中位数报价价差,单位为基点(美东时间)
每个数字背后的完整 SQL
SELECT phase,
       round(quantileExact(0.5)(spy_b), 2) AS spy_bps,
       round(quantileExact(0.5)(aapl_b), 2) AS aapl_bps,
       round(quantileExact(0.5)(etsy_b), 2) AS etsy_bps
FROM (
    SELECT multiIf(et_min >= 240 AND et_min < 420, 'Premarket 04:00-07:00',
                   et_min >= 420 AND et_min < 570, 'Premarket 07:00-09:30',
                   et_min >= 570 AND et_min < 600, 'Open 09:30-10:00',
                   et_min >= 720 AND et_min < 840, 'Midday 12:00-14:00',
                   et_min >= 960 AND et_min < 1200, 'After-hours 16:00-20:00', 'other') AS phase,
           if(ticker = 'SPY', spread_bps, NULL) AS spy_b,
           if(ticker = 'AAPL', spread_bps, NULL) AS aapl_b,
           if(ticker = 'ETSY', spread_bps, NULL) AS etsy_b
    FROM (
        SELECT ticker,
               toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
                 + toMinute(toTimeZone(sip_timestamp, 'America/New_York')) AS et_min,
               toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps
        FROM global_markets.cache_stocks_quotes
        WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
          AND sip_timestamp >= toDateTime(today() - 14)
          AND sip_timestamp < toDateTime(today() - 3)
          AND bid_price > 0
          AND ask_price > bid_price
    )
    WHERE phase != 'other'
)
GROUP BY phase
ORDER BY indexOf(['Premarket 04:00-07:00', 'Premarket 07:00-09:30', 'Open 09:30-10:00', 'Midday 12:00-14:00', 'After-hours 16:00-20:00'], phase)

盘前交易并非质量较差的开盘阶段,而是一个完全不同的市场。Etsy 在美东时间凌晨 4:00 至 7:00 之间的中位数报价价差为 306.25 bps,7:00 至开盘时为 307.57 bps;相比之下,开盘半小时内为 30.79 bps,午间为 9.21 bps —— 此处指价格的百分比,而非分。Apple 早盘报价价差为 9.82 bps,午间为 0.96 bps;甚至 SPY 的价差也从 0.8 bps 扩大至 0.27 bps。收盘后,价差会重新收窄 —— Etsy 为 240.45 bps,Apple 为 6.99 bps。

The bill in cents: the open vs. midday

Costs arrive in cents. The table prices the same names — median spread over the opening half hour (9:30–10:00 a.m. ET) against midday (noon–2:00 p.m. ET), the 90th-percentile quote in each window, the quote-update counts, and the excluded one-sided, locked, or crossed quotes.

查询开盘溢价:开盘期(9:30-10:00 ET)与午间(12:00-14:00 ET)的中位数及第90百分位价差对比
每个数字背后的完整 SQL
SELECT ticker,
       round(countIf(isNotNull(spread_cents)) / 1e6, 2) AS valid_updates_m,
       round(quantileExactIf(0.5)(spread_cents, clock_min BETWEEN 810 AND 839), 2) AS open30_cents,
       round(quantileExactIf(0.5)(spread_cents, clock_min BETWEEN 960 AND 1079), 2) AS midday_cents,
       round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_bps,
       round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS midday_bps,
       round(quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)
             / quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS open_vs_midday_x,
       round(quantileExactIf(0.9)(spread_cents, clock_min BETWEEN 810 AND 839), 2) AS open30_p90_cents,
       round(quantileExactIf(0.9)(spread_cents, clock_min BETWEEN 960 AND 1079), 2) AS midday_p90_cents,
       round(quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 810 AND 839), 2) AS open30_p90_bps,
       round(quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 810 AND 839)
             / quantileExactIf(0.9)(spread_bps, clock_min BETWEEN 960 AND 1079), 2) AS p90_x,
       toString(countIf(isNull(spread_cents))) AS dropped_onesided_locked_crossed
FROM (
    SELECT ticker,
           toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_min,
           if(bid_price > 0 AND ask_price > bid_price, toFloat64(ask_price - bid_price) * 100, NULL) AS spread_cents,
           if(bid_price > 0 AND ask_price > bid_price, toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, NULL) AS spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
      AND sip_timestamp >= toDateTime(today() - 14)
      AND sip_timestamp < toDateTime(today() - 3)
      AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)

Cents per share and dollars per 100 shares are the same number, so the table is a bill: a 100-share round trip in Etsy at the median opening quote gives up $24 against $7 at midday quotes; Apple, $6 against $3. The premium climbs as the tape thins — 1x for SPY, 2.02x for Apple, 3.34x for Etsy, whose 0.19 million quote updates are a small fraction of Apple's 8.97 million. The tier swamps the clock: SPY's opening half hour, 0.27 bps, is tighter than Etsy's calmest midday (9.21 bps), whose worst-decile open measured 75.67 bps.

溢价是否在每个交易日都会出现?

将多日的报价汇总取中位数,解决的是时间窗口问题,而非针对单一早盘。本面板按交易日重新计算开盘与午间的比例:包括典型交易日、最平稳交易日、最剧烈交易日,以及开盘价波动始终最大的股票。

查询逐个交易日:开盘价差高于午间出现的频率及幅度
每个数字背后的完整 SQL
SELECT ticker,
       count() AS sessions,
       round(quantileExact(0.5)(ratio), 2) AS median_session_x,
       round(min(ratio), 2) AS calmest_session_x,
       round(max(ratio), 2) AS worst_session_x,
       round(100 * countIf(ratio > 1) / count(), 0) AS pct_sessions_open_wider
FROM (
    SELECT ticker,
           toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session_date,
           quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 810 AND 839)
             / quantileExactIf(0.5)(spread_bps, clock_min BETWEEN 960 AND 1079) AS ratio
    FROM (
        SELECT ticker,
               sip_timestamp,
               toHour(sip_timestamp) * 60 + toMinute(sip_timestamp) AS clock_min,
               toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000 AS spread_bps
        FROM global_markets.cache_stocks_quotes
        WHERE ticker IN ('SPY', 'AAPL', 'ETSY')
          AND sip_timestamp >= toDateTime(today() - 14)
          AND sip_timestamp < toDateTime(today() - 3)
          AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
          AND bid_price > 0
          AND ask_price > bid_price
    )
    GROUP BY ticker, session_date
    HAVING countIf(clock_min BETWEEN 810 AND 839) > 0
       AND countIf(clock_min BETWEEN 960 AND 1079) > 0
)
GROUP BY ticker
ORDER BY indexOf(['SPY', 'AAPL', 'ETSY'], ticker)

7 个交易日中,SPY 的开盘价波动幅度大于午间的情况占 71%,Apple 为 100%,Etsy 为 100%。典型交易日的溢价情况为:SPY 为 1x —— 在该交易盘中流动性最强的标的中,极小的价差几乎难以察觉;相比之下,Apple 为 2.03x,Etsy 为 3.29x,后者的溢价非常明显。结论在于离散度:Etsy 最平稳的早盘开盘价是其午间价格的 2.08x,最剧烈时则为 4.5x。开盘溢价仅代表平均水平和极端情况,绝非对明日 9:31 走势的保证。

压力测试:2026年7月7日的 MU 早盘表现

滚动窗口会平滑单日表现,因此我们选取特定日期进行分析:2026年7月7日星期二,Micron 在半导体板块下跌 当日回顾 中表现如下。

查询MU 至 2026年7月7日:前一交易日收盘价、开盘价及隔夜跳空
每个数字背后的完整 SQL
WITH prev AS (
    SELECT argMax(toFloat64(close), window_start) AS prev_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'MU'
      AND window_start >= '2026-07-06 13:30:00'
      AND window_start < '2026-07-06 20:00:00'
),
day AS (
    SELECT argMin(toFloat64(open), window_start) AS day_open
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'MU'
      AND window_start >= '2026-07-07 13:30:00'
      AND window_start < '2026-07-07 20:00:00'
)
SELECT round((SELECT prev_close FROM prev), 2) AS prior_close,
       round((SELECT day_open FROM day), 2) AS jul7_open,
       round(((SELECT day_open FROM day) - (SELECT prev_close FROM prev)) / (SELECT prev_close FROM prev) * 100, 1) AS overnight_gap_pct

MU 收盘价为 $984.31,开盘价为 $923.01 —— 跳空幅度为 -6.2%。当日价差走势如下:

查询MU — 2026年7月7日每半小时中位数报价价差(美东常规交易时段)
每个数字背后的完整 SQL
SELECT et_time,
       median_spread_cents,
       median_spread_bps,
       round(100 * median_spread_cents / max(median_spread_cents) OVER (), 1) AS pct_of_widest,
       dropped_onesided_locked_crossed
FROM (
    SELECT formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
           round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) * 100, bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_cents,
           round(quantileExactIf(0.5)(toFloat64(ask_price - bid_price) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price > bid_price), 1) AS median_spread_bps,
           toString(countIf(NOT (bid_price > 0 AND ask_price > bid_price))) AS dropped_onesided_locked_crossed
    FROM global_markets.cache_stocks_quotes
    WHERE ticker = 'MU'
      AND sip_timestamp >= '2026-07-07 13:30:00'
      AND sip_timestamp < '2026-07-07 20:00:00'
    GROUP BY et_time
)
ORDER BY et_time

波动持续。MU 开盘后半小时的中位数价差为 62¢ —— 以 $923.01 的开盘价计算,波动为 6.7 bps —— 这是全天波动最大的半小时时段。一个时段后,中位数降至 45¢,中午为 39¢,最后半小时为 38¢。溢价按预期出现,且流动性等级依然稳定:即便在此期间,MU 的百分比价差仍比 Etsy 的常规开盘价差 (30.79 bps) 更窄。

::: 数据说明:窗口、过滤器与方法
SPY/Apple/Etsy 面板采用滚动机制:包含截至最后一次刷新前三天(避开数据摄取延迟)的 11 个日历日 NBBO 更新数据。常规交易时段面板使用夏季(EDT)时钟的 UTC 分钟过滤器进行截取;下方的校验机制确保窗口两端均落在美东时间 9:30(570 代表 9:30 a.m.)—— 若使用冬季时钟则会触发校验失败并停止页面加载。阶段面板直接转换为美东时间,覆盖美东时间 4:00 a.m.–8:00 p.m.。全程排除单边报价(买价或卖价为零)以及锁价或倒挂(买价等于或高于卖价)的报价;为保证交易稳定性,仅保留在两个窗口内均有报价的交易时段。中位数和第 90 百分位数为精确值;MU 面板的数据锁定在 2026 年 7 月 6 日至 7 日。

查询窗口保护:UTC 交易时段过滤器使滚动窗口的两端均对应美东时间 9:30
每个数字背后的完整 SQL
SELECT toHour(toTimeZone(toDateTime(today() - 14) + toIntervalMinute(810), 'America/New_York')) * 60
         + toMinute(toTimeZone(toDateTime(today() - 14) + toIntervalMinute(810), 'America/New_York')) AS win_start_et_min,
       toHour(toTimeZone(toDateTime(today() - 4) + toIntervalMinute(810), 'America/New_York')) * 60
         + toMinute(toTimeZone(toDateTime(today() - 4) + toIntervalMinute(810), 'America/New_York')) AS win_end_et_min

:::

FAQ

What time of day are bid-ask spreads widest?

Premarket — Etsy's median quoted spread measured 306.25 bps between 4:00 and 7:00 a.m. ET against 9.21 bps midday. Inside regular hours the widest stretch is the first half hour after the open; the tightest, the last before the close.

Why does SPY's spread look flat at the open?

US stocks are quoted in whole cents, and SPY's median spread sits at 2¢ most of the day — too coarse a grid to register a small widening. Session by session its open still ran wider than its midday in 71% of sessions, and its 90th-percentile opening spread measured 4¢ against 3¢.

Is it bad to place a market order at the open?

It is among the most expensive stretches of the regular session for demanding immediacy — $24 against $7 on a 100-share Etsy round trip in the window above. A limit order caps that cost, at the risk of not filling, and an order that can wait may cross a narrower gap: Etsy's premium fell from 5.78x to 2.99x within an hour.

Do spreads widen again at the close?

Not within regular hours — the final half-hour bucket was the tightest of the day on all three names. That widening arrives after the 4:00 p.m. bell, in the thinner extended session: Apple quoted 6.99 bps there against 0.96 bps midday.

Do options spreads widen at the open too?

The panels here measure equity quotes only and claim nothing about options. The mechanics point the same way — an option's quote depends on the underlying stock's price, least settled in the first minutes — and our options-cost breakdown measures option spreads directly.


Every panel carries the SQL that produced it — swap in a ticker you trade and time its spread clock on the Strasmore terminal.