什么是复权(前复权/后复权)?为什么回测必须用它?
我的掌握程度:
先掌握这个答案
复权 = 用复权因子消除除权除息跳空的价格调整。两种口径:①前复权:以当前价为锚往回修历史(近端价格真实,远端被调整);②后复权:以历史价为锚往后累加(起点真实,远端数字放大)。两者的收益率计算结果一致,只是「显示锚点」不同。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
收益口径和撮合价格分开
保留原始价、企业行动和复权因子,用一致口径计算收益;模拟成交、涨跌停与订单价格应使用当时真实报价。前后复权在相同调整方法下只差归一化常数时,区间收益一致;并非所有数据商都保证该条件。
每一笔收益都要有可执行时间线
打印数据截止时间、信号时间、订单时间、成交时间和持仓收益区间。收盘信号不能乘当天完整收益;次日开盘成交也不能无条件拿到整个close-to-close收益。用原始价格判断可成交性,并纳入停牌与涨跌停。
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
背景 · 从一个困惑说起
知道了除权会造成假跳空(q-013),一个新的问题出现:算贵州茅台2015年至今的收益率,中间经历了十几次分红,每次都有跳空。总不能每次手工修补吧?
由此产生的问题
有没有系统性的方法,把历史上所有除权除息的跳变一次性修补掉,得到一条「连续可比」的价格序列?
核心概念
复权 = 用复权因子消除除权除息跳空的价格调整。两种口径:①前复权:以当前价为锚往回修历史(近端价格真实,远端被调整);②后复权:以历史价为锚往后累加(起点真实,远端数字放大)。两者的收益率计算结果一致,只是「显示锚点」不同。
为什么需要它
①正确性:不复权的历史收益率、波动率、技术指标全部失真;②回测标准:所有回测引擎默认吃复权价;③口径选择:看图用前复权(与当前价衔接),算长期累计收益用后复权(避免前复权在多次分红后历史价趋近于0甚至为负)。
实际应用场景
akshare的adjust参数(qfq=前复权、hfq=后复权);Wind的「复权设置」;量化数据库同时存「原始价+复权因子」,需要真实撮合价格时再还原(阶段4实践)。
与之前知识的联系
q-013解释了跳空的成因,本题给出工程化解法。阶段4写数据管道时会同时保留原始价与复权价两套字段——撮合用原始价、算收益用复权价,这是机构标准做法。
⚠ 常见误解
- 前复权和后复权算出的收益率不同:两者只差一个常数倍,区间收益率完全一致
- 复权价就是真实交易价格:它只是统计口径;真实挂单价格是原始价
- 用前复权存长期数据没问题:多次大额分红会让早年价格被调成极小值甚至负数,长期数据用后复权更稳
🛠 本题实践任务
用akshare下载同一只股票的前复权和后复权日线(ak.stock_zh_a_hist的adjust='qfq'和'hfq'),各计算2020年至今的总收益,验证两者一致。
💡 提示(先自己想5分钟再看)
pip install akshare 后两行代码各拉一次;总收益=(末值/首值−1)。若数值有微小差异,检查是否含最新一次除权。
✅ 验收标准
写出两种口径的总收益数字(应相等或极接近),并说一句话解释为什么看图常用前复权、算长期收益常用后复权。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(除权除息、收益率),再用案例、公式和代码帮助理解。此功能需要先启用服务。