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 聚合就能完全还原,不同数据商的聚合规则(如是否包含集合竞价、时间戳对齐方式)可能不同。增量同步时,若粒度切换,必须重新校准时间边界。

建议:日线用于策略逻辑验证,分钟线用于执行细节优化,Tick 仅在确有高频需求时采集。不要一上来就抓全量 Tick,存储和清洗成本会迅速失控。

三、复权概念:价格连续性的关键

股票在分红、送股、配股后,价格会出现“跳空”,若不处理,技术指标会失真。复权就是消除这些非交易性跳空,使价格序列连续。常见三种处理方式:

  • 不复权(None):原始成交价,真实但存在跳空。
  • 前复权(Forward / QFQ):以当前价格为基准向前调整,最新价与真实价一致,适合看盘和回测。
  • 后复权(Backward / HFQ):以上市首日为基准向后调整,历史价不变,适合长期收益计算。

复权因子(Adjust Factor)是复权计算的核心参数。多数 API 会直接提供复权后的 K 线,也有接口只给因子,需要自行计算:

前复权价 = 原始价 × 复权因子 / 最新复权因子
后复权价 = 原始价 × 复权因子
误区:把前复权数据用于计算历史某日的真实成交金额,会得到错误结果。真实成交金额必须用不复权价乘以成交量。复权只用于价格序列的连续性分析。

四、常见数据源与 API 分类

行情数据源大致分为三类:

  1. 官方交易所 / 登记结算机构:数据权威,但接口门槛高、费用高,多用于机构。
  2. 商业数据商:如 Wind、聚宽、Tushare Pro、AkShare 等,提供封装好的 HTTP / SDK 接口,适合个人与中小团队。
  3. 券商 / 行情软件接口:如通达信、同花顺的本地数据文件或开放接口,实时性好但稳定性依赖客户端。

按 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"
行情数据的三个正交维度 数据类型 快照 / Quote 逐笔成交 Tick 逐笔委托 Order K 线 OHLCV 时间粒度 Tick 逐笔 1/5/15/30/60 分钟 日线 周线 / 月线 复权方式 不复权 none 前复权 qfq 后复权 hfq 复权因子 factor 采集前必须同时确定:类型 × 粒度 × 复权方式

五、案例与复盘:一次“看起来对”的采集

某同学用日线接口拉取某股票 2023 全年数据,默认参数未指定复权,得到的价格在除权日出现约 8% 的向下跳空。他直接计算 20 日均线,结果在除权日附近产生虚假死叉信号,回测收益被严重高估。复盘发现两个问题:

  1. 接口默认 adjust=none,而策略假设价格连续;
  2. 增量同步时只按日期追加,未检查复权因子是否变化,导致新旧数据混用不同复权基准。

修正方案:在采集配置中显式声明 adjust=qfq,并在每次增量同步前拉取最新复权因子,若因子发生变化则触发全量重刷。这一条规则,正是后续章节设计增量同步状态表的重要依据。

核心结论:行情数据 = 数据类型 × 时间粒度 × 复权方式。三者共同决定数据的语义。采集前先锁定这三个维度,再谈接口与同步策略,才能避免“数据能跑通、结果不可信”的陷阱。