2. 金融行情数据基础
在动手写采集脚本之前,必须先弄清楚“我们到底在采什么”。金融行情数据并不是单一形态的数据,它由不同的数据类型、不同的时间粒度、不同的价格处理方式共同构成。如果对这些基础概念理解不清,采集出来的数据往往在后续回测或指标计算中产生严重偏差。本节将围绕四个核心维度展开:行情数据类型、时间粒度、复权概念,以及常见数据源与 API 分类。
一、行情数据类型:从快照到逐笔
行情数据按信息密度和更新方式,通常可以分为以下几类:
- 快照行情(Snapshot / Quote):某一时刻的最新价、买卖五档、成交量、成交额等。A 股常见的 Level-1 行情即属于此类,通常每 3 秒推送一次。
- 逐笔成交(Tick / Trade):每一笔成交的时间、价格、数量、买卖方向。信息最细,数据量最大,是高频策略的基础。
- 逐笔委托(Order / Level-2):委托挂单与撤单明细,可还原订单簿变化,属于 Level-2 数据范畴。
- K 线行情(Bar / OHLCV):把一段时间内的价格聚合为开盘、最高、最低、收盘、成交量,是最常用的分析形态。
- 衍生指标数据:如复权因子、换手率、市盈率、资金流向等,通常由基础行情加工而来。
不同数据类型的采集频率、存储成本和接口能力差异极大。Tick 数据一天可达数百万条,而日 K 线一年仅约 250 条。选择哪种类型,取决于策略对时间精度的要求。
二、时间粒度:同一标的的不同“分辨率”
时间粒度决定了 K 线的聚合周期。常见粒度包括:
| 粒度类型 | 典型周期 | 主要用途 | 数据量级(单标的/年) |
|---|---|---|---|
| Tick 级 | 逐笔 | 高频、微观结构分析 | 数百万条 |
| 分钟级 | 1/5/15/30/60 分钟 | 日内交易、短线策略 | 约 6 万条(1 分钟) |
| 日级 | 1 日 | 趋势、波段、回测 | 约 250 条 |
| 周/月级 | 1 周 / 1 月 | 长周期配置 | 50 / 12 条 |
需要注意:分钟级数据并非简单由 Tick 聚合就能完全还原,不同数据商的聚合规则(如是否包含集合竞价、时间戳对齐方式)可能不同。增量同步时,若粒度切换,必须重新校准时间边界。
三、复权概念:价格连续性的关键
股票在分红、送股、配股后,价格会出现“跳空”,若不处理,技术指标会失真。复权就是消除这些非交易性跳空,使价格序列连续。常见三种处理方式:
- 不复权(None):原始成交价,真实但存在跳空。
- 前复权(Forward / QFQ):以当前价格为基准向前调整,最新价与真实价一致,适合看盘和回测。
- 后复权(Backward / HFQ):以上市首日为基准向后调整,历史价不变,适合长期收益计算。
复权因子(Adjust Factor)是复权计算的核心参数。多数 API 会直接提供复权后的 K 线,也有接口只给因子,需要自行计算:
前复权价 = 原始价 × 复权因子 / 最新复权因子
后复权价 = 原始价 × 复权因子
四、常见数据源与 API 分类
行情数据源大致分为三类:
- 官方交易所 / 登记结算机构:数据权威,但接口门槛高、费用高,多用于机构。
- 商业数据商:如 Wind、聚宽、Tushare Pro、AkShare 等,提供封装好的 HTTP / SDK 接口,适合个人与中小团队。
- 券商 / 行情软件接口:如通达信、同花顺的本地数据文件或开放接口,实时性好但稳定性依赖客户端。
按 API 形态又可分为:
- RESTful HTTP API:请求-响应模式,适合历史数据批量拉取与增量同步。
- WebSocket / 推送 API:服务端主动推送,适合实时行情订阅。
- 本地文件 / 数据库接口:如通达信日线文件、SQLite 缓存,读取快但需自行解析格式。
下面是一个典型的 REST 增量拉取参数示例,理解这些字段有助于后续设计同步逻辑:
GET /api/v1/daily
params:
symbol: "000001.SZ"
start_date: "2024-01-01"
end_date: "2024-01-31"
adjust: "qfq" # none / qfq / hfq
fields: "open,high,low,close,volume,amount"
五、案例与复盘:一次“看起来对”的采集
某同学用日线接口拉取某股票 2023 全年数据,默认参数未指定复权,得到的价格在除权日出现约 8% 的向下跳空。他直接计算 20 日均线,结果在除权日附近产生虚假死叉信号,回测收益被严重高估。复盘发现两个问题:
- 接口默认
adjust=none,而策略假设价格连续; - 增量同步时只按日期追加,未检查复权因子是否变化,导致新旧数据混用不同复权基准。
修正方案:在采集配置中显式声明 adjust=qfq,并在每次增量同步前拉取最新复权因子,若因子发生变化则触发全量重刷。这一条规则,正是后续章节设计增量同步状态表的重要依据。