3. 行情快照基础字段解析
在沪深竞价的行情快照中,投资者最常关注的是“最新价、买卖五档、成交量”这类价格与数量字段,但真正决定一条快照能否被正确解析、正确对齐、正确回放的,往往是位于快照头部的元数据字段。它们不直接描述价格,却承担着“这条快照属于谁、处于什么阶段、发生在什么时刻、是第几条”的身份与定位职责。本节围绕证券代码、证券简称、交易阶段标识、时间戳、快照序号这五类基础字段展开,说明其含义、取值约定与典型使用场景。
一、证券代码与证券简称:快照的身份标识
证券代码是快照的唯一业务主键,沪深市场均采用 6 位数字编码,但两个市场的代码段划分不同,且同一代码在不同板块可能代表完全不同的品种。常见约定包括:沪市主板 600/601/603/605 开头,科创板 688 开头;深市主板 000/001 开头,中小板并入后仍沿用 002 段,创业板 300/301 开头。此外还有 5 开头的沪市基金、1 开头的沪市债券、12 开头的深市可转债等。实际开发中,仅凭 6 位代码判断品种并不可靠,必须结合市场标识(如交易所代码或市场类型字段)共同确定唯一证券。
证券简称是便于人阅读的名称字段,例如“贵州茅台”“宁德时代”。它存在两个使用陷阱:一是简称可能因 ST、*ST、退市整理、更名等发生变更,历史回放时若用当前简称去匹配历史快照,会出现对不上的情况;二是不同市场可能存在简称相近甚至相同的证券。因此工程上应以“市场标识 + 证券代码”作为连接键,证券简称只用于展示与人工核对,不参与数据关联。
二、交易阶段标识:快照所处的市场状态
交易阶段标识描述该快照生成时证券所处的交易状态,是竞价行情中最容易被忽视却最影响策略正确性的字段。沪深竞价的典型阶段包括:开盘集合竞价、连续竞价、午间休市、收盘集合竞价(深市及沪市部分品种)、已收盘、停牌等。不同阶段下,快照中价格字段的含义截然不同——集合竞价期间“最新价”可能是虚拟撮合价或尚未产生成交,买卖盘可能只揭示部分信息;停牌期间价格冻结,成交量不再增长。
使用场景上,交易阶段标识至少有三个作用:第一,过滤无效快照,例如策略只应在连续竞价阶段计算盘口斜率;第二,解释异常值,集合竞价阶段出现“零成交但有委托”属于正常现象,不应被当作数据缺失;第三,驱动状态机,将行情接入程序建模为“未开盘→集合竞价→连续竞价→休市→收盘”的状态迁移,阶段字段就是迁移的触发依据。需要注意,交易阶段标识的取值集合与编码方式因数据源而异,接入前必须查阅对应接口文档,不能假设沪市与深市、Level-1 与 Level-2 完全一致。
三、时间戳:快照的时间坐标
时间戳字段记录快照对应的市场时间,通常精确到毫秒甚至微秒。它至少涉及三个需要明确的约定:时区(统一为北京时间)、日期与时间的组合方式(是“YYYYMMDD + HHMMSSsss”两字段,还是单一长整型)、以及该时间是交易所撮合时间还是行情发布落地时间。这两者之间存在网络与处理延迟,在高频场景下不可混用。
时间戳的典型用途包括:按时间排序重建盘口演变、计算快照间隔以判断行情是否稀疏、与本地接收时间做差得到端到端延迟、以及在回测中驱动事件时钟。实践中应特别注意“同一时间戳多条快照”和“时间戳回退”两种异常:前者常见于多标的合并推送,后者可能源于数据源切换或时钟校正,处理时需以快照序号作为次级排序键。
四、快照序号:同一标的内的单调计数
快照序号是数据源为同一证券连续发布的快照所编的序号,通常单调递增。它的核心价值在于“连续性校验”:若相邻两条快照的序号不连续,说明中间发生了丢包或过滤,此时依赖盘口变化率的计算就会出现偏差。工程上常见的做法是维护每个标的上一次序号,收到新快照时先做差值判断,差值为 1 则正常处理,大于 1 则标记缺口并按策略决定补拉、丢弃或降级处理。
需要区分快照序号与交易所的逐笔序号、频道序号:前者标识“第几次快照”,后者标识“第几笔委托/成交”或“频道内第几条消息”,粒度与作用域都不同。另外,序号通常在每日开盘时重置,跨日比较没有意义,回放系统必须结合交易日期字段一起使用。
五、字段协同:一个可执行的校验流程
把五个字段放在一起,才能形成完整的快照处理闭环。假设接入程序收到一条快照,合理的处理顺序是:先用“市场标识 + 证券代码”定位标的并校验是否在订阅列表内;再用交易阶段标识判断当前是否处于策略允许的阶段,若为停牌或已收盘则直接丢弃;接着用时间戳与本地接收时间比较,若延迟超过阈值则记录告警;最后用快照序号与上一序号做差,差值为 1 正常入库,差值大于 1 则标记缺口。这个顺序的意义在于:越靠前的判断成本越低,越能尽早过滤无效数据,避免把计算资源浪费在错误快照上。
下面给出一个简化的校验逻辑示例,用于说明字段如何配合使用(示例参数为教学假设,非实测结果):
# 伪代码:单标的快照校验
last_seq = None
for snap in stream:
if snap.market + snap.code not in subscriptions:
continue # 非订阅标的
if snap.phase not in ("连续竞价", "收盘集合竞价"):
continue # 阶段过滤
delay = recv_time - snap.timestamp
if delay > 500: # 单位:毫秒,示例阈值
log_warn(snap.code, delay)
if last_seq is not None:
gap = snap.seq - last_seq
if gap != 1:
mark_gap(snap.code, gap) # 缺口处理
last_seq = snap.seq
store(snap)
这段逻辑体现了元数据字段的真正价值:它们不是装饰性的描述信息,而是数据质量的第一道防线。证券代码决定“是不是我要的”,交易阶段决定“该不该算”,时间戳决定“是否及时”,快照序号决定“是否完整”。四道判断各司其职,缺一不可。
综上,证券代码与证券简称解决“是谁”,交易阶段标识解决“什么状态”,时间戳解决“何时”,快照序号解决“第几条且是否连续”。理解这五类字段的取值约定与协同关系,是后续将快照与交易阶段正确对照、并在此基础上构建盘口分析与策略逻辑的前提。