复权对 ETF 轮动策略的影响分析
做过量化的朋友大概都有这样的经历:回测曲线漂亮得不像话,一上实盘却处处掉链子。很多时候问题不是出在策略逻辑上,而是出在
价格数据本身
——更具体地说,是
复权方式
选错了。
ETF 轮动策略尤其容易踩坑:ETF 会定期分红,高股息 ETF 甚至一年分红两到四次。如果复权方式处理不当,不仅
动量因子会排错序
,连
持仓收益
都会算错,实盘和回测会越跑越远。
本文将用最通俗的方式带你彻底理解复权,包括:
什么是复权价
前复权 / 后复权的计算方式
什么是等比复权,为什么必须要用等比复权
等比复权的计算公式
策略回测中复权的正确用法(动量 vs 持仓收益)
什么是动态复权
一、什么是复权价?
1.1 分红、送股会让股价"凭空下跌"
先看一个例子。假设你持有某 ETF,昨日收盘价
10.00 元
,今天该 ETF 分红 0.50 元/份(现金),那么今天开盘前,该 ETF 的
除息参考价
会被交易所自动调整为:
除息参考价 = 10.00 - 0.50 = 9.50 元
股价看起来"跌了"5%,但你的
总资产并没有减少
——因为 0.50 元现金已经打到账户里了。这种由分红、送股、配股等行为引起的价格跳空,叫做
除权除息
。
除权除息带来的问题是:
价格的时间序列出现了一个不反映涨跌的跳空缺口
。如果直接拿这样的原始价格做技术分析,均线、动量、突破信号全部会误判。
1.2 复权:把"不是真跌"的跳空抹平
复权
(Adjustment)的目的,就是把除权除息造成的"假跌"抹平掉,使价格序列变得
连续可比
,真实反映投资者持有该资产的累计收益。
一句话概括:
复权价 = 把分红、送股的影响折算回去之后的"可比价格"。
常见的复权方式有三大类:
类型
英文
基准
特点
不复权
Raw / None
原始价格
完全真实,但有跳空
前复权
Backward Adjusted
以"当前价"为锚
历史价格被向下调整
后复权
Forward Adjusted
以"历史起点"为锚
未来价格被向上累积
前复权
:保持当前价格不变,将历史价格进行增减,从而使股价连续。 前复权用来看盘非常方便,能一眼看出股价的历史走势,叠加各种技术指标也比较顺畅,是各种行情软件默认的复权方式。 这种方法虽然很常见,但也有两个缺陷需要注意。
1.为了保证当前价格不变,每次股票除权除息,均需要重新调整历史价格,因此其历史价格是时变的。 这会导致在不同时点看到的历史前复权价可能出现差异。
2.对于有持续分红的公司来说,前复权价可能出现负值。
后复权
:保证历史价格不变,在每次股票权益事件发生后,调整当前的股票价格。 后复权价格和真实股票价格可能差别较大,不适合用来看盘。 其优点在于,可以被看作投资者的长期财富增长曲线,反映投资者的真实收益率情况。
在量化投资研究中普遍采用后复权数据。
二、复权价是怎么算出来的?
2.1 前复权:把分红从前一日价格里"减掉"
普通前复权的思路非常朴素——
把每次分红和送转的影响,反向叠加到除权前一日的价格上
。
以一次简单的现金分红为例:
日期
事件
原始价
前复权价
D-1
除权前一日
10.00
9.50
(向下调整)
D
除权当日派息 0.50 元
9.50
9.50(保持不变)
D+1
—
9.60
9.60(保持不变)
核心公式
:
前复权价 D-1 = 原始价 D-1 - 现金分红
= 10.00 - 0.50
= 9.50
如果同时有送转股(例如 10 送 2,即送转比例 0.2)和配股,通用公式是:
前复权价_(D-1) = ( 原始价_(D-1) - 现金分红 + 配股价 × 配股比例 ) / ( 1 + 送转比例 + 配股比例 )
注意
:普通前复权是
逐次加减处理
的——先减去分红,再除以送转比例。
2.2 后复权:把分红"累加"到未来价格上
普通后复权的思路正好相反:
保持历史价格不变,将每次分红和送转的影响"累加"到除权当日及之后的所有价格上
。
日期
事件
原始价
后复权价
D-1
除权前一日
10.00
10.00(保持不变)
D
除权当日派息 0.50 元
9.50
10.00
(向上还原)
D+1
—
9.60
10.11(按比例累加)
用一句话总结:
前复权是"降低历史",后复权是"抬高未来",两者在"涨跌幅"上应该等价——但事实并非如此。
这就引出了下一节的核心问题:
普通复权方式会导致涨幅失真
。
三、普通复权的"致命缺陷":涨幅失真
3.1 为什么"简单加减"会出问题?
先看一个真实场景。某 ETF 连续多次高分红,按照普通前复权的算法
逐次做减法
,历史价格会不断被往下压。压到什么程度?
极端情况下会被压到负数
——这显然不符合任何真实市场的逻辑。
在迅投 QMT 社区的一个实测案例中,一只持续高分红的股票在普通前复权模式下,历史价格已经被推到了
负数
。这意味着 K 线图上会画出不存在的负价,你写的基于绝对价格的策略条件全部报废。 (详见参考资料
迅投社区 - 聊聊除权发生日的持仓涨幅计算
)
3.2 涨幅对比:普通前复权 vs 真实涨幅
更严重的问题是
涨幅失真
。我们来做一个简单推演。
假设某 ETF:
除权前一日原始收盘价
c0 = 10.00 元
除权当日派息
0.50 元
,不送转
除权当日真实收盘价
c1 = 10.25 元
【真实持有人的涨幅】
作为持有人,你昨日持仓市值 10.00 元,今日现金分红 0.50 元 + 股票市值 10.25 元 =
10.75 元
,真实涨幅:
真实涨幅 = ( 10.75 / 10.00 ) - 1 = 7.50%
【普通前复权下的涨幅】
普通前复权把历史价从 10.00 减为 9.50,今日价不变仍为 10.25:
前复权涨幅 = ( 10.25 / 9.50 ) - 1 = 7.89%
【普通后复权下的涨幅】
后复权把今日价从 10.25 抬高为 10.78(= 10.25 × 10.00 / 9.50),历史不变:
后复权涨幅 = ( 10.78 / 10.00 ) - 1 = 7.80%
三者对不上!真实涨幅 7.50%、前复权 7.89%、后复权 7.80%,都有偏差。
原因
:普通复权做的是
加减法
,但收益率的本质是
比率
。要注意,分红后拿到的是现金,这部分本身并不会自动产生额外收益;问题不在“分红现金继续增值”,而在于用加减法改了价格再去算比率,分子和分母的对应关系被扭曲了。分红越大、分红次数越多,这种扭曲在除权日附近越明显,偏差也越容易累积。
这就是
普通复权会让涨幅失真
的本质原因,也是动量、波动率、夏普等
任何跟涨跌幅相关的因子都会被污染
的根源。
四、等比复权:为比率计算而生
4.1 核心思路
既然加减法出错,那就改用乘除法——
每次除权都按"涨幅比例"作为调整系数
,然后把历史价格
乘以
这个系数,而不是减去一个绝对金额。这就是
等比复权
(Proportional Adjustment)。
对前面那个例子
:
除权当日的实际涨幅是
7.50%
(把分红和现价一起算进去),所以复权调整系数就是:
factor = ( 除权日现价 ) / ( 除权前一日原始价 × ( 1 + 真实涨幅 ) )
换个更直观的写法——等比前复权的"单次复权因子":
factor = (c1) / (c0 + 分红 - 配股价 × 配股比例) × (1 + 送转比例 + 配股比例)
这里的
c0
是除权前一日的
原始价
,
c1
是除权当日的
原始价
。计算出来的
factor
就是一个
等比例系数
。
然后:
等比前复权价(所有历史日) = 原始价(该日) × factor
如果历史上有多次分红除权,就把每次的 factor
连乘
起来,再和原始价相乘。
4.2 验证:等比复权的涨幅是对的
继续用上面的例子验证。等比前复权下:
等比前复权 c0 = 10.00 × (10.25 / 10.75) ≈ 9.535
等比前复权 c1 = 10.25(当日价保持不变)
等比前复权涨幅 = ( 10.25 / 9.535 ) - 1 = 7.50%
✅
正好等于真实持仓涨幅 7.50%
。
这就是**等比前复权之所以被称为"正确复权"**的原因——无论是否跨越除权日,
涨幅计算永远是准确的
。
4.3 等比复权处理分红,为什么是合理的?
很多朋友第一次看到等比复权,会担心一个问题:
分红明明是现金流,为什么可以用一个价格比例系数去处理?这会不会"把分红算丢了"?
这个担心非常好。判断是否合理,关键看两条:
资产守恒
:分红前后,总资产是否连续;
收益一致
:复权后算出来的涨幅,是否等于真实持有人的账户涨幅。
对仅有现金分红(不送转、不配股)的场景,可以直接推导:
设:
P_{t-1}
:分红前一日原始收盘价
D_t
:每份现金分红
P_t
:分红当日原始收盘价
真实持有人的单日收益率应为:
r_t = (P_t + D_t) / P_{t-1} - 1
等比复权定义一个当日调整因子
k_t
,使得:
P_t / (P_{t-1} × k_t) - 1 = r_t
把
r_t
代入可得:
k_t = P_t / (P_t + D_t)
于是分红前一日的等比复权价就是:
P'_{t-1} = P_{t-1} × k_t = P_{t-1} × P_t / (P_t + D_t)
再算复权口径涨幅:
P_t / P'_{t-1} - 1
= (P_t + D_t) / P_{t-1} - 1
= r_t
✅ 完全等于真实收益率。
这说明:
等比复权并不是把分红忽略掉,而是把“价格收益 + 现金分红收益”合并成同一口径的收益率序列
。因此它在做动量、波动率、夏普、回归斜率这类"只关心收益率"的计算时是合理且严谨的。
通俗地说,
等比复权就像把分红在当日按该基金价格立刻再投入
。
但请注意:合理不等于万能。等比复权是把分红"折叠"进价格序列,适合因子和信号计算;如果要做账户净值、可用现金、再投资模拟,必须使用"真实价格 + 动态复权"。
4.4 等比复权的两大优点
优点
具体说明
不会出现负价格
因为每次只是乘一个正系数(通常略小于 1),无论多少次分红都不会把价格压到负数
涨幅始终真实
每次除权位置的价格变化都与真实持仓涨幅一致,跨除权日的收益率不失真
五、策略回测中复权的正确用法
讲完了原理,终于来到最关键的一步:
在 ETF 轮动策略中,到底应该怎么使用复权?
答案是
分场景使用不同的价格
。
5.1 动量因子计算:必须使用等比复权价
所有与
价格涨跌幅
相关的量化因子,都必须使用
等比复权价
计算,否则会被分红事件严重干扰。典型的受影响因子包括:
简单动量
:
(P_今 - P_N天前) / P_N天前
斜率动量
:对数价格做线性回归
加权斜率动量
:带权重的线性回归
RSRS 动量
:基于最高价/最低价的相对强弱
波动率
:收益率序列的标准差
夏普比率、Calmar 比率
:所有基于收益率的评价指标
为什么必须是等比复权?
以斜率动量为例:
python
# 伪代码:斜率动量计算
y
=
np.log(close_prices)
# 对数价格
slope, _
=
np.polyfit(x, y,
1
)
这里的对数价格
log(P)
对应的斜率,物理含义就是
每日对数收益率
。如果
close_prices
是不复权价或普通复权价,除权日的价格跳空会让
log(P_t) - log(P_{t-1})
直接出现一个
巨大的负脉冲
,线性回归结果完全失真。
只有使用
等比复权价
,对数价格序列才是
连续、光滑
的,动量排名才有意义。
一句话规则
:
🔴
凡是用价格算"涨跌幅"或"因子分数"的地方,必须用等比复权价(推荐等比前复权或等比后复权)。
5.2 持仓收益计算:用真实价 + 动态复权
这里有一个非常容易被忽略的点:
动量因子用等比复权价算排名没问题,但计算策略净值时,不能直接用等比复权价算收益
。
为什么?
因为你的资金账户真实持有的是
份额
,成交价是
真实的市场价
,分红到账的是
真实的现金
。如果在净值模拟时用"等比复权价"直接算涨幅:
分红到账的现金没有被独立跟踪,而是被隐含在了复权价里;
买卖成交价如果用复权价,则与实盘无法对应(实盘撮合的是真实价);
持仓期间跨越除权日时,份额变化(送股/拆股)未被真实反映。
正确的做法
是
模拟实盘账户的运作方式
——这就是所谓的
动态复权
。
六、什么是动态复权?
6.1 动态复权的定义
动态复权
(Dynamic Adjustment)不是一种"新的价格",而是一种
账户级的模拟记账方式
:
当持仓的标的发生
分红、送股、拆股、合并、配股
等事件时,
回测系统按照真实市场规则,同步调整账户中的持股数量和现金余额
,使得账户状态与"真的有个账户在持仓"完全一致。
引用 joinquant(聚宽)官方文档对"拆分合并与分红"的处理方式(
JoinQuant 文档
):
市场事件
动态复权账户处理方式
现金分红
按持股数量 × 每股分红金额,
现金余额增加
送股 / 转增
按送转比例,
持股数量增加
拆股(splitRatio > 1)
持股数量按拆股比例增加,持股单价下降
合并(splitRatio < 1)
持股数量按合并比例减少,持股单价上升
配股
扣除现金,增加持股数量(若策略中参与配股)
6.2 动态复权下,策略净值如何计算?
以一次分红为例,直观演示:
【初始状态】
持仓:某 ETF 10000 份
现金:0
当日收盘价:10.00 元
账户总市值:10000 × 10.00 =
100,000 元
【次日除息:每份派息 0.50 元】
动态复权处理:
持股数量不变:10000 份
现金增加:10000 × 0.50 = 5,000 元
除息参考价:9.50 元
账户总市值:10000 × 9.50 + 5,000 =
100,000 元
(不变,合理!)
【除息日实际收盘价 9.60 元】
账户总市值:10000 × 9.60 + 5,000 =
101,000 元
当日涨幅 = ( 101,000 / 100,000 ) - 1 =
1.00%
用等比前复权价验证一下:
等比前复权_D-1 = 10.00 × (9.60 / (9.60 + 0.50)) = 10.00 × 9.60 / 10.10 ≈ 9.505
当日涨幅 = (9.60 / 9.505) - 1 ≈ 1.00% ✅ 吻合
两种算法得到的涨幅
完全一致
。但
动态复权的优势在于
:
现金分红可以在账户中
实际流转
,下一次调仓时可以用于重新买入其他标的;
送股/拆股后的持股数量变化也是
真实记录
的,不会隐藏在"复权系数"里;
实盘迁移时,策略逻辑
一一对应真实账户操作
,不会出现回测用一套、实盘用另一套的问题。
6.3 单次动态复权的数学表达
在一些量化平台(如迅投 QMT)中,
动态复权
也被称为
单次动态前复权
,它的核心思想是:
只在持仓跨越当次除权日时,对"前一日收盘价"进行一次复权
,用于计算当日的真实涨幅。
单次复权因子 = (除权日原始价 + 分红) / (1 + 送转比例) / 除权前一日原始价
复权前收价 = 除权前一日原始价 × 单次复权因子
当日涨幅 = 今日原始价 / 复权前收价 - 1
这里"前复权"这个词指的是"
把前一日收盘价调整到除权后的口径
",而不是修改所有历史数据。
这才是实盘中计算"当日持仓涨幅"的正确方式
。
七、三种价格在 ETF 轮动策略中的正确分工
把前面所有内容总结如下:
在 ETF 轮动策略中,三类操作应使用不同的价格口径:
动量因子计算 / 排名打分
:使用
等比复权价
(等比前复权或等比后复权),保证跨除权日的涨跌幅不失真。
调仓下单 / 成交价模拟
:使用
真实原始价
(不复权价),保证成交价与实盘对应。
持仓期间收益与净值计算
:使用
动态复权
(账户级处理),分红入账、送股增持、拆股合并自动处理。
天枢量化平台的处理方式
在
天枢量化
的回测与实盘系统中:
动量因子
(简单动量、斜率动量、加权斜率动量、RSRS 动量)统一使用
等比后复权
进行计算,保证跨除权日的动量排名稳定可信;
持仓净值
使用
动态复权
方式模拟真实账户,分红按真实金额进入现金账户,送股按真实比例增加持股数量;
回测结果
与实盘轨迹高度一致,避免"回测漂亮、实盘掉链子"的典型问题。
八、总结
复权问题看似只是"价格处理"这样一个技术细节,但它直接决定了 ETF 轮动策略的
回测真实性
与
实盘可迁移性
。
核心结论
关键要点
复权的目的
消除分红、送股等事件造成的"假跳空",保证价格可比
普通复权的缺陷
加减法导致涨跌幅失真,高分红标的下会累积出负价格
等比复权的优势
按比例累乘,涨跌幅与真实持仓收益完全一致
动态复权的本质
不是"一种价格",而是账户级的记账方式,真实还原分红/送股流程
动量因子
必须使用等比复权价计算
持仓收益
必须使用原始价 + 动态复权模拟真实账户
一句话总结
:
等比复权用来"打分",真实价加动态复权用来"结账"。
两者各司其职,才能让 ETF 轮动策略的回测曲线真正反映你未来能拿到的收益。
参考资料
聊聊除权发生日的持仓涨幅计算 - 迅投 QMT 社区
拆分合并与分红 - JoinQuant 文档
雪球 - 关于复权的讨论