2. 金融市场数据基础
做公司行动与复权因子还原,第一步不是写算法,而是把“原始行情数据长什么样”彻底搞清楚。复权因子的计算依赖价格、成交量、成交额、除权除息日等字段,如果对行情数据结构理解有偏差,后续因子推导会出现系统性错误。本节从数据结构、价格类型、量额关系和数据源字段四个角度,建立后续实战所需的数据基础。
一、核心原理:一行行情记录到底描述了什么
股票行情数据本质上是“时间 × 标的 × 状态”的观测记录。每一行通常包含:交易日期、证券代码、开盘价、最高价、最低价、收盘价、前收盘价、成交量、成交额、复权因子(部分数据源提供)等。理解这些字段的关键,是区分“当日实际成交形成的价格”与“跨日衔接所需的参考价格”。
其中,前收盘价是连接两个交易日的桥梁。在无公司行动时,前收盘价等于上一交易日收盘价;发生除权除息时,交易所会给出一个调整后的前收盘价(即除权参考价),它已经隐含了分红、送转、配股等事件的影响。复权因子还原的核心,正是围绕“实际收盘价”与“理论前收盘价”之间的比例关系展开。
二、价格类型:不复权、前复权、后复权
同一只股票在同一交易日,可能同时存在三种价格口径,它们描述的是同一天的不同“观察视角”:
- 不复权价格:交易所原始行情,除权日会出现价格跳空,历史价格不连续。
- 前复权价格:以当前最新价格为基准,向前调整历史价格,使走势连续,适合技术分析与近期收益计算。
- 后复权价格:以上市首日为基准,向后调整后续价格,适合长期收益回测与因子研究。
三者的关系可以用一个比例链条表达:后复权价格 = 不复权价格 × 累计复权因子;前复权价格 = 后复权价格 ÷ 最新累计复权因子。理解这一点,就能明白为什么复权因子是“可推导、可校验”的,而不是只能依赖数据商直接提供。
三、成交量与成交额:量额关系与复权处理
成交量与成交额是行情数据的另一条主线。成交量通常以“股”或“手”为单位,成交额以“元”为单位。二者关系为:成交额 ≈ 成交量 × 成交均价。在复权处理中,价格会被调整,但成交量是否调整取决于数据源口径。
常见做法是:价格复权时,成交量通常不做复权,因为成交量反映的是实际交易股数;但在计算换手率、量价因子时,若使用前复权价格与未复权成交量,需要注意口径一致性。部分数据源会提供“复权成交量”,其本质是按复权因子反向调整,用于保持量价关系的内部一致。
| 字段 | 含义 | 复权处理建议 |
|---|---|---|
| open/high/low/close | 当日开盘、最高、最低、收盘价 | 按复权因子调整 |
| pre_close | 前收盘价(除权日已调整) | 用于推导复权因子 |
| volume | 成交量(股/手) | 通常不调整,注意单位 |
| amount | 成交额(元) | 通常不调整 |
| adj_factor | 复权因子(部分数据源提供) | 用于校验与还原 |
四、常见数据源与字段说明
不同数据源的字段命名和口径存在差异,实战中必须做字段映射与口径对齐。以下是常见来源的典型特征:
- 交易所原始数据:字段最权威,包含除权除息信息,但格式多样,需自行解析。
- Wind/Choice:提供不复权、前复权、后复权及复权因子,字段规范,适合研究。
- Tushare/AkShare:开源或社区数据接口,字段清晰,适合快速验证与教学。
- 聚宽/米筐:量化平台内置行情,复权处理已封装,需注意其默认口径。
以 Tushare 的日线接口为例,典型返回字段如下:
ts_code, trade_date, open, high, low, close, pre_close,
change, pct_chg, vol, amount
其中 vol 单位为“手”,amount 单位为“千元”,pre_close 在除权日已被调整。若直接使用 close / pre_close - 1 计算涨跌幅,得到的是“考虑公司行动后的真实涨跌幅”,而不是价格跳空幅度。这一点在因子还原中非常关键。
五、误区与复盘
初学者最容易踩的坑有三个:
- 把不复权价格直接用于回测:除权日价格跳空会被误判为真实下跌,导致收益计算错误。
- 混淆前复权与后复权:前复权适合看近期走势,后复权适合长期收益,混用会导致因子方向相反。
- 忽略成交量单位:手与股相差 100 倍,量价因子会整体放大或缩小,影响排序结果。