A 股数据怎么整理:行情、复权与交易日历
会写程序的人看见一堆行情文件,第一反应往往是“读进来就能算”。但做 A 股量化,数据不是一袋随便倒进锅里的菜,得先洗干净、切整齐、分清生熟。
这是什么
A 股量化数据,指的是适合程序处理的 A 股行情、复权口径和交易日历数据。说白了,它不是“下载一张表”这么简单,而是让每一行数据都能回答三个问题:这是哪只股票、哪一天、按什么口径记录的价格和成交。
如果把量化开发环境比作后厨,A 股量化数据就是食材台。开盘价、最高价、最低价、收盘价、成交量、成交额,就像土豆、青椒、肉片,各有各的位置;复权口径像切法,切丝还是切块要提前说清;交易日历像饭店营业日,哪天开门、哪天休息,不能凭感觉补。
一份最小可用的日线行情表,至少要有这些字段:
| 字段 | 含义 | 常见坑 |
|---|---|---|
| date | 交易日期 | A 股不是每天交易,周末和休市日不能硬补 |
| code | 股票代码 | 要保留前导 0,别当普通数字读丢 |
| open/high/low/close | 开高低收 | 要确认是否复权,不能混着用 |
| volume | 成交量 | 单位要固定,是“股”还是“手”要写清 |
| amount | 成交额 | 适合检查成交量和价格是否大致匹配 |
经验
入门阶段先用 CSV 或本地小样本就够了。关键不是格式多高级,而是字段清楚、单位清楚、口径清楚,能被自己反复检查。
为什么 A 股数据不能直接拿来算
A 股有自己的交易规则。普通股票通常是 T+1,也就是当天买入的股票,一般要到下一个交易日才能卖出;交易日也不是自然日,遇到周末、法定节假日和交易所休市安排,就没有当天行情。
这会直接影响数据整理。比如你把 2024-02-10 当成一个普通日期去填价格,程序可能以为那天也能成交;你用当天收盘价判断买入,又让程序假装同一天收盘价已经成交,结果就会占便宜。数据层面一偷懒,研究结果看起来会更漂亮,但那是假的漂亮。
还有一个更隐蔽的问题:除权除息。公司分红、送股、转增之后,价格序列会出现机械跳变。如果你把这种跳变当成真实下跌,程序就可能误判成跌破、止损、趋势走坏。
所以整理 A 股量化数据时,至少要把三件事写在文件名或日志里:
- 数据频率:日线、分钟线,还是更细的行情。
- 价格口径:不复权、前复权,还是后复权。
- 日期口径:只保留真实交易日,还是人为补齐自然日。
复权不是修饰词,是价格口径
复权,简单说就是把分红、送股、转增造成的价格断口处理掉,让价格序列更适合连续观察。它不是“更真实”或“更高级”,只是用途不同。
不复权保留当时市场真实成交价格,适合核对某一天的成交、涨跌幅和交易规则。你要看当天到底多少钱能买到,不能拿复权价当成交价。
前复权通常会让最新价格贴近真实价格,把历史价格往当前口径折算,适合看长期 K 线走势是否连续。很多看盘软件默认展示的长期走势,就是类似这个口径。
后复权通常保留早期价格,把后面的价格往历史口径接上,适合粗看长期持有后的累计效果,但数字会越来越大,不适合拿来当某天真实可成交价格。
以贵州茅台(600519,白酒行业,上交所主板,2001 年 8 月 27 日上市)为例,它上市时间长,期间有过多次现金分红。如果你拿很长一段不复权收盘价直接观察,分红除息附近会看到价格出现机械调整;如果你看前复权走势,这种断口会被处理得更连续。两种口径都不是错,错的是一会儿用不复权,一会儿用前复权,却不在记录里写清楚。
特别要分清:真实成交价、涨跌停判断、止损触发,优先用不复权价核对;复权价更适合观察连续走势,不能直接当成当时能成交的价格。
风险
方向性做法:研究价格走势时,先固定一种复权口径,全程不要混用。适用条件是你在做连续走势观察;反例是核对真实成交价时仍拿复权价下结论;风险是把“处理后的价格”误当成“当时能成交的价格”,会让买入、卖出和止损判断失真。
交易日历要当成一张正式表
很多新手会把日期当成连续数字处理:今天、明天、后天,一路加下去。A 股不能这么干。市场只在交易日开门,节假日、周末、临时休市都要尊重交易日历。
交易日历至少要解决三个问题。
第一,哪天有行情。没有开市的日子,不应该生成一根假 K 线,也不应该填一个“昨天收盘价”冒充今天价格。
第二,下一交易日是哪天。T+1、止损、调仓、复盘,都要按交易日走,不是按自然日走。周五买入,通常不是周六能卖,而是下一个交易日才进入可卖状态。
第三,不同股票有没有缺口。有些股票可能因为停牌等原因缺少某些交易日数据。处理时要区分“全市场不开门”和“这只股票当天没有交易数据”,这两个不是一回事。
一个小样本可以长这样:
| date | is_trading_day | note |
|---|---|---|
| 2024-01-01 | no | 元旦休市 |
| 2024-01-02 | yes | 正常交易 |
| 2024-01-03 | yes | 正常交易 |
这张表看起来不起眼,但它能防止很多低级错误。老手宁愿先把交易日历做扎实,也不愿让程序在不存在的日子里“成交”。
新手最容易踩的坑
第一个坑,是把股票代码当数字。像深市不少股票代码前面带 0,如果按数字读取,前导 0 可能被丢掉,之后再和行情表、持仓表、日志对齐时全乱。代码应该当文本保存。
第二个坑,是把不同来源的数据直接拼在一起。一个来源的成交量单位可能是“股”,另一个可能是“手”;一个来源给的是前复权价格,另一个给的是不复权价格。字段名看起来一样,含义可能已经变了。
第三个坑,是只盯着收益曲线,不查原始行。散户做量化最容易被一条漂亮曲线哄住,主力和机构不会因为你的数据对齐错了就给你第二次机会。真正要养成的习惯是:每次结果异常好,先回到数据表里抽几行,查日期、价格、成交量、复权口径是否合理。
大坑
不要用“缺失值自动填满”来掩盖问题。价格缺了、成交量缺了、日期缺了,先标记和追查原因;只有明确知道为什么缺,才决定是否填补。否则程序看起来顺滑了,风险也被一起抹平了。
总结
A 股量化数据的核心不是表有多大,而是口径是否清楚:行情字段要有单位,复权方式要固定,交易日历要独立保存,股票代码要当文本,原始数据不要随手改。
自检 3 问:
- 为什么股票代码最好按文本保存,而不是按数字保存?
- 不复权、前复权、后复权分别适合什么场景?
- 为什么交易日历不能简单用自然日代替?
股市有风险,入市需谨慎。本文不构成任何投资建议。
本章新学到:A 股量化数据。