回测选股策略时,若股票池用的是「今天仍在上市的名单」倒推十年,你已经在样本里开除了退市、长期停牌失败、被合并消失的名字。成绩单会偏好看——不是因为规则神,而是因为死人不会说话。这就是幸存者偏差在回测里的典型形态:样本池决定结论,比你调 MACD 参数更致命。
它怎样抬高你的曲线
想象 2015 年有一组垃圾股,后来退市。你的策略当年也可能买过它们并亏损;但若回测池里根本没有这些代码,那段亏损从历史上被抹掉了。留下来的,是熬到今天的公司——其中不乏后来变强的。于是:
- – 历史收益率被高估
- – 最大回撤被低估
- – 「选股因子有效」的结论更可疑
指数成分同样有这个问题:用「今日沪深 300 名单」回测十年前,等于让成分股享有未来才确立的身份。严格做法是用当时的成分或当时可交易宇宙。
和个人感觉的偏差是同一类错
生活里的幸存者偏差:你只看到成功创业者上封面,看不到安静失败的大多数。股市里:你只回测还在交易的票,看不到退市路径上的深坑。表现形式不同,逻辑一样——观测样本被结果筛选过了。
反例很具体:若策略偏爱小市值、低价股,幸存者偏差往往更大,因为这类公司退市与长期低迷更常见。你用「现存小票」回测小市值因子,等于在已经筛过一轮的池子里假装公平竞赛。
个人研究里能怎么做(可执行)
完全消除不容易,但可以明显减偏:
- 1. 用点位时间的股票宇宙:每个交易日,池子 = 当时上市且可交易的股票,而不是今日名单倒灌。
- 2. 纳入退市与停牌处理规则:买了之后退市/长期停牌,按你能接受的假设结算(例如按最后可成交价、或按规则计提损失),别当交易凭空消失。
- 3. ST、*ST 状态用当时标记,不要用最终是否戴帽回填。
- 4. 对比实验:同一策略,分别在「现存股票池」与「历史可交易池」跑,看收益和回撤差多少。差值就是你过去被安慰的幅度。
- 5. 报告里写明股票池构建方式——写不清的回测,默认可疑。
数据若暂时只有现存列表,至少做到:结论降级为「在现存样本上的探索」,并避免对外宣称稳健有效;同时优先缩短推断强度,加快补历史宇宙数据。
和未来函数、偷看参数的关系
幸存者偏差偏「样本是谁」;未来函数偏「字段何时可知」;数据窥探偏「你试了多少次」。三者常叠在一起:用现存池 + 收盘偷看 + 全样本调参,曲线可以美到失真。修好仓位与指标之前,先问股票池——底座歪了,上层装修没用。
自查一句就够:2018 年某日我的选股程序,是否可能选到后来退市的票? 若系统回答「不可能」,多半池子有幸存者问题。
停牌很久后复牌的股票,若在池子构建时被「今日可交易」一刀切掉历史路径,也会制造另一种存活幻觉。处理规则要写进说明书。
指数增强或「相对沪深300」类研究,也要用点位成分或可投资宇宙,否则超额收益里可能掺了「未来才进指数」的红利。行业、主题板块回测同理:用今日概念成分倒推五年,等于让后来才被贴标签的公司提前入选。能拿到历史成分最好;拿不到就缩小结论——写成「在当前概念名单的历史行情上复盘」,别写成「该主题因子五年有效」。
把股票池与策略规则一起版本化,以后才知道结论建立在哪种宇宙上。青柠量化 强调可复现回测与本地保存结果,便于你留下「池子怎么建」的记录,而不是只留一条净值。
下载与说明见产品页:
https://www.zpyztech.com/product/qingquant/
免责声明: 本文仅作量化研究方法科普,不构成任何投资建议。历史回测不代表未来表现,请独立判断并自行承担投资风险。
读到这里,不如自己验证一次
文章里的逻辑,你可以在青柠量化里用真实数据重新跑一遍。免费,零代码。