指数成分股:历史成分 vs 当前成分的偏差
我的掌握程度:
先掌握这个答案
历史成分=每个时点指数真实的成分列表(每半年调整)。当前成分回测历史的偏差:①已调出的衰败股被漏掉(幸存者偏差);②调入的"后来赢家"被提前纳入(后视偏差)。获取:tushare的index_weight_all/index_weight(逐月权重快照)、中证指数官网。调入效应:调入股在生效日常伴上涨(被动资金买入)、调出下跌——本身是一个事件因子。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
做中证500增强回测——用今天查到的成分股列表跑过去五年——但中证500每半年调整成分(调入好的、调出差的)——今天的列表全是"经过优胜劣汰的赢家"——用它回测历史=用未来的选择偏差美化过去。
由此产生的问题
历史成分为什么必须用(幸存者偏差的指数版)?从哪获取历史成分数据?调入调出效应?
核心概念
历史成分=每个时点指数真实的成分列表(每半年调整)。当前成分回测历史的偏差:①已调出的衰败股被漏掉(幸存者偏差);②调入的"后来赢家"被提前纳入(后视偏差)。获取:tushare的index_weight_all/index_weight(逐月权重快照)、中证指数官网。调入效应:调入股在生效日常伴上涨(被动资金买入)、调出下跌——本身是一个事件因子。
为什么需要它
①指数增强的第一大坑:不加历史成分的指增回测普遍虚高2-5个点/年;②与幸存者偏差(q-067)的分工:q-067管个股(退市遗漏)、本题管成分(调入调出)——两者都是「时变集合」问题;③实证数据校验价值:取一个历史日期的成分与当前成分对比——差多少只?那个差异=偏差的量级。
实际应用场景
回测配置:pools = index_weight.loc[date].index——每日动态取成分(与q-514时点股票池配合)。
与之前知识的联系
q-067(幸存者偏差)的指数版;q-514(时点股票池)的数据来源;q-515(历史成分回测)的深化。
⚠ 常见误解
- 成分变化不大用当前就行:中证500十年换血超50%——「不大」是直觉错误
- 历史成分可以从当前倒推:调入调出公告可查但倒推成本高于直接取快照——用数据商的历史权重接口最省事
- 调入的股票历史收益高=选股能力:是被动指数资金买入效应——不是你的能力
- 历史权重和历史成分一样:权重是每个成分的占比(市值加权)——成分是成员名单;指增需要两者
🛠 本题实践任务
查中证500最近一次调整的调入名单(10只)——统计调入股生效日前后各5日的平均超额——观察到调入效应吗?同时解释为什么用当前成分回测会高估。
💡 提示(先自己想5分钟再看)
调入名单在中证指数官网/新闻可查;"高估"的本质=你提前持有了后来才调入的股票。
✅ 验收标准
调入效应数据+一句偏差机制解释。你的回测从源头干净了一层。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(财务对齐、幸存者偏差),再用案例、公式和代码帮助理解。此功能需要先启用服务。