前复权、后复权、不复权:选错一个,回测结果就是错的

前复权改历史价格保持当前价不变,后复权保持历史价格不变让当前价上浮,不复权原样保留除权缺口。做技术分析用前复权,算长期收益用后复权,算持仓成本用不复权。选错的代价是把除息缺口当成真实下跌。

更新于 2026-08-01

A 股分红送股之后,股价会在除权除息日按比例往下调,这是账面调整不是下跌。如果你的数据没有做复权处理,K 线上就会留下一个缺口,任何跨过这个缺口的计算都会出错。这是量化里最常见、也最容易被忽略的一类脏数据。

三种复权方式的区别

方式做法当前价历史价适合做什么
前复权把历史价格按复权因子往下调保持真实被改写技术分析、画线、均线、形态识别
后复权把当前及之后的价格往上调被改写保持真实算长期累计收益、净值曲线
不复权原样保留,缺口照留真实真实对账、算实际持仓成本、看当时真实成交价

关键在于每种方式都有一半是「假」的。前复权的历史价格不是当年真实成交的价格,后复权的当前价不是今天盘面上的价格。它们不是精度高低的关系,是各自保真的那一端不同。

选错会怎样

最典型的一种错法:用不复权数据算「信号发出后第二天涨跌多少」。如果第二天恰好是除息日,一只股息率 3% 的票会在开盘直接低开 3% 左右。计算出来是亏 3%,但持有人手里多了等值的现金分红,实际盈亏接近零。这一条会让所有覆盖高股息标的的策略在 6 到 8 月集中失真,而这正好是 A 股分红最密集的窗口。

另一种错法更隐蔽:数据源不一致。我们自己就踩过——同一个网站上,首页的收益曲线走的是前复权数据,复盘页走的是不复权数据。平时两边看不出差别,一到除权除息日就对不上,而且只有那一天对不上,排查起来非常费劲。修复方式是把取数收敛到同一个函数,而不是各页面各自调各自的数据源。

前复权的一个副作用:历史会变

前复权的复权因子是从当前时点往回推的,每发生一次分红送股,全部历史价格都要重算一遍。这意味着你今天存下来的前复权 K 线,过半年再取一次,数值会变。

  • 回测结果不可复现:半年前跑出来的净值曲线,今天用同样的代码跑不出同一条线。
  • 缓存会腐坏:把前复权价格落库缓存,不设失效机制的话,新旧数据会混在一起。
  • 价格可能变成负数:高送转次数多的老票往回推,前复权价格是有可能算到零以下的,除权因子连乘的结果没有下限保护。

所以做长周期回测和净值曲线,更稳妥的是用后复权:它的历史值是钉死的,今天算和明年算结果一样。做技术形态识别再用前复权,因为均线和形态需要当前价格尺度是真实的。

怎么快速自查

  1. 1找一只近一年分过红的票,把它的除息日单独挑出来,看那天的涨跌幅。如果显示接近股息率的负值,你用的是不复权数据。
  2. 2取同一只票半年前的一段前复权数据,和今天重新取的对比。如果数值不同,说明中间发生过分红送股,你的缓存需要失效机制。
  3. 3把网站上所有展示涨跌幅的地方列出来,确认它们调的是同一个取数函数。只要有两处各自实现,迟早会漂。

还有一件常被漏掉的事:除权除息之外,配股、转增、股本变动、长期停牌复牌,都会在 K 线上留下需要特殊处理的位置。做个股跟踪的时候,提前查一下这只票的公司行为日历,比事后解释「为什么这天数据不对」省事得多。

相关笔记