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 数据获取架构总览
下图展示了从交易所原始数据到最终标签构造的完整数据流架构:
2.6 数据获取方式对比总结
在实际项目中,选择哪种获取方式取决于你的数据量级、实时性要求和预算。下表从工程角度对比了三种方式的优劣:
| 对比维度 | 交易所直连 | 服务商 API | 服务商 SDK |
|---|---|---|---|
| 接入复杂度 | 高(需协议解码、硬件部署) | 中(需处理认证、限流) | 低(开箱即用) |
| 数据延迟 | < 10 ms | 100 ms – 1 s | 50 ms – 500 ms |
| 历史数据 | 需自行存储 | 按需拉取 | 按需拉取 + 本地缓存 |
| 维护成本 | 高(需专人维护) | 中(依赖 API 文档) | 低(SDK 自动升级) |
| 合规风险 | 低(直接授权) | 中(需遵守服务商条款) | 中(同左) |
课程实践建议:本课程后续的标签构造示例将基于聚宽 JQData SDK 进行演示。选择它的原因是:SDK 安装简单(
pip install jqdatasdk)、文档完善、支持逐笔成交和十档快照的批量获取,且对个人用户有免费试用额度,适合学习阶段使用。