Posted on ::

价格复权机制,是为了让收益率计算保持简单,而搞出的一套复杂的价格调整规则。

源起

股价变幻莫测,然而我们只要把两个价格相除(并减 1),就得到了涨跌幅,它也是这段时间的持股(单利)收益率。所有行情软件,都会展示当前股价相对于昨天(上一个交易日)的涨跌幅。

我们早已习惯用涨跌幅衡量收益率。我们持有的一只股票今天涨跌了 N%,那么我们今天就盈亏了 N%。

这种简单化的心理倾向,决定了复权价格的计算方法。

除权除息参考价

如果没有分红、股票分拆(送转)、配股,单纯持股不动,一切确实很简单。起止两个价格相除,就可计算出任意时段的持股(单利)收益率。然而,在分红/分拆/配股情况下,如果持股时间跨越了这些事件,直接以原始价格相除,就行不通了。

因为,分红/分拆/配股之后,每股对应的权益发生了变化。

让我们思考,现在价格为 $P$,而在接下来一瞬间,股票完成了分红/分拆/配股。而这一瞬间实在太短了,市场还来不及变化。这个前提下,价格变成多少,我们作为股东才没赚没赔呢?

我们假定新的价格为 $P_{ex}$。由于市场没有变化,我们只需要分析分红/分拆/配股等行为对股东权益的影响,并将之反映到 $P_{ex}$ 里面。

先说分红。分红不会改变股东权益,只是分红前,1 股股票的权益体现在价格 $P$ 里面,而分红后权益体现在价格 $P_{ex}$ 和红利 $d$ 里面。因此,$P = P_{ex} + d$,即: $$ P_{ex} = P - d $$

然后看分拆,它同样不会改变股东权益。假定 1 股分拆变为 $1 + s$ 股,分拆前 1 股股票的权益体现在价格 $P$ 里面,分拆后则体现在 $1 + s$ 股和价格 $P_{ex}$ 里面。因此,$P = (1 + s)P_{ex}$,即: $$ P_{ex} = \frac{P}{1+s} $$

接下来看配股,它会改变股东权益,因为股东需要投入现金参与配股。假定 1 股配股后变为 $1 + r$ 股,配股价为 $P_r$。股东权益的增加值为新投入的现金值 $rP_r$。因此,$P + rP_r = (1 + r)P_{ex}$,即: $$ P_{ex} = \frac{P + rP_r}{1 + r} $$

现在,一起上。假定同时进行分红、分拆、配股,每股分红 $d$ 元,且 1 股拆分为 $1 + s$ 股,同时还以 $P_r$ 价格配股,每股配 $r$ 股。这一番操作之后,股东每股要投入现金 $rP_r$ 元,1 股变为 $1 + s + r$ 股,并且获得 $d$ 元分红。因为投入现金配股,股东权益增加值为 $rP_r$。因此, $$ P + rP_r = (1 + s + r)P_{ex} + d $$ 得: $$ P_{ex} = \frac{P + rP_r - d}{1 + s + r} \tag{除权除息参考价} $$

这才是终极公式。前面的 3 种简单情况,只是这个公式的特例。

这个公式计算的价格,称为「除权除息参考价」。它表示的是,分红/分拆/配股后,(市场未涨未跌时)原来价格的等效价格。它是我们计算分红/分拆/配股后价格涨跌幅的基准。

解释一下公式中用到的字母含义。$d$,分红 dividend。$s$,股票分拆 stock split。$r$,配股 rights issue。$ex$,除权除息 ex-rights and ex-dividend。美股直接说股票分拆,但在 A 股因为法律和会计处理的原因,分为「送红股」和「资本公积转增股本」,但在投资者的角度来看,股票分拆和送转股没有区别。比如 10 送 2 转 3,其实就是把 10 股拆分为 15 股,$s = 0.5$。2023 年修订的《公司法》允许采用无面额股,以后可能会与美股越来越接近。

在 A 股市场,分红/分拆/配股等公司行动,均会设定一个除权除息日。除权除息日的含义是,在这一天(及以后)买入的股票,不享有本次分红/分拆/配股的权利。除权除息日前一个交易日,称为股权登记日,在股权登记日收市时持有的股票,享有本次分红/分拆/配股的权利。

在除权除息日当天,将前一交易日(股权登记日)的收盘价代入公式,得到除权除息参考价。它就是除权除息日股价涨跌幅的计算基准。高于除权除息参考价,为上涨;低于除权除息参考价,为下跌。

