2. Market Data基础

在讨论多源去重与主键设计之前,必须先建立对行情数据本身的清晰认知。行情数据并不是单一形态的数据,它按内容、时效、用途可分为多个类别,不同类别来自不同数据源,采用不同格式与传输协议。理解这些差异,是后续判断“什么算重复、什么算同一主键”的前提。

一、行情数据的分类:从快照到逐笔

行情数据按粒度与生成方式,通常分为以下几类:

  • 快照数据(Snapshot / Quote):按固定频率(如每3秒、每500毫秒)推送的最新买卖盘口与成交汇总,包含最新价、买卖一档或多档、成交量、成交额等。它是大多数行情终端的基础数据。
  • 逐笔成交(Trade / Tick):每一笔成交的明细,包含成交时间、价格、数量、买卖方向。它是构建K线和成交量指标的最细粒度来源。
  • 逐笔委托(Order):每一笔委托的进入、变更与撤销,反映市场深度变化。部分市场(如A股)不公开逐笔委托,仅提供委托队列。
  • 盘口深度(Level-2 / Order Book):多档买卖盘口,通常为5档、10档甚至全档,用于分析买卖压力与流动性。
  • 衍生数据(Derived):由上述原始数据计算得出,如K线、均线、涨跌幅、换手率、资金流向等。

分类的意义在于:不同类别的数据,其主键候选字段完全不同。快照的主键通常包含“标的+时间戳”,逐笔成交的主键则必须包含“成交编号”或“交易所序列号”,否则无法区分同一毫秒内的多笔成交。

二、常见数据源:交易所、聚合商与第三方

行情数据源按层级可分为三类:

  1. 交易所直连(Exchange Direct):如上交所、深交所、港交所、纳斯达克、纽交所。数据最权威、延迟最低,但接入成本高,且各交易所协议不同。
  2. 行情聚合商(Aggregator):如路透、彭博、Wind、同花顺、东方财富。它们从多个交易所采集并标准化,提供统一接口,但可能引入二次加工与延迟。
  3. 第三方数据服务(Vendor / API):如新浪财经、腾讯财经、Tushare、AkShare、Alpha Vantage。成本低、接入快,适合研究与小规模应用,但数据质量与稳定性参差不齐。
多源去重的典型场景,正是同时接入交易所直连与第三方API。同一只股票的最新价,可能来自两个源,时间戳与精度不同,需要判断是否为同一逻辑记录。

三、数据格式与传输协议

行情数据的传输格式与协议,直接影响解析方式与主键提取。常见组合如下:

数据源类型 常见格式 传输协议 主键提取要点
交易所直连 二进制(FAST、STEP、私有) TCP/UDP 组播 交易所序列号、频道号
聚合商 JSON、XML、CSV HTTP/HTTPS、WebSocket 标的代码+时间戳+源标识
第三方API JSON、CSV HTTP REST、WebSocket 标的代码+时间戳(精度低)
本地文件 CSV、Parquet、HDF5 文件读取 行号+标的+时间

以WebSocket推送的JSON快照为例,一条典型消息如下:

{
  "source": "vendor_a",
  "symbol": "600519.SH",
  "timestamp": 1717036800123,
  "last": 1688.00,
  "bid": 1687.99,
  "ask": 1688.01,
  "volume": 123400
}

而交易所二进制逐笔成交,解析后可能得到:

exchange=SSE
channel=001
seq=8847321
symbol=600519
price=1688.00
qty=100
side=B
trade_time=20240530103000123

可以看到,第三方源的“timestamp”是毫秒级,而交易所逐笔的“trade_time”精确到毫秒甚至微秒,且带有“seq”序列号。若直接以“symbol+timestamp”作为主键,第三方源在同一毫秒内的多条记录会冲突,而交易所源则不会。这就是主键设计必须结合数据源特征的原因。

四、案例与误区:同一标的,两个源,谁是真重复?

假设我们同时接入源A(第三方API)与源B(交易所直连),对同一只股票600519.SH,在10:30:00.123分别收到:

  • 源A:last=1688.00,volume=123400,timestamp=1717036800123
  • 源B:last=1688.00,volume=123500,seq=8847321,trade_time=20240530103000123

价格相同,但成交量不同。若简单按“symbol+price”去重,会误判为重复;若按“symbol+timestamp”去重,源A的毫秒时间戳与源B的微秒时间戳无法直接对齐。正确的做法是:先按源内主键去重(源A用symbol+timestamp,源B用symbol+seq),再做跨源对齐,对齐时以交易所源为准,第三方源作为补充或校验。

常见误区:把“同一标的、同一价格”当作重复记录直接删除。行情数据中,同一价格可能对应多笔成交,成交量不同,逻辑上是不同记录。去重必须基于主键,而非业务字段的相似性。

另一个误区是忽略时区与时间精度。不同源可能使用UTC、交易所本地时间或Unix毫秒时间戳,若未统一,主键中的时间字段将无法比较。建议在接入层统一转换为UTC毫秒或微秒,并保留原始时间字段用于溯源。

五、核心原理小结

行情数据的分类决定了主键的候选字段,数据源决定了主键的唯一性保障程度,格式与协议决定了主键提取的可行性。多源去重不是简单的“删重复”,而是在理解数据语义的基础上,为每个源定义源内主键,再设计跨源对齐规则。下一章将进入主键设计的具体方法,而本章的分类、源、格式与协议,正是主键设计的输入条件。

行情数据分类、数据源与主键候选关系 数据分类 快照 Snapshot 逐笔成交 Trade 逐笔委托 Order 盘口深度 Level-2 衍生数据 Derived 数据源 交易所直连 SSE / SZSE / HKEX 行情聚合商 Wind / Bloomberg 第三方API Tushare / AkShare 本地文件 CSV / Parquet 主键候选字段 symbol + timestamp symbol + seq symbol + order_id symbol + level + ts symbol + bar_time 分类决定语义,数据源决定唯一性保障,主键候选随二者变化