【魔码量化工程实战进阶 #09】复权机制与陷阱:前复权后复权不复权到底差在哪
【魔码量化工程实战进阶 #09】复权机制与陷阱:前复权 / 后复权 / 不复权到底差在哪
入门系列第 06 篇讲了"复权怎么选",一句话带过。本篇把它讲透:为什么不复权会有"假缺口"、为什么回测必须用后复权、为什么看盘用前复权——以及用错复权口径,回测收益率能差出几十个百分点。这是量化里最隐蔽、也最致命的数据坑。
本文你将得到什么
- 不复权为什么会在除权日出现"假跳空"
- 后复权(回测用)与前复权(看盘用)的数学定义与代码
- 一个示意示例:同一只股票,三套口径价格如何分叉(演示证书样本不含分红事件,故用合成数据演示机制)
- 三个真实踩坑:回测用前复权 / 混用口径 / 忘记复权回补
一、痛点:除权日的"假跳空"
一只股票昨收 10 元,今天每股分红 1 元(除息)。交易所会把今天的开盘参考价直接调成 9 元——这是真实发生的价格跳变吗?不是,是公司把一块钱分给你了,市值少了对应的部分,价格自然下移。
如果你用不复权价格算"今天跌了 10%",这是错的——它跌的是分红,不是股价。回测里这种假跳空会让: - 收益率算错(凭空多/少一段); - 均线、突破信号被假缺口触发; - 横截面排名(#16)被分红大的股票污染。
二、工程方案:三种口径
设复权因子 f = (除权前收盘价 − 每股分红) / 除权前收盘价。上面例子 f = (10−1)/10 = 0.9。
| 口径 | 调整方向 | 当前/最新价 | 用途 |
|---|---|---|---|
| 不复权 | 不调 | = 真实成交价(9 元) | 对账、交割单核对 |
| 后复权 | 历史价 × (1/f) 向上调 | 9 元(真实) | 回测收益率(前后连续) |
| 前复权 | 未来价 × f 向下调 | 9 元(真实) | 看盘/画 K 线(当前价真实) |
魔码历史 K 线接口用 q 参数切换:q=0 不复权、q=1 前复权、q=2 后复权(以官方文档为准):
BASE="https://api.momaapi.com"; TOKEN="你的证书"
# 不复权
r0 = requests.get(f"{BASE}/hsstock/history/600519/d/n/{TOKEN}?st=20240101&et=20260828&q=0")
# 前复权
r1 = requests.get(f"{BASE}/hsstock/history/600519/d/n/{TOKEN}?st=20240101&et=20260828&q=1")
# 后复权
r2 = requests.get(f"{BASE}/hsstock/history/600519/d/n/{TOKEN}?st=20240101&et=20260828&q=2")
演示证书返回的样本不含分红事件,三套口径价格一致(已实测
q=0/1/2末日收盘价均为 11.69)。下方用合成示意演示"发生分红时三口径如何分叉"——机制真实,数字为说明用。
三、示意示例:三口径分叉(合成,说明机制)
假设除权前日收 10.0,每股派息 1.0,f=0.9:
pre, div, f = 10.0, 1.0, 0.9
print("不复权: D-1=%.1f D0=%.1f (缺口 %.0f%%)" % (pre, pre-div, div/pre*100))
print("后复权: D-1=%.2f D0=%.2f (连续)" % (pre/f, (pre-div)/f))
print("前复权: D-1=%.1f D0=%.1f (连续, 当前价=真实)" % (pre*f, pre-div))
运行后你会看到:
不复权: D-1=10.0 D0=9.0 (缺口 10%) ← 假跳空,别用它算收益
后复权: D-1=11.11 D0=10.0 (连续) ← 收益率正确,回测用
前复权: D-1=9.0 D0=9.0 (连续, 当前价=真实 9.0) ← 看盘用
关键结论:后复权让"除权前后"价格连续,所以算区间收益率才对;前复权让"当前价"等于真实成交价,适合人眼看图。
四、原理深挖:三个真实踩坑
- 回测用了前复权(最致命):前复权把历史价向下调了,早期的价格被人为压低,算出来的"长期收益率"会虚高——你以为赚了 50%,实际只赚 30%。回测一律后复权。
- 混用口径做横截面:A 用后复权、B 用不复权,它们的"同日收盘价"量纲不同,相关系数、排名全错。必须全市场统一口径(见 #08)。
- 忘记复权回补:交易所会在除权后回补修正历史(尤其后复权因子)。如 #05 所述,定期用
UPSERT回补最近 N 日,否则你的后复权历史是过时的。
五、小结
复权不是"选个参数"那么简单,而是回测正确性的地基:回测用后复权(价格连续、收益真实),看盘用前复权(当前价真实),对账用不复权。用错口径,收益率能差出几十个点——而这恰恰是最难自查的错,因为代码不报错、曲线也"看着像那么回事"。
后复权历史 + 全市场对齐(#08)是因子与回测的前提;魔码量化 Pro 包提供的完整历史数据能让这套处理直接从"手搓"变"开箱"。详见文末。
免责声明:本文所有示例数据仅用于接口演示,不构成任何投资建议;市场有风险,投资需谨慎。
系列持续更新中。 想要亲手跑通上面的代码?前往 魔码证书申请页 免费领取你的专属证书,复制即用、按次计费、稳定可用。