上交所深交所《交易规则》均在「除权与除息」小节定义了除权除息参考价的计算公式,并且规定,除权除息日必须以除权除息参考价作为计算涨跌幅的基准。《交易规则》定义的计算公式为:

除权(息)参考价=〔(前收盘价-现金红利)+配股价格×股份变动比例〕÷(1+股份变动比例)

即: $$ 除权(息)参考价 = \frac{(前收盘价-现金红利)+配股价格×股份变动比例}{1+股份变动比例} $$

这个公式摘自深交所。上交所没有使用「股份变动比例」,而是用「流通股份变动比例」,感觉有点莫名其妙。理论上股权分置改革之后,就不再区分流通/非流通,全都是流通股了。现在所说的非流通,一般是指限售。但查下去发现,上交所确实有一家公司未完成股权分置改革,S 佳通(600182),它是 A 股唯一未完成股权分置改革的公司。看来上交所是很严谨的。

这个公式和我们前面推导的除权除息参考价公式是一致的,但不如我们推导的公式清晰无歧义。交易所规则中的「股份变动比例」在简化公式里承担了多个情形的表达;若同时存在分拆和配股,分母应反映总股份增加比例,分子中的「配股价格×比例」只应对应有偿配股部分。我们的公式中,用 $s$ 表示分拆,用 $r$ 表示配股,更加清晰。

以贵州茅台 2025 年中期分红为例,股权登记日 12-18 日,除息日为 12-19 日,每股分红 23.957 元。股权登记日的收盘价为 $P = 1431.00$ 元,根据公式计算得到的除权除息参考价 $P_{ex} = P - d = 1407.043$。而除权除息日收盘价为 1410.00 元。据此,除权除息日的涨跌幅应当为 $\frac{1410}{P_{ex}} - 1 = 0.0021$,即 0.21%。 (注意,2026 年再次分红后,查看历史价格时,前复权价格会发生变化,但当天涨跌幅不会变化。这是正常的。)

复权因子、前复权与后复权

还记得一开始提到的简单化心理倾向吗?用价格相除(并减 1)得到涨跌幅。用涨跌幅衡量收益率。

如果不论现实情况怎样,价格都能保持这个性质,那该多好?为了迎合这种追求简化心理倾向,人们动起了调整股票价格的“歪心思”。

如果把股权登记日(除权除息前一交易日)的收盘价改为除权除息参考价,在除权除息日,旧方法就能继续工作了。

再进一步,把股权登记日之前的所有价格,都「等比例」修改一下,以保证涨跌幅不变,那么所有历史价格,不就回到了最简单的那种情况吗?完美!

恭喜,我们重新发明了前复权。

前复权

把股权登记日的价格从 $P$ 改为 $P_{ex}$,相当于乘了一个系数,这就是前复权因子: $$ 前复权因子 = \frac{P_{ex}}{P_{股权登记日}} \tag{前复权因子} $$

如果把除权除息日称为 $T$ 日,股权登记日就是 $T - 1$ 日。因此,

$$ 前复权因子 = \frac{P_{ex}}{P_{T-1}} \tag{前复权因子} $$

总结一下,前复权是将股权登记日(T-1 日)及之前交易日的价格,都乘以前复权因子。这样的结果就是:

  • 股权登记日(T-1 日)的收盘价 $P_{T-1}$ 乘以前复权因子 $\frac{P_{ex}}{P_{T-1}}$ 后,变成了除权除息参考价 $P_{ex}$
  • 股权登记日(T-1 日)之前的所有价格,也都要乘以前复权因子
  • 我们可以用前复权价格相除(并减 1)得到涨跌幅,它和历史上的涨跌幅数据完全相同。

用前复权价格的话,「今天」的价格永远和实际价格相同,调整的只是历史价格。这样的好处是,下单交易时不容易出错。坏处是,每出现一次除权除息事件,历史价格就要调整一次,导致历史价格需要反复多次修正。

具体地,如果发生了多次除权除息事件,就会产生多个前复权因子。每次都要将前复权因子乘到股权登记日(T-1 日)及之前交易日的价格上。即, $$ 新的前复权价格 = 新的前复权因子 \times 上次计算得到的前复权价格 $$

追溯过往,最初的前复权价格是由最初的前复权因子乘以实际价格得到的。因此,我们可以得到前复权价格和实际(原始)价格的关系: $$ P_{d ; 前复权} = P_{d ; 原始} \times \prod_{t>d} q_t $$

