3. 多数据源生态
在证券行情统一接入工程中,真正决定架构复杂度的往往不是协议本身,而是“数据从哪里来”。不同来源在授权方式、推送机制、字段语义、延迟等级、稳定性承诺和成本结构上差异巨大。理解这些差异,是设计统一接入层、抽象行情模型和制定降级策略的前提。
一、核心原理:五类数据源的定位与数据链路
行情数据从产生到被策略消费,通常经过“撮合产生 → 交易所发布 → 分发通道 → 终端/服务”这条链路。五类数据源本质上是这条链路上不同位置的“取数点”,越靠近交易所,权威性和时效性越高,但接入门槛和成本也越高。
二、五类数据源的类型、特点与接入差异
| 数据源 | 典型接入方式 | 延迟/时效 | 主要优势 | 主要挑战 |
|---|---|---|---|---|
| 交易所 | 专线、Binary/FAST 协议、组播 | 微秒~毫秒级 | 最权威、最完整、含逐笔委托 | 门槛高、费用高、协议复杂、需机房托管 |
| 券商 | 柜台API、TCP推送、文件落地 | 毫秒~秒级 | 合规、账户绑定、Level-2 可获取 | 接口差异大、限流、字段命名不统一 |
| 行情商 | SDK、WebSocket、HTTP 快照 | 秒级~分钟级 | 覆盖广、字段规范、易接入 | 需授权、按量计费、深度有限 |
| 开源数据源 | 爬虫、公开API、社区库 | 分钟级~日级 | 零成本、适合回测与研究 | 不稳定、易封禁、字段缺失、无SLA |
| 云厂商行情 | 托管API、消息队列、函数计算 | 毫秒~秒级 | 弹性扩容、运维托管、生态集成 | 厂商锁定、成本随量增长、数据范围受限 |
三、方法流程:统一接入的抽象与适配
面对异构数据源,统一接入层的核心任务是“屏蔽差异、保留语义”。推荐按以下流程落地:
- 定义统一行情模型:抽象出 Instrument、Quote、Trade、OrderBook 等实体,字段命名、时间戳精度、价格类型统一。
- 为每个数据源实现适配器:负责协议解析、字段映射、心跳与重连。
- 时间对齐与序列化:统一到 UTC 纳秒或毫秒,处理交易所本地时间与接收时间的偏差。
- 质量校验与降级路由:检测断流、跳变、乱序,按优先级切换备用源。
# 统一行情模型示例(伪代码)
class Quote:
symbol: str # 统一代码,如 600519.SH
source: str # exchange / broker / vendor / opensource / cloud
ts_event: int # 交易所时间(纳秒)
ts_recv: int # 本地接收时间(纳秒)
last: float
bid: float
ask: float
volume: int
# 适配器接口
class QuoteAdapter:
def connect(self): ...
def subscribe(self, symbols): ...
def on_message(self, raw) -> Quote: ...
def health(self) -> bool: ...
实践建议:在适配器层保留原始报文快照(raw payload),便于事后复盘字段映射错误。统一模型只做“必要归一”,不要过度裁剪,否则会丢失交易所特有的逐笔委托、撤单等关键信息。
四、案例/场景:多源混合接入的典型架构
某量化团队需要同时支持实盘交易与盘后回测。实盘使用券商 Level-2 推送获取逐笔成交,同时订阅云厂商行情作为跨市场补充;回测则使用开源数据源的历史日线与分钟线。接入层按“优先级 + 成本”路由:
- 主源:券商柜台,延迟低、合规,但接口限流,需做批量订阅与退避重连。
- 备源:云厂商行情,弹性好,用于主源断流时快速切换。
- 研究源:开源数据源,仅用于离线回测,不进入实时链路。
关键设计是“源无关”的消费接口:策略只订阅统一 symbol,不关心数据来自哪个源。接入层通过配置表维护源优先级与切换条件。
# 源优先级配置示例
sources:
- name: broker_l2
priority: 1
type: broker
symbols: ["600519.SH", "000001.SZ"]
- name: cloud_quote
priority: 2
type: cloud
symbols: ["*"]
- name: opensource_hist
priority: 9
type: opensource
mode: batch
五、误区与复盘
常见误区一:认为“字段名一样就能直接合并”。不同源对“成交量”的定义可能包含或剔除大宗交易,对“最新价”可能含盘后固定价格。必须核对业务语义,而非仅看字段名。
常见误区二:忽略时间基准差异。交易所时间、行情商加工时间、本地接收时间三者可能相差数十毫秒。若不做对齐,回测与实盘会出现“未来函数”式偏差。
常见误区三:把开源数据源用于实盘。开源源通常无 SLA、易被限流或封禁,且授权不明。实盘链路应使用有合同保障的源,开源源仅用于研究。
复盘时建议建立“源健康度”指标:断流次数、平均延迟、字段缺失率、切换成功率。这些指标应纳入监控看板,作为源优先级动态调整的依据。只有把多源差异显式管理起来,统一接入层才真正具备工程价值。