幸存者偏差:消失的股票不会开口说话
我的掌握程度:
先掌握这个答案
幸存者偏差=样本只包含「活到现在」的个体,死去的(退市股、清盘基金)被系统性遗漏。后果:回测股票池只含赢家→平均收益被高估(尤其小盘/垃圾股策略:退市的-90%样本消失了,留下的都是幸存妖股)。免费数据源默认给「当前上市列表」→历史回测天然有幸存者偏差。防御:用历史时点的成分/上市状态快照(PIT股票池);至少做敏感性对比(含/不含已退市股)。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
背景 · 从一个困惑说起
瓦尔德看穿:返航轰炸机的弹孔分布是「幸存者」的数据——引擎中弹的飞机没能回来。金融数据的默认形态同样是幸存者:今天拉一份「当前上市股票列表」,里面全是从过去活到今天的赢家。
由此产生的问题
幸存者偏差如何让回测收益虚高?免费数据的幸存者问题有多严重?怎么系统性防御?
核心概念
幸存者偏差=样本只包含「活到现在」的个体,死去的(退市股、清盘基金)被系统性遗漏。后果:回测股票池只含赢家→平均收益被高估(尤其小盘/垃圾股策略:退市的-90%样本消失了,留下的都是幸存妖股)。免费数据源默认给「当前上市列表」→历史回测天然有幸存者偏差。防御:用历史时点的成分/上市状态快照(PIT股票池);至少做敏感性对比(含/不含已退市股)。
为什么需要它
①规模惊人:A股退市股30年累计数百家,早年ST策略的「真实收益」比免费数据回测低一大截;②与制度变迁共振:注册制后退市加速,2019年后该偏差愈发严重;③认知升级:这不是技术细节,是「样本从哪来」的统计学根本问题——瓦尔德问题的金融版。
实际应用场景
正确股票池构建:t日的池=t日实际上市且非ST非停牌的股票集合(需要退市股历史数据+状态表);tushare的stock_basic含退市股(status字段);指数历史成分接口(index_weight_all)。
与之前知识的联系
q-045的退市知识在此上升为数据纪律。它与前视偏差(q-063)、成本乐观(q-056)并列回测三大自欺——阶段6的「回测可信度检查清单」三位主角到齐。
⚠ 常见误解
- 退市股很少影响不大:A股30年退市几百家,且集中在小盘高波风格——正是量化策略偏好的区域
- 用中证500等指数成分就免疫了:指数成分有调入调出,「今天的成分」回测历史仍是幸存者口径,需用历史成分
- 加个退市股数据就完事:还要时点状态(当时是否ST/停牌)——PIT思想在股票池维度的应用
🛠 本题实践任务
查一下A股历史退市公司总数(证监会/交易所数据或新闻)。思考:如果回测区间是2015-2024、策略偏好小盘,漏掉这些股票对回测收益的影响方向是什么?
💡 提示(先自己想5分钟再看)
历年退市数量2019年后显著增加(注册制+退市新规);方向=系统性高估。
✅ 验收标准
一个退市总数数字+方向判断+一句话:你的数据供应商是否包含退市股?(查tushare stock_basic的status或数据源文档)
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(退市、ST),再用案例、公式和代码帮助理解。此功能需要先启用服务。