复权因子:数据表里最不起眼却最致命的列
我的掌握程度:
先掌握这个答案
复权因子(adj factor):每次除权除息时跳变的乘数,历史累乘形成序列。用法:后复权价=原始价×因子;前复权价=原始价×因子/最新因子。存储方案的优势:①原始价保留真实交易价格(撮合、涨跌停判断必须用原始价!);②因子列轻量,口径随时可切换;③数据源更新分红时只需追加因子,不用重算全表。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
收益口径和撮合价格分开
保留原始价、企业行动和复权因子,用一致口径计算收益;模拟成交、涨跌停与订单价格应使用当时真实报价。前后复权在相同调整方法下只差归一化常数时,区间收益一致;并非所有数据商都保证该条件。
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
背景 · 从一个困惑说起
q-014学会了前复权/后复权的概念,但工程实践里,成熟的数据管道不直接存「复权价」,而是存「原始价+复权因子」——需要哪种口径时现场计算。
由此产生的问题
复权因子怎么用?为什么「原始价+因子」的存储方案优于直接存复权价?因子在回测里怎么实时应用?
核心概念
复权因子(adj factor):每次除权除息时跳变的乘数,历史累乘形成序列。用法:后复权价=原始价×因子;前复权价=原始价×因子/最新因子。存储方案的优势:①原始价保留真实交易价格(撮合、涨跌停判断必须用原始价!);②因子列轻量,口径随时可切换;③数据源更新分红时只需追加因子,不用重算全表。
为什么需要它
①涨跌停判断的正确性:±10%的限制基于原始价,用前复权价判断涨跌停会算错(历史复权价缩小后,10%区间对应不同数值)——这是复用别人回测代码的高频bug;②成本计算:佣金印花税按真实成交金额(原始价)计算;③可复现性:因子快照固定后,任何人重算结果一致。
实际应用场景
标准数据表结构:date, code, open/high/low/close(原始), volume, amount, adj_factor;研究用列在内存中现算:df['close_hfq']=df['close']*df['adj_factor']。
与之前知识的联系
q-014概念的工程化。它与q-043涨跌停判断、q-053成本计算在数据层汇合——「一套原始数据+多种口径现场生成」是量化数据管理的职业习惯。
⚠ 常见误解
- 直接存前复权价最省事:涨跌停判断、成本计算全要用原始价,双套口径迟早打架
- 复权因子是整数或小数都正常:不同数据源的因子基准不同(有的从1开始,有的历史为1),使用前看清定义
- 因子只用在不复权数据上:成交额不需要复权(真实金额),成交量送股后口径变化才需注意
🛠 本题实践任务
下载一只近期分红的股票,找到除息日:对比当日原始价跌幅与复权价收益。验证「原始价假跌、复权价真涨跌」。
💡 提示(先自己想5分钟再看)
q-013的练习数据可直接复用;akshare的adjust=''给原始价,adjust='hfq'给后复权价,对比同一天。
✅ 验收标准
除息日的两个收益数字(原始口径vs复权口径)+一句话说明哪个才反映真实投资结果。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(复权),再用案例、公式和代码帮助理解。此功能需要先启用服务。