2. 沪深市场交易阶段总览

沪深两市的交易并不是一条从早到晚连续不断的行情流,而是由若干时间边界切分出的多个阶段。每个阶段有各自的撮合方式、可申报类型和行情发布节奏。理解这些边界,是正确解读行情快照、判断盘口数据含义的前提。本节先建立一张“时间—阶段—快照”的整体地图,后续章节再逐项深入字段细节。

一、五个阶段与两条市场的时间边界

以沪深交易所现行规则为基准,一个完整交易日可划分为五个阶段:开盘集合竞价、连续竞价、午间休市、收盘集合竞价、盘后固定价格交易。上交所与深交所在部分时点上存在差异,尤其是收盘集合竞价的起止时间与盘后固定价格交易的适用范围,需要分别记忆。

开盘集合竞价阶段,沪深两市均为 9:15 开始接受申报,9:25 集中撮合产生开盘价。其中 9:15—9:20 允许撤单,9:20—9:25 不接受撤单,这一细节直接影响行情中“虚拟撮合量”的可信度。9:25—9:30 沪深两市均不接受申报,但行情系统仍会发布开盘后的参考信息,属于“静默但不空白”的过渡区间。

连续竞价自 9:30 开始,至 11:30 午间休市;下午 13:00 恢复,上交所连续竞价持续到 14:57,深交所持续到 14:57 后进入收盘集合竞价。收盘集合竞价方面,深交所为 14:57—15:00,上交所同样在 14:57—15:00 进行收盘集合竞价。15:00 之后,盘后固定价格交易在 15:05—15:30 进行,目前主要适用于科创板与创业板股票,成交价格固定为当日收盘价。

记忆要点:开盘集合竞价“9:15 开始、9:25 定价、9:20 后不可撤”;收盘集合竞价“14:57 起、15:00 定价”;盘后固定价格交易“15:05—15:30、以收盘价成交”。

二、行情快照的触发机制

行情快照并非按固定秒表机械推送,而是由“事件触发 + 周期兜底”共同决定。交易所行情网关在撮合产生成交、订单簿发生显著变化、或到达预设时间间隔时,生成并发布一帧快照。连续竞价期间,沪深两市通常以约 3 秒为周期发布快照,同时叠加逐笔成交与逐笔委托数据;集合竞价期间,快照主要反映虚拟开盘参考价、虚拟匹配量和未匹配量,而不是真实成交。

这意味着同一只股票在不同阶段,快照字段的“语义”会变化。例如集合竞价快照中的“最新价”往往是虚拟参考价,成交量是虚拟匹配量;连续竞价快照中的最新价才是真实成交价。若不加区分地把集合竞价快照当作成交数据使用,就会在回测和盘中监控中产生系统性偏差。

沪深交易日阶段时间轴与行情快照触发 9:15 9:25 9:30 11:30 13:00 14:57 15:00 15:30 开盘集合竞价 静默期 连续竞价(上午) 午间休市 连续竞价(下午) 收盘集合竞价 收盘 盘后 快照触发方式 • 集合竞价:按虚拟撮合结果发布,含虚拟参考价、虚拟匹配量、未匹配量 • 连续竞价:成交/订单簿变化事件触发 + 约 3 秒周期兜底,叠加逐笔成交与逐笔委托 • 收盘集合竞价:14:57 起不再揭示虚拟参考价,15:00 一次性撮合定价 上交所 连续竞价至 14:57,随后收盘集合竞价 盘后固定价格交易 15:05—15:30(科创板) 深交所 连续竞价至 14:57,随后收盘集合竞价 盘后固定价格交易 15:05—15:30(创业板)

三、从快照字段反推所处阶段

实际开发中,我们常需要仅凭一帧行情快照判断它属于哪个阶段。一个稳妥的做法是组合使用“时间戳 + 字段特征”。时间戳落在 9:15—9:25 且成交量字段表现为虚拟匹配量时,可判定为开盘集合竞价;时间戳在 9:30—11:30 或 13:00—14:57 之间、且逐笔成交持续更新,则为连续竞价;时间戳在 14:57—15:00 且快照中不再出现新的虚拟参考价更新,则为收盘集合竞价。

需要特别提醒的是,午间休市期间行情并不“消失”。交易所通常仍会保留最后一帧快照,部分行情源会以“心跳”形式重复推送同一帧。若程序以“收到新快照”作为交易信号,午休期间可能被重复帧误触发。工程上应显式判断时间窗口,而不是依赖快照是否到达。

四、一个可执行的阶段判定示例

下面给出一个简化的阶段判定逻辑,输入为快照时间戳(HHMMSS 整数)与是否含逐笔成交标志,输出阶段标签。示例参数为教学假设,实际使用时需按交易所最新规则校准边界值。

def judge_phase(hhmmss, has_tick_trade):
    if 91500 <= hhmmss < 92500:
        return "开盘集合竞价"
    if 92500 <= hhmmss < 93000:
        return "开盘后静默期"
    if (93000 <= hhmmss < 113000) or (130000 <= hhmmss < 145700):
        return "连续竞价" if has_tick_trade else "连续竞价(无逐笔)"
    if 113000 <= hhmmss < 130000:
        return "午间休市"
    if 145700 <= hhmmss < 150000:
        return "收盘集合竞价"
    if 150500 <= hhmmss < 153000:
        return "盘后固定价格交易"
    return "非交易时段"

用几个示例时间点验证:输入 (92000, False) 返回“开盘集合竞价”;输入 (100000, True) 返回“连续竞价”;输入 (120000, False) 返回“午间休市”;输入 (145800, False) 返回“收盘集合竞价”;输入 (151000, False) 返回“盘后固定价格交易”。若某帧在 10:00 却 has_tick_trade 为 False,则提示行情源可能缺失逐笔数据,应检查订阅通道而非直接采信。

五、阶段边界对行情解读的影响

阶段边界不只是时间标签,它决定了字段的“解释规则”。开盘集合竞价的虚拟匹配量反映的是潜在供需,撤单窗口关闭前后的变化尤其值得关注;连续竞价的快照反映真实撮合结果,适合计算买卖压力;收盘集合竞价不揭示虚拟参考价,因此不能用盘中思路去推测收盘价;盘后固定价格交易以收盘价成交,其行情更多体现为成交量而非价格发现。