2. Level2 数据源与获取方式

构建高质量的 Level2 行情标签,首先需要解决数据从哪里来、怎么拿的问题。不同数据源在授权合规性、数据完整性、延迟、成本以及接口易用性上存在显著差异。本章将系统梳理三大主流数据获取路径:交易所直接授权、商业数据服务商以及API/SDK 编程接口,帮助你在实际项目中做出合理的技术选型。

2.1 数据源全景对比

下表从数据覆盖、授权门槛、更新频率、典型延迟和适用场景五个维度,对三类主要数据源进行横向对比:

数据源类型 数据覆盖 授权门槛 更新频率 典型延迟 适用场景
交易所授权 全市场 Level2 逐笔 + 快照 高(需机构资质 + 年费) 实时推送 < 10 ms 高频交易、做市商、量化自营
商业数据服务商 全市场 Level2 + 历史数据 中(个人/机构均可) 实时 / 准实时 100 ms – 1 s 量化研究、策略回测、投研分析
开源/社区接口 部分市场或延迟数据 低(免费或低成本) 轮询 / 非实时 1 s – 数分钟 学习原型、个人小规模实验
选型建议:对于标签构造课程,推荐优先使用商业数据服务商(如万得、聚宽、通联)的 API 接口。它们在数据质量、文档完善度和合规性之间取得了较好的平衡,且支持 Python SDK,能大幅降低数据接入的工程成本。

2.2 交易所授权:最底层的数据源头

上海证券交易所(SSE)和深圳证券交易所(SZSE)是 Level2 行情数据的最终发布者。交易所通过授权的行情转发商(如上证信息公司、深证信息公司)向合格机构提供原始数据流。

  • 授权形式:机构需与交易所指定的信息公司签署《Level-2 行情经营许可合同》,按年缴纳席位费或流量费。
  • 数据内容:包含逐笔成交、逐笔委托、十档行情、买卖队列、委托撤单等最细粒度数据。
  • 传输协议:通常使用 STEP(Securities Trading Exchange Protocol)或 FAST 协议压缩传输,需要专门的解码库。
  • 硬件要求:一般要求托管机房或专线接入,以保证低延迟。
注意:交易所授权数据通常不允许二次转发或通过公共网络直接分发。个人开发者很难直接获取原始 Level2 数据流,必须通过持牌服务商间接获取。

2.3 商业数据服务商:主流的数据桥梁

商业数据服务商从交易所获得授权后,对原始数据进行清洗、缓存、标准化,并通过统一的 API 提供给用户。国内主流的 Level2 数据服务商包括:

服务商 产品名称 数据覆盖 Python SDK 历史数据长度 典型费用
万得 (Wind) Wind 金融终端 / API 沪深 Level2 + 期货 + 期权 WindPy 10 年+ 高(机构年费)
聚宽 (JoinQuant) JQData / 聚宽投研 沪深 Level2 + 基金 jqdatasdk 5 年+ 中(按量或订阅)
通联数据 (DataYes) 通联量化 API 沪深 Level2 + 行业数据 datayes 8 年+ 中(按 API 调用量)
Tushare Tushare Pro 沪深 Level2(部分) tushare 3 年+ 低(积分制)
关键差异:万得在机构用户中覆盖率最高,但费用昂贵且 SDK 较老;聚宽和通联在量化社区中更受欢迎,SDK 设计更 Pythonic,文档齐全;Tushare 适合个人学习和原型验证,但 Level2 数据覆盖不如前三者完整。

2.4 API 接口与 SDK 介绍

无论选择哪家服务商,最终都需要通过编程接口获取数据。现代数据服务商普遍提供两种接入方式:RESTful API 和 Python SDK。

2.4.1 RESTful API

基于 HTTP 协议的接口,通过 URL 参数指定股票代码、数据类型、时间范围等。返回格式通常为 JSON 或 CSV。优点是语言无关,缺点是每次请求都有网络开销,不适合高频轮询。

# 示例:通过 REST API 获取某只股票的 Level2 快照
import requests

url = "https://api.example.com/v1/level2/snapshot"
params = {
    "symbol": "000001.SZ",
    "fields": "bid_prices,ask_prices,bid_volumes,ask_volumes",
    "date": "2025-03-10",
    "token": "your_api_token"
}
response = requests.get(url, params=params)
data = response.json()
print(data["snapshot"]["bid_prices"][:5])  # 前五档买价

2.4.2 Python SDK

SDK(软件开发工具包)是对底层 API 的封装,提供更 Pythonic 的调用方式,自动处理认证、重连、数据缓存和错误重试。使用 SDK 可以大幅减少样板代码。

# 示例:使用聚宽 SDK 获取 Level2 逐笔成交数据
from jqdatasdk import auth, get_ticks

auth('your_account', 'your_password')

# 获取 2025-03-10 当天 000001.SZ 的全部逐笔成交
ticks = get_ticks('000001.SZ', '2025-03-10', fields=['time', 'price', 'volume', 'buyorsell'])
print(ticks.head())
推荐做法:在生产环境中优先使用 SDK 而非直接调用 REST API。SDK 通常内置了连接池、数据压缩、自动重连等机制,能显著提升数据获取的稳定性和效率。

2.5 数据获取架构总览

下图展示了从交易所原始数据到最终标签构造的完整数据流架构:

Level2 数据获取架构图 Level2 数据获取架构 交易所 (SSE / SZSE) 数据服务商 (Wind / 聚宽 / 通联) RESTful API Python SDK WebSocket 推送 量化程序 / 标签构造引擎 标签数据集 / 策略信号

2.6 数据获取方式对比总结

在实际项目中,选择哪种获取方式取决于你的数据量级、实时性要求和预算。下表从工程角度对比了三种方式的优劣:

对比维度 交易所直连 服务商 API 服务商 SDK
接入复杂度 高(需协议解码、硬件部署) 中(需处理认证、限流) 低(开箱即用)
数据延迟 < 10 ms 100 ms – 1 s 50 ms – 500 ms
历史数据 需自行存储 按需拉取 按需拉取 + 本地缓存
维护成本 高(需专人维护) 中(依赖 API 文档) 低(SDK 自动升级)
合规风险 低(直接授权) 中(需遵守服务商条款) 中(同左)
课程实践建议:本课程后续的标签构造示例将基于聚宽 JQData SDK 进行演示。选择它的原因是:SDK 安装简单(pip install jqdatasdk)、文档完善、支持逐笔成交和十档快照的批量获取,且对个人用户有免费试用额度,适合学习阶段使用。