一、为什么需要复权
除权除息会在价格序列上留下跳空。例如分红或送股后,价格自然下移,但持有人的总价值并未同比例减少。若直接使用未调整价格计算收益率,就会把这些公司行为误读为下跌。
复权的作用是把价格序列调整到可比状态,让跨除权日的收益率、均线与波动率计算保持连续。它处理的是价格可比性,不改变真实成交价。
二、三种口径的计算差异
不复权保留交易所原始价格,适合查看真实成交价与盘口;前复权以当前价格为基准向前调整历史价格,最新一段与真实价格一致;后复权以历史某一点为基准向后调整,适合长周期累计收益比较。
三者没有绝对优劣,只有使用场景。做长周期收益率比较时,前复权与后复权的差异会随着新的除权事件而变化,因此必须记录复权基准日。
- 不复权:真实价格,跨除权日收益率不连续
- 前复权:当前价格为锚,历史价格随新事件变化
- 后复权:历史价格为锚,便于累计收益比较
三、对回测与指标的影响
均线、布林带、ATR 等指标都基于价格序列。若在除权日前后混用口径,指标会出现不真实的跳变。回测中更常见的问题是:信号用复权价计算,成交却按不复权价撮合,二者没有统一换算。
正确处理方式是明确“信号计算用哪套价格、成交与费用用哪套价格”,并在代码里保留复权因子,需要时在两者之间换算。
四、落地时的记录清单
项目开始时把复权方式写进数据字典,并在配置文件中显式声明,不要依赖数据源的默认值。默认值会随供应商版本变化,也可能在接口升级后悄悄改变。
如果数据跨越多年,建议同时保存原始价格与复权因子,复权序列由程序按规则生成。这样口径变化时可以重算,而不是重新下载全部历史数据。
- 复权方式与基准日期
- 复权因子来源与更新频率
- 信号价与成交价的对应关系
- 数据版本号与生成时间
五、常见错误
第一类错误是只用前复权数据做长期比较,却没有意识到历史价格会随新的除权事件变化;第二类错误是把复权价当成真实成交价,导致成本与滑点估算失真;第三类错误是不同标的混用不同口径,却不做标注。
这些问题不会让程序报错,只会让结果悄悄偏移。把口径写进文档、写进配置、写进输出结果的元信息,是成本最低的防线。
六、复权与成交量的关系
复权通常只调整价格,成交量是否需要同步调整取决于数据源与使用目的。有的数据源会按股本变化调整成交量,有的保持原始值,混用时会出现量价不匹配。
如果指标同时使用价格与成交量,例如量价配合类计算,必须确认两者是否处于同一口径。确认方式不是看文档描述,而是用一次除权日前后的数据实际比对。