3. 多数据源生态

在证券行情统一接入工程中,真正决定架构复杂度的往往不是协议本身,而是“数据从哪里来”。不同来源在授权方式、推送机制、字段语义、延迟等级、稳定性承诺和成本结构上差异巨大。理解这些差异,是设计统一接入层、抽象行情模型和制定降级策略的前提。

一、核心原理:五类数据源的定位与数据链路

行情数据从产生到被策略消费,通常经过“撮合产生 → 交易所发布 → 分发通道 → 终端/服务”这条链路。五类数据源本质上是这条链路上不同位置的“取数点”,越靠近交易所,权威性和时效性越高,但接入门槛和成本也越高。

行情数据链路与五类数据源取数位置 交易所 撮合/发布源头 券商柜台 Level-1/2 转发 行情商 加工/增值分发 云厂商行情 托管+API 服务 开源数据源 爬取/社区维护/延迟高 统一接入层:协议适配 → 字段归一 → 时间对齐 → 质量校验 → 降级路由 越靠左权威性/时效性越高,越靠下成本越低但稳定性与合规风险越高

二、五类数据源的类型、特点与接入差异

数据源 典型接入方式 延迟/时效 主要优势 主要挑战
交易所 专线、Binary/FAST 协议、组播 微秒~毫秒级 最权威、最完整、含逐笔委托 门槛高、费用高、协议复杂、需机房托管
券商 柜台API、TCP推送、文件落地 毫秒~秒级 合规、账户绑定、Level-2 可获取 接口差异大、限流、字段命名不统一
行情商 SDK、WebSocket、HTTP 快照 秒级~分钟级 覆盖广、字段规范、易接入 需授权、按量计费、深度有限
开源数据源 爬虫、公开API、社区库 分钟级~日级 零成本、适合回测与研究 不稳定、易封禁、字段缺失、无SLA
云厂商行情 托管API、消息队列、函数计算 毫秒~秒级 弹性扩容、运维托管、生态集成 厂商锁定、成本随量增长、数据范围受限

三、方法流程:统一接入的抽象与适配

面对异构数据源,统一接入层的核心任务是“屏蔽差异、保留语义”。推荐按以下流程落地:

  1. 定义统一行情模型:抽象出 Instrument、Quote、Trade、OrderBook 等实体,字段命名、时间戳精度、价格类型统一。
  2. 为每个数据源实现适配器:负责协议解析、字段映射、心跳与重连。
  3. 时间对齐与序列化:统一到 UTC 纳秒或毫秒,处理交易所本地时间与接收时间的偏差。
  4. 质量校验与降级路由:检测断流、跳变、乱序,按优先级切换备用源。
# 统一行情模型示例(伪代码)
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、易被限流或封禁,且授权不明。实盘链路应使用有合同保障的源,开源源仅用于研究。

复盘时建议建立“源健康度”指标:断流次数、平均延迟、字段缺失率、切换成功率。这些指标应纳入监控看板,作为源优先级动态调整的依据。只有把多源差异显式管理起来,统一接入层才真正具备工程价值。