← 返回博客列表

【魔码量化工程实战进阶 #09】复权机制与陷阱:前复权后复权不复权到底差在哪

2026年08月31日 18:02 · 魔码数服 · 魔码量化工程实战进阶

【魔码量化工程实战进阶 #09】复权机制与陷阱:前复权 / 后复权 / 不复权到底差在哪

入门系列第 06 篇讲了"复权怎么选",一句话带过。本篇把它讲透:为什么不复权会有"假缺口"、为什么回测必须用后复权、为什么看盘用前复权——以及用错复权口径,回测收益率能差出几十个百分点。这是量化里最隐蔽、也最致命的数据坑。

本文你将得到什么

  1. 不复权为什么会在除权日出现"假跳空"
  2. 后复权(回测用)与前复权(看盘用)的数学定义与代码
  3. 一个示意示例:同一只股票,三套口径价格如何分叉(演示证书样本不含分红事件,故用合成数据演示机制)
  4. 三个真实踩坑:回测用前复权 / 混用口径 / 忘记复权回补

一、痛点:除权日的"假跳空"

一只股票昨收 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)  ← 看盘用

关键结论:后复权让"除权前后"价格连续,所以算区间收益率才对;前复权让"当前价"等于真实成交价,适合人眼看图。


四、原理深挖:三个真实踩坑

  1. 回测用了前复权(最致命):前复权把历史价向下调了,早期的价格被人为压低,算出来的"长期收益率"会虚高——你以为赚了 50%,实际只赚 30%。回测一律后复权。
  2. 混用口径做横截面:A 用后复权、B 用不复权,它们的"同日收盘价"量纲不同,相关系数、排名全错。必须全市场统一口径(见 #08)。
  3. 忘记复权回补:交易所会在除权后回补修正历史(尤其后复权因子)。如 #05 所述,定期用 UPSERT 回补最近 N 日,否则你的后复权历史是过时的。

五、小结

复权不是"选个参数"那么简单,而是回测正确性的地基:回测用后复权(价格连续、收益真实),看盘用前复权(当前价真实),对账用不复权。用错口径,收益率能差出几十个点——而这恰恰是最难自查的错,因为代码不报错、曲线也"看着像那么回事"。

后复权历史 + 全市场对齐(#08)是因子与回测的前提;魔码量化 Pro 包提供的完整历史数据能让这套处理直接从"手搓"变"开箱"。详见文末。


免责声明:本文所有示例数据仅用于接口演示,不构成任何投资建议;市场有风险,投资需谨慎。

系列持续更新中。 想要亲手跑通上面的代码?前往 魔码证书申请页 免费领取你的专属证书,复制即用、按次计费、稳定可用。

想亲自试一下?免费获取证书
客服微信
客服微信二维码