外观
前复权价格对量化策略收益的影响分析
在量化策略的开发与回测中,价格复权方式的选择往往被初学者忽视,却是影响策略表现真实性的关键因素之一。许多投资者默认使用前复权数据进行全流程开发,却没有意识到这一选择在某些策略类型中会带来系统性的偏差——让回测收益"虚高",或使实盘表现与回测结果出现莫名其妙的背离。
本文将系统梳理三种复权方式的本质区别,深入分析前复权价格对策略绩效的具体影响机制,并给出不同场景下的复权方式选择建议。
一、三种复权方式的本质区别
在 A 股市场,上市公司会定期进行分红派息(派发现金股利)和送股拆股(送红股、转增股、配股等)。这些行为会导致股价在除权除息日发生突然的价格跳变,但这种跳变并不代表真实的涨跌收益。为消除这种干扰,数据提供商会对历史价格进行"复权"处理。
1.1 前复权(Backward Adjusted Price)
以当前价格为基准,向历史方向调整,使历史价格与当前价格保持连续可比。
核心特征:
- 当前最新价格 = 实际市场价格(不做修改)
- 每次除权除息后,所有历史价格都会向下调整
- 价格序列始终以"现在"为锚点
举例:
| 日期 | 实际收盘价 | 事件 | 前复权价 |
|---|---|---|---|
| D-30 | 10.00 元 | — | 9.10 元(事后调整) |
| D-1 | 10.50 元 | — | 9.56 元(事后调整) |
| D日 | 9.55 元 | 除息(派息0.95元) | 9.55 元(不变) |
| D+1 | 9.80 元 | — | 9.80 元(不变) |
注意:D日除息后,D-30 的历史价格从 10.00 元被永久修改为 9.10 元。
1.2 后复权(Forward Adjusted Price)
以最早的历史价格为基准,向未来方向调整,使历史价格序列从起点开始连续可比。
核心特征:
- 最早的历史价格保持不变
- 每次除权除息后,当日及之后所有价格向上调整
- 价格会越来越高,脱离实际市场价格
举例(以同样数据):
| 日期 | 实际收盘价 | 事件 | 后复权价 |
|---|---|---|---|
| D-30 | 10.00 元 | — | 10.00 元(不变) |
| D-1 | 10.50 元 | — | 10.50 元(不变) |
| D日 | 9.55 元 | 除息(派息0.95元) | 10.50 元(调整后) |
| D+1 | 9.80 元 | — | 10.76 元(调整后) |
1.3 不复权(Unadjusted Price)
保持原始市场价格,不做任何调整,在除权除息日价格序列会出现跳空缺口。
核心特征:
- 价格完全真实,与交易系统/软件中看到的价格一致
- 除权除息日会出现明显的价格跳空(向下)
- 历史价格不因未来事件而改变
1.4 三种复权方式核心对比
| 对比维度 | 前复权 | 后复权 | 不复权 |
|---|---|---|---|
| 当前价格 | = 实际价格 | ≠ 实际价格(偏高) | = 实际价格 |
| 历史价格 | 随新除权事件变化 | 固定不变 | 固定不变 |
| 收益率计算 | 准确 | 准确 | 除权日前后不准确 |
| 价格序列连续性 | 连续 | 连续 | 有跳空缺口 |
| 技术指标计算 | 有隐患(见下文) | 稳定可靠 | 除权日附近有干扰 |
二、前复权价格的核心问题:历史数据会"穿越"
前复权最隐蔽、最危险的特性,是它会随着每一次新的除权除息事件,向前追溯修改全部历史价格。
这意味着:今天你看到的历史数据,与昨天你看到的历史数据,并不相同。
2.1 "穿越"问题的直观演示
假设你在 2024年1月1日 使用前复权数据开发了一个均线策略,回测结果显示 2023年6月某日发出了买入信号(当时20日均线 = 9.2 元,价格 = 9.5 元,价格 > 均线,买入)。
2024年6月30日,该股除息,派发每股 0.5 元现金红利。除息后,前复权数据对所有历史价格乘以一个调整系数(约 0.95)。
当你重新运行回测时,会发现:
- 2023年6月同一天,20日均线变成了 8.74 元,价格变成了 9.03 元
- 买入信号依然存在(价格 > 均线)……但这不是关键
关键是:如果策略逻辑是"价格突破某个绝对数值"或"价格处于某个历史分位数",则:
- 2024年1月1日回测时看到的历史信号,与
- 2024年7月1日回测时看到的历史信号,
会完全不同,因为除权后历史价格整体下移了。
这就是量化领域俗称的**"未来函数"(Look-Ahead Bias)**的一种特殊形式:历史回测用到了"未来才会发生的除权信息"来修改过去的价格。
2.2 实盘信号与回测信号的永久性错位
更严峻的问题发生在实盘运行阶段。
设想如下场景:
- 回测阶段(使用前复权数据):策略在 T-60 日发出买入信号,历史前复权价为 9.00 元
- 实盘运行:T-60 日当天,股票实际价格为 9.50 元(因为除权调整尚未发生,当时前复权价就是实际价格 9.50 元)
- 问题:回测中的 9.00 元信号对应的实际市场价格是 9.50 元,两者之间有 5.26% 的差距
这意味着,你基于前复权数据优化出来的参数(如均线周期、阈值、仓位)都是**基于"经历了未来所有除权调整的历史价格"**计算得出的,而实盘中这些除权还没发生。
实盘策略所看到的前复权数据,与回测时所使用的前复权数据,在除权发生之前是相同的,但在除权发生之后,历史部分就永远不同了。
三、前复权对不同类型策略的影响分析
前复权并非在所有策略中都会带来问题,其影响程度取决于策略的信号逻辑类型。
3.1 基于收益率的策略:影响较小
如果策略的核心逻辑是基于价格涨跌幅(例如:过去 N 日收益率、动量因子、相对强弱),则前复权数据对回测结果的影响较小。
原因:除权后,相邻两日之间的前复权价格比值(即收益率)与实际收益率一致,不会产生失真。
前复权收益率 = (前复权价[t] - 前复权价[t-1]) / 前复权价[t-1]
≈ 实际收益率(除权当日除外)适用策略类型:动量/反转策略、配对交易、相对强弱轮动策略。
3.2 基于绝对价格水平的策略:风险极高
如果策略信号依赖绝对价格水平,前复权数据会造成严重偏差。
典型场景:
- 突破策略:价格突破历史 N 日最高价
- 支撑压力策略:价格接近某个关键价位
- 价格过滤:价格高于/低于某个固定阈值
问题演示:
实际情况(2024年1月1日,除权前):
- 股票实际价格:10.00 元
- 过去252日(一年)最高价:10.50 元(前复权 = 实际价格)
- 策略信号:价格未突破年内高点,不开仓
2024年7月1日,该股两次除权(共除息1元)后重新回测:
- 2024年1月1日的前复权价变为:~9.05 元
- 过去252日最高价(前复权)变为:~9.50 元
- 策略信号:价格(9.05元)未突破高点(9.50元),不开仓
[信号本身没变,但...]
另一种情况:2024年1月1日时,策略设有绝对过滤条件"价格 > 9.5元才考虑买入":
- 回测时(2024年7月1日之后):历史前复权价 9.05 元 < 9.5 元,过滤掉!
- 实盘时(2024年1月1日):实际价格 10.00 元 > 9.5 元,不会被过滤!
→ 导致回测遗漏了大量实际上应该参与的交易3.3 基于技术指标(均线/布林带等)的策略:存在系统性偏差
对于均线(MA)、布林带(Bollinger Bands)、MACD 等基于价格序列计算的技术指标,前复权数据会造成系统性参数偏差。
| 影响类型 | 具体表现 |
|---|---|
| 信号时机偏移 | 除权后历史价格整体下移,指标数值改变,部分历史信号消失或新增 |
| 参数失效 | 在前复权数据上优化出的最优参数,在实盘中未必最优 |
| 止损/止盈价位失准 | 基于前复权价格设置的止损价在实盘中对应不同的实际价格 |
| 跨股票比较失真 | 不同除权次数的股票,前复权价格的"历史基数"差异巨大,横截面比较无意义 |
3.4 ETF 策略的特殊说明
ETF 同样会有分红除息,尤其是债券型 ETF 和高分红 ETF(如红利 ETF)分红频率较高。
对于 ETF 轮动策略,若使用前复权数据:
- 分红频率较高的 ETF(如债券 ETF),其前复权历史价格与实际价格的偏差会随时间不断累积
- 这会影响横截面动量/轮动排名的准确性
- 长期回测(5年以上)中,偏差可能达到10%-30%,严重影响策略的真实性评估
四、前复权对策略回测收益的量化影响
以下通过一个具体模拟案例,展示前复权对策略净值的影响量级。
4.1 案例背景设定
- 策略类型:ETF 均线突破策略,基于 20 日均线,价格突破均线买入,跌破均线卖出
- 回测标的:某高分红 ETF,年均分红 2 次,每次除息率约 1.5%
- 回测区间:5 年(60 个月)
- 交易频率:年均约 12 次(买入+卖出各6次)
4.2 前复权 vs 后复权回测结果对比(模拟数据)
| 绩效指标 | 前复权回测 | 后复权回测 | 不复权回测 | 实盘真实结果 |
|---|---|---|---|---|
| 年化收益率 | 18.5% | 15.2% | 13.8% | 14.9% |
| 最大回撤 | 9.3% | 11.7% | 12.4% | 11.5% |
| 夏普比率 | 1.82 | 1.45 | 1.28 | 1.41 |
| 胜率 | 67% | 58% | 55% | 57% |
| 与实盘的偏差 | +3.6% | +0.3% | -1.1% | — |
说明:上表数据为模拟演示,实际偏差大小与分红频率、回测周期长短密切相关。
核心结论:
- 前复权回测高估了策略收益:高达 3.6 个百分点的年化偏差
- 后复权回测与实盘最为接近:偏差仅 0.3%
- 不复权回测低估了收益:除权日价格跳空导致虚假卖出信号,减少了持仓时间
4.3 偏差来源的拆解
前复权回测收益虚高,原因在于:
① 信号提前触发:除权后历史价格降低,使得均线值也同步降低,价格(使用当前前复权价)更容易突破调整后的均线,造成更多虚假买入信号。
② 持仓周期拉长:调整后的历史均线被压低,策略倾向于更晚卖出(因为跌破压低后的均线需要更大的跌幅),使持仓时间在回测中偏长。
③ 复利叠加效应:前两个偏差在多年的复利作用下被持续放大,最终导致策略净值曲线与实际存在明显偏离。
五、不同场景下的复权方式选择建议
5.1 总体选择原则
核心原则:选择能够让历史回测信号与实际可操作信号保持最高一致性的复权方式。
5.2 分场景建议
场景一:策略研发与历史回测
推荐:后复权(首选)或不复权
选择后复权的理由:
- 历史价格固定不变,任何时候重跑回测得到相同结果(可复现)
- 区间收益率计算准确,不受未来除权影响
- 适合长期回测,多年的价格趋势和均线关系不因未来事件而改变
选择不复权的理由(适合短期/高频策略):
- 价格完全真实,与交易软件中看到的价格完全一致
- 不会引入任何由复权带来的数据修改
- 缺点:需要手动处理除权日的价格跳空,避免产生虚假信号
建议:
✅ 长期趋势/均线策略 → 后复权
✅ 短期价格行为策略 → 不复权(需处理除权跳空)
✅ 纯收益率/动量策略 → 前复权或后复权均可
❌ 含绝对价格过滤条件 → 禁止使用前复权场景二:实盘信号计算
推荐:与回测保持一致,但需特别注意
- 若回测使用后复权:实盘计算指标时同样使用后复权数据,但下单时以实际市价执行
- 若回测使用不复权:实盘计算时使用不复权数据,但需在每次除权后手动调整价格基准
- 不推荐直接用前复权数据做实盘信号,因为每次除权后历史信号都会变化,策略状态不稳定
场景三:行情展示与价格查看
推荐:前复权
这是前复权最适合的使用场景。在看行情、画 K 线图、直观判断趋势时,前复权数据能让价格序列连续可比,是观察历史走势最友好的方式。
简单说:前复权用来看,后复权用来算。
场景四:多标的横截面比较(如 ETF 轮动)
推荐:后复权
横截面策略需要比较不同标的之间的相对强弱,后复权能正确反映各标的的历史真实收益,不会因除权次数不同导致价格基数差异影响排名。
5.3 汇总对照表
| 使用场景 | 推荐复权方式 | 原因 |
|---|---|---|
| 历史回测(长期) | 后复权 ✅ | 历史数据稳定,收益率准确 |
| 历史回测(短期/高频) | 不复权 ✅ | 价格真实,减少干扰 |
| 实盘信号计算 | 与回测一致(后复权/不复权) ✅ | 保持一致性,避免信号错位 |
| 行情走势查看 | 前复权 ✅ | 价格连续,视觉友好 |
| 多标的横截面比较 | 后复权 ✅ | 收益率可比性强 |
| 绝对价格型信号 | 不复权 ✅ | 避免历史价格被追溯修改 |
| 含固定阈值的策略 | 不复权 ✅ | 前复权/后复权均会使阈值失真 |
| 纯收益率型信号 | 三种均可,后复权略优 | 收益率计算均准确 |
六、实操建议:如何避免前复权的陷阱
6.1 检查你的数据来源
在开始策略开发前,务必确认数据接口返回的价格类型:
python
# 常见数据接口中的复权参数(以伪代码为例)
get_price(symbol, adj_type='pre') # 前复权
get_price(symbol, adj_type='post') # 后复权
get_price(symbol, adj_type='none') # 不复权许多量化平台默认返回前复权数据,请检查你的数据获取代码是否明确指定了复权方式。
6.2 回测重现性验证
一个简单的验证方法:
- 在时间 T1 运行回测,记录某个历史日期的价格数值
- 等待一次分红除息事件发生(时间 T2)
- 在时间 T2 重新运行回测,检查同一历史日期的价格是否改变
如果价格改变了 → 你在使用前复权数据(有"穿越"风险)
如果价格不变 → 你在使用后复权或不复权数据(安全)6.3 对含绝对价格的策略做压力测试
如果你的策略中包含任何基于绝对价格水平的条件(如"价格 > N元"),建议:
- 分别用前复权和后复权数据跑回测
- 若两者结果差异超过 2% 年化收益,说明策略对复权方式敏感,需要重新审视逻辑
- 以后复权或不复权的回测结果作为策略真实性的参考基准
6.4 建立复权一致性规范
对于团队或长期运营的策略,建议在策略文档中明确记录:
数据规范:
- 回测数据:后复权收盘价
- 信号计算:后复权实时价
- 下单执行:实际市价(交易所成交价)
- 净值计算:按实际成交价计算,不使用复权价七、总结
复权方式的选择看似是一个技术细节,实则关乎策略回测的真实性和实盘表现的可预期性。
| 核心结论 | 说明 |
|---|---|
| 前复权适合看图,不适合算法 | 每次除权都会修改全部历史数据,导致回测信号不可复现 |
| 后复权是量化回测的首选 | 历史数据稳定,收益率计算准确,与实盘偏差最小 |
| 不复权适合短期和高频策略 | 价格完全真实,但需手动处理除权跳空 |
| 绝对不要用前复权做绝对价格型策略 | 历史价格被追溯修改,会引入严重的未来函数偏差 |
| 实盘与回测的数据类型必须一致 | 混用不同复权方式会导致信号错位,实盘无法复现回测结果 |
量化策略的生命力,在于其可复现性和可信赖性。使用前复权数据做回测,看似方便直观,实则在每一次除权后悄悄地修改了历史,让你的策略建立在一个"会随时间漂移的地基"上。
选择正确的复权方式,是构建真实可靠量化策略的第一步。
希望本文能帮助你厘清复权方式对策略的影响,在策略开发的源头把好数据质量关。如有任何问题,欢迎在社群中交流探讨。