2. Market Data基础
在讨论多源去重与主键设计之前,必须先建立对行情数据本身的清晰认知。行情数据并不是单一形态的数据,它按内容、时效、用途可分为多个类别,不同类别来自不同数据源,采用不同格式与传输协议。理解这些差异,是后续判断“什么算重复、什么算同一主键”的前提。
一、行情数据的分类:从快照到逐笔
行情数据按粒度与生成方式,通常分为以下几类:
- 快照数据(Snapshot / Quote):按固定频率(如每3秒、每500毫秒)推送的最新买卖盘口与成交汇总,包含最新价、买卖一档或多档、成交量、成交额等。它是大多数行情终端的基础数据。
- 逐笔成交(Trade / Tick):每一笔成交的明细,包含成交时间、价格、数量、买卖方向。它是构建K线和成交量指标的最细粒度来源。
- 逐笔委托(Order):每一笔委托的进入、变更与撤销,反映市场深度变化。部分市场(如A股)不公开逐笔委托,仅提供委托队列。
- 盘口深度(Level-2 / Order Book):多档买卖盘口,通常为5档、10档甚至全档,用于分析买卖压力与流动性。
- 衍生数据(Derived):由上述原始数据计算得出,如K线、均线、涨跌幅、换手率、资金流向等。
分类的意义在于:不同类别的数据,其主键候选字段完全不同。快照的主键通常包含“标的+时间戳”,逐笔成交的主键则必须包含“成交编号”或“交易所序列号”,否则无法区分同一毫秒内的多笔成交。
二、常见数据源:交易所、聚合商与第三方
行情数据源按层级可分为三类:
- 交易所直连(Exchange Direct):如上交所、深交所、港交所、纳斯达克、纽交所。数据最权威、延迟最低,但接入成本高,且各交易所协议不同。
- 行情聚合商(Aggregator):如路透、彭博、Wind、同花顺、东方财富。它们从多个交易所采集并标准化,提供统一接口,但可能引入二次加工与延迟。
- 第三方数据服务(Vendor / API):如新浪财经、腾讯财经、Tushare、AkShare、Alpha Vantage。成本低、接入快,适合研究与小规模应用,但数据质量与稳定性参差不齐。
三、数据格式与传输协议
行情数据的传输格式与协议,直接影响解析方式与主键提取。常见组合如下:
| 数据源类型 | 常见格式 | 传输协议 | 主键提取要点 |
|---|---|---|---|
| 交易所直连 | 二进制(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毫秒或微秒,并保留原始时间字段用于溯源。
五、核心原理小结
行情数据的分类决定了主键的候选字段,数据源决定了主键的唯一性保障程度,格式与协议决定了主键提取的可行性。多源去重不是简单的“删重复”,而是在理解数据语义的基础上,为每个源定义源内主键,再设计跨源对齐规则。下一章将进入主键设计的具体方法,而本章的分类、源、格式与协议,正是主键设计的输入条件。