前复权、后复权、不复权:选错一个,回测结果就是错的
前复权改历史价格保持当前价不变,后复权保持历史价格不变让当前价上浮,不复权原样保留除权缺口。做技术分析用前复权,算长期收益用后复权,算持仓成本用不复权。选错的代价是把除息缺口当成真实下跌。
更新于 2026-08-01
A 股分红送股之后,股价会在除权除息日按比例往下调,这是账面调整不是下跌。如果你的数据没有做复权处理,K 线上就会留下一个缺口,任何跨过这个缺口的计算都会出错。这是量化里最常见、也最容易被忽略的一类脏数据。
三种复权方式的区别
| 方式 | 做法 | 当前价 | 历史价 | 适合做什么 |
|---|---|---|---|---|
| 前复权 | 把历史价格按复权因子往下调 | 保持真实 | 被改写 | 技术分析、画线、均线、形态识别 |
| 后复权 | 把当前及之后的价格往上调 | 被改写 | 保持真实 | 算长期累计收益、净值曲线 |
| 不复权 | 原样保留,缺口照留 | 真实 | 真实 | 对账、算实际持仓成本、看当时真实成交价 |
关键在于每种方式都有一半是「假」的。前复权的历史价格不是当年真实成交的价格,后复权的当前价不是今天盘面上的价格。它们不是精度高低的关系,是各自保真的那一端不同。
选错会怎样
最典型的一种错法:用不复权数据算「信号发出后第二天涨跌多少」。如果第二天恰好是除息日,一只股息率 3% 的票会在开盘直接低开 3% 左右。计算出来是亏 3%,但持有人手里多了等值的现金分红,实际盈亏接近零。这一条会让所有覆盖高股息标的的策略在 6 到 8 月集中失真,而这正好是 A 股分红最密集的窗口。
另一种错法更隐蔽:数据源不一致。我们自己就踩过——同一个网站上,首页的收益曲线走的是前复权数据,复盘页走的是不复权数据。平时两边看不出差别,一到除权除息日就对不上,而且只有那一天对不上,排查起来非常费劲。修复方式是把取数收敛到同一个函数,而不是各页面各自调各自的数据源。
前复权的一个副作用:历史会变
前复权的复权因子是从当前时点往回推的,每发生一次分红送股,全部历史价格都要重算一遍。这意味着你今天存下来的前复权 K 线,过半年再取一次,数值会变。
- 回测结果不可复现:半年前跑出来的净值曲线,今天用同样的代码跑不出同一条线。
- 缓存会腐坏:把前复权价格落库缓存,不设失效机制的话,新旧数据会混在一起。
- 价格可能变成负数:高送转次数多的老票往回推,前复权价格是有可能算到零以下的,除权因子连乘的结果没有下限保护。
所以做长周期回测和净值曲线,更稳妥的是用后复权:它的历史值是钉死的,今天算和明年算结果一样。做技术形态识别再用前复权,因为均线和形态需要当前价格尺度是真实的。
怎么快速自查
- 1找一只近一年分过红的票,把它的除息日单独挑出来,看那天的涨跌幅。如果显示接近股息率的负值,你用的是不复权数据。
- 2取同一只票半年前的一段前复权数据,和今天重新取的对比。如果数值不同,说明中间发生过分红送股,你的缓存需要失效机制。
- 3把网站上所有展示涨跌幅的地方列出来,确认它们调的是同一个取数函数。只要有两处各自实现,迟早会漂。
还有一件常被漏掉的事:除权除息之外,配股、转增、股本变动、长期停牌复牌,都会在 K 线上留下需要特殊处理的位置。做个股跟踪的时候,提前查一下这只票的公司行为日历,比事后解释「为什么这天数据不对」省事得多。