2. 证券行情基础

做多数据源行情统一接入,第一步不是写代码,而是把“行情到底是什么”这件事拆清楚。不同数据源对同一概念的命名、字段、推送频率往往不一致,如果接入层没有统一的语义模型,后续的清洗、对齐、分发就会变成无休止的补丁。本节围绕行情数据的分类体系、Level-1 与 Level-2 的差异、快照与逐笔的本质区别、K 线与复权的计算逻辑,以及交易时段与常见术语,建立一套可落地的认知框架。

一、行情数据的分类:按粒度与用途划分

行情数据可以从两个维度理解:时间粒度和业务用途。按粒度,最细的是逐笔委托与逐笔成交,往上是快照(Tick),再往上是分钟 K 线、日 K 线。按用途,则分为交易类数据(价格、成交量、盘口)和衍生类数据(K 线、复权因子、技术指标)。接入工程中最容易混淆的是“快照”和“逐笔”被当成同一层数据,实际上它们的产生机制完全不同。

  • 逐笔数据:交易所每发生一笔委托或成交就推送一条,包含时间、价格、数量、买卖方向,是重建盘口和微观结构分析的基础。
  • 快照数据:按固定频率(如 3 秒)对市场状态切片,包含最新价、买卖五档或十档、累计成交量等,是大多数行情展示的默认数据。
  • K 线数据:由快照或逐笔聚合而成,按时间窗口统计开高低收,属于二次加工数据。

二、Level-1 与 Level-2:深度与信息量的分水岭

Level-1 通常指基础行情,提供最优一档买卖价、最新价、成交量等;Level-2 则提供十档盘口、逐笔成交、逐笔委托、委托队列等更细颗粒度的数据。两者的核心差异不只是“档位多少”,而是是否包含订单流信息。Level-2 的逐笔委托能让你看到每一笔挂单的进入和撤销,这是 Level-1 完全不具备的。

对比项Level-1Level-2
盘口档位最优一档(买一/卖一)十档甚至更多
逐笔成交通常无或延迟聚合实时逐笔
逐笔委托无有
推送频率约 3 秒快照毫秒级事件驱动
典型用途行情展示、简单策略高频、微观结构分析
接入层设计时,建议把 Level-1 和 Level-2 抽象为同一套“行情事件”模型,用字段标记数据级别,而不是为两者各写一套解析逻辑。这样多数据源扩展时只需增加适配器,不必改动核心管道。

三、快照与逐笔:两种数据流的本质区别

快照是状态,逐笔是事件。快照告诉你“此刻市场长什么样”,逐笔告诉你“市场是如何变成这样的”。这个区别决定了接入层的处理方式:快照可以覆盖更新,逐笔必须顺序追加且不能丢包。很多数据源在断线重连后会补发快照,但逐笔往往无法完整回补,因此逐笔通道需要额外的序号校验和补数机制。

快照(状态切片) vs 逐笔(事件流) 快照:固定频率切片 T1 T2 T3 每 3 秒一个完整状态 可覆盖更新,允许丢中间帧 重连后补发最新快照即可 逐笔:事件顺序追加 E1 E2 E3 E4 每笔委托/成交即一条事件 必须保序,序号不可断 断线需补数或重建盘口

四、K 线与复权:从原始价格到可比较序列

K 线由快照或逐笔按时间窗口聚合,核心字段是开盘价、最高价、最低价、收盘价和成交量。接入层通常不负责计算 K 线,但必须理解其来源,否则在数据对齐时容易把不同数据源的 K 线混用。复权则是另一个关键概念:当股票发生分红、送股、配股时,历史价格会产生跳空,前复权和后复权分别以当前价格和上市首日价格为基准调整历史序列。

# 复权因子示例(简化)
date        close    factor    adj_close(前复权)
2024-05-10  10.00    1.0000    10.00
2024-05-13  10.00    1.0000    10.00   # 除权日,10送10
2024-05-14   5.00    0.5000     5.00
2024-05-15   5.20    0.5000     5.20

# 前复权价格 = 原始价格 × 复权因子
# 后复权价格 = 原始价格 ÷ 复权因子
多数据源接入时,复权因子必须来自统一来源。不同数据源对同一除权事件的因子精度可能不同,混用会导致回测结果出现难以排查的偏差。建议在接入层维护一份独立的复权因子表,行情价格只做原始存储,复权在查询时计算。

五、交易时段与常见术语

A 股交易时段分为集合竞价和连续竞价:9:15–9:25 为开盘集合竞价,9:30–11:30 和 13:00–15:00 为连续竞价,14:57–15:00 为收盘集合竞价。接入层需要根据时段决定是否接收和转发数据,非交易时段的快照通常是静态的,逐笔则完全停止。常见术语包括:盘口(买卖档位)、委比(买卖委托量对比)、换手率(成交量与流通股本之比)、振幅(最高最低价差与昨收之比)。

六、常见误区与复盘

第一个误区是把快照当成逐笔用。有些数据源在 Level-1 中提供“逐笔成交”,实际是快照差分聚合的结果,并非真正的逐笔事件,用它做微观分析会失真。第二个误区是忽略交易时段对数据的影响,在非交易时段收到重复快照时误判为数据源异常。第三个误区是复权处理放在接入层,导致原始数据被覆盖,后续无法还原。正确的做法是:接入层只做标准化和路由,复权、K 线聚合等衍生计算放在下游服务,保持原始数据的不可变性。

本节的核心结论:行情接入的本质是“语义统一”。无论数据源提供的是快照还是逐笔、Level-1 还是 Level-2,接入层都要把它们映射到同一套事件模型,并明确区分状态型数据和事件型数据的处理策略。这是后续多数据源统一接入工程能够稳定运行的基础。