$P_{d ; 原始}$ 为 $d$ 日实际(原始)价格。$q_t$ 表示,于 $t$ 日(即除权除息日)发生的除权除息事件,前复权因子为 $q_t$。

这个公式的含义是,日期为 $d$ 日的前复权价格,等于 $d$ 日的实际(原始)价格,与除权除息日在 $d$ 日之后所有的前复权因子连乘的积。

有了这个公式,我们就不必费神费力地每次除权除息后就把历史价格全给修改一遍了。只需要存储原始历史价格,和所有的前复权因子及对应除权除息日,需要前复权价格时,根据公式现场计算即可。而前复权因子的计算,也只依赖原始价格(以及分红/分拆/配股的具体参数)。

后复权

知道了前复权,理解后复权就简单了。前复权的缺点是,每次除权除息后,历史前复权价格都会发生变化。后复权则反其道而行,保持历史数据不变。

具体来说,前复权调整股权登记日(T-1 日)及之前的价格,后复权则调整除权除息日(T 日)及之后的价格。后复权也定义了自己的复权因子: $$ 后复权因子 = \frac{P_{股权登记日}}{P_{ex}} \tag{后复权因子} $$ 也即, $$ 后复权因子 = \frac{P_{T-1}}{P_{ex}} \tag{后复权因子} $$

注意,前复权因子与后复权因子互为倒数。

后复权在处理数据时有优势,但交易时就不方便了。因为「今天」的实际价格和后复权价格是有差异的。而且会因为除权除息事件的累积,差异越来越大。

类似地,多次除权除息后,会产生多个后复权因子。我们可以得到后复权价格和实际(原始)价格的关系:

$$ P_{d ; 后复权} = P_{d ; 原始} \times \prod_{t \leq d} q_t $$

这个公式的含义是,日期为 $d$ 日的后复权价格,等于 $d$ 日的实际(原始)价格,与除权除息日在 $d$ 日及 $d$ 日之前的所有的后复权因子连乘的积。 注意,$q_t$ 表示,于 $t$ 日(即除权除息日)发生的除权除息事件,后复权因子为 $q_t$。

同样地,有了这个公式,我们只要存储原始历史价格,和所有的后复权因子及对应的除权除息日,就能现场计算后复权数据了。

而考虑到后复权因子和前复权因子互为倒数,我们只要存储原始历史价格,和所有的前复权因子及对应除权除息日,就能同时计算出前复权价格和后复权价格了。

而且,从公式可以推论出,用前复权价格计算的收益率,和用后复权价格计算的收益率,是完全相同的。

最后还有一点值得说一下。数学上,乘除法可以通过倒数相互转换。也许别的地方定义的复权因子,刚好是我们这里定义的倒数,但它们用除法而我们用乘法,结果其实也会是一样的。

为什么不是直接从价格里减去分红?

如果我们只考虑分红的话(毕竟分红/分拆/配股中,分红是最常遇到的),朴素的想法,把分红金额从价格中减掉,不就完事了吗?简单明了。

朴素的想法有其道理。但是,除权除息还涉及股票分拆和配股,我们需要统一规则。而股票分拆和配股中,就不存在一个明显的可以一减了之的值了。

更重要的是,做减法而不是乘法,会导致文章开头的心理倾向的两个支柱不再成立:

  • 价格相除(并减 1),就得到了涨跌幅
  • 用价格涨跌幅衡量持股收益率

而前复权价格在某些系统里出现负数,往往就是这种「做减法」的复权方式导致的。

用复权价计算的收益率,是什么?

文章一开始就提到了,我们习惯于用价格相除(并减 1)计算涨跌幅,并用涨跌幅衡量持股(单利)收益率。近似地看,复权价计算的收益率也是持股(单利)收益率。

但是,考虑分红和配股两种情况,它其实包含着一定假设条件。具体地,它计算的是以下条件的收益率:

  • 每次分红,均以「除权除息参考价」进行红利再投资;
  • 每次配股,全额缴款参与;
  • 一股未卖。

注意红利再投资的价格,是「除权除息参考价」,而这个价格是由除权前价格计算而来的。相当于,收到分红后,要用此前的价格买入,有种穿越感,事实上是不可能做到的。不过,作为理论计算,这是完全可以接受的。而市场波动、税收、交易成本等等,都是我们必须承受的,它们也都会导致理论与现实的差距,不差那一个。

换个说法。每次分红时,在股权登记日(T-1 日)以收盘价卖出;在除权除息日,用卖出款(T-1 日卖了就没有分红了)以「除权除息参考价」买回。这与前面的说法是等价的。

我们验证一下,为什么说分红时是以「除权除息参考价」进行红利再投资的。简单点,这次我们只考虑分红,不考虑股票分拆和配股。

股权登记日(T-1 日)收盘价为 $P$。 1 股股票的市值为 $P$ 元。

假定分红为 $d$ 元,则除权除息参考价为 $P_{ex} = P - d$。分红再投后的总股数: $$ 1 + \frac{d}{P_{ex}} = 1 + \frac{d}{P - d} = \frac{P}{P - d} $$

假定,除权除息日(T 日)价格上涨幅度为 $a$。还记得吗?在除权除息日,价格涨跌的计算基准是除权除息参考价。因此,除权除息日的收盘价为: $$ P_{ex} \times (1 + a) = (1 + a)(P - d) $$

因此,在分红再投后,除权除息日收盘时的市值为: $$ \frac{P}{P -d} \times (1 + a)(P - d) = (1 + a)P $$

这意味着,从 T-1 日到 T 日,市值与价格同步增长了 $a$,收益率与价格涨跌幅一致。而它的成立,正是因为我们以「除权除息参考价」进行红利再投资。如果红利再投的价格不是「除权除息参考价」,我们的收益率与价格涨跌幅就不同了,无法用复权价格收益率来衡量。

其他

研究这个问题过程中,问过 ChatGPT、Gemini、DeepSeek、Claude 等 AI,它们给出的复权算法,都与本文描述的相同,并能给出完整的推导过程。而且我最近在看的一本经典量化入门书 Quantitative Trading: How to Build Your Own Algorithmic Trading Business,第三章介绍历史价格调整时,使用的也是此法。给我的感觉,价格复权算法似乎早就达成一致,没什么争议。

但是,中文互联网社区关于这个问题的讨论和争议就很多,说法各异。搜到的许多文章和帖子,往往语焉不详解释不清,或者干脆回避具体的计算方法。各家 AI 虽然都能正确描述这个复权算法,但偶尔还会冒出「前复权可能出现负数」、「后复权才反映真实收益率」等谬论,推测是被一些中文语料污染了。

能够说清楚复权算法的文章不多,我找到的有:

基本上,如果认为复权时应保证涨跌幅(%)不变的,差不多就是对的。这几篇文章中,@持有封基 的文章发表于 2016 年,时间最早。@optMaster 的文章提到 2005-2007 股权分置改革期间的数据容易出问题。而且我发现,跟量化有关的个人/软件其使用的复权算法往往是对的,也许因为数据质量对量化至关重要?

这里讨论的价格复权算法,中文互联网有时称为「涨跌幅复权算法」。但是,国内软件平台使用的复权算法各不相同。我们可以确定:

  • 凡前复权出现负价格的,均非此法;
  • 凡认为用前复权价格和用后复权价格计算的收益率不同的,均非此法;
  • 凡认为复权是为了抹平分红/分拆/配股造成的价格缺口的,均错。(缺口是市场交易的自然结果之一。如果说想要抹平,也需要说明标准是什么。而且,完全有可能,即使用复权价,除权除息日和股权登记日之间,K 线上仍然会出现缺口。)

根据以上文章提到及我目前查到的,使用此复权算法的软件/平台包括:

  • Wind
  • 雪球 (官方回复)
  • 新浪
  • baostock、米筐、choice、tushare 等

总结

  • 简单化的心理倾向,「用价格涨跌幅来衡量收益率」,是价格复权算法的基础。
  • 除权除息日(T 日),我们需要以「除权除息参考价」作为价格涨跌的计算基准。
  • 修改股权登记日(T-1 日)及之前的价格,但保证每天的涨跌幅不变,是前复权。
  • 修改除权除息日(T 日)及之后的价格,但保证每天的涨跌幅不变,是后复权。
  • 用前复权价格和后复权价格计算得到的收益率,是相同的。
  • 如果记录了原始历史价格、(前/后)复权因子及对应除权除息日,我们就可以计算出前复权价格和后复权价格了。
  • 用复权价格计算收益率时,假定了每次分红均以除权除息参考价进行再投资、每次配股均全额缴款参与、一股未卖。
Table of Contents