综合

用今天的沪深300成分股回测十年前,结果为什么可能被高估

作者: TickDB Research · 发布: 2026/6/9 · 阅读: 8

标签: W23-Q02, 知乎 A003

摘要

用当前成分股名单回测历史,等于把今天才知道的研究对象集合交给了过去的决策者——这会遗漏历史退出的样本,同时提前纳入后来才成为成分股的证券。结果可能被高估或扭曲,取决于策略和样本。正确的做法是构建point-in-time股票池,用三日期契约约束每一次选股决策。本文给出一套最小表结构和一张回测前检查卡。


以下是假设场景。

你下载了最新一份沪深300成分股名单,用它回测2015到2025这十年。结果很好。

但这份名单是今天的。2015年的时候,名单里的一些公司还没上市,一些后来被调出的公司已经不在名单里,退市的更是消失得干干净净。你的回测用的名单会遗漏历史退出、退市或被替换的样本,同时提前纳入后来才成为成分股的证券。结果可能被高估或扭曲——但方向和幅度取决于你的策略和样本。

用今天的成分股回测过去,真正的问题不是少了几只股票,而是把今天才知道的研究对象集合交给了过去的决策者。当前成分名单不是历史成分名单。

这不一定是策略厉害。也可能是样本池在替策略加分。


三件事,不要搞混

涉及指数成分的回测,有三件看起来相似但本质不同的事。

第一,官方指数已发布的历史序列。 中证指数公司每天计算沪深300收盘点位,这个序列是真实可查的,反映指数编制规则下成分股按规则调整后的历史表现。

第二,使用历史时点成分构建的策略回测。 你的策略在每个决策时点,只能用当时实际生效的成分股名单来选股。

第三,用今天的成分名单倒灌过去。 这是把2025年的名单假设为2015年就存在,用穿越了时间的信息做回测。

三种做法可以用三张合照来理解。今天的合照是你刚下载的最新成分股名单,上面的公司都经历了层层筛选活到现在。当年的合照是某个历史时点实际生效的名单,里面有些公司今天可能已经退市了。当时能看到的合照还要考虑信息可得性——调整公告发布后、正式生效前,你知道的成员和实际生效的成员之间有一个窗口。

三张合照帮你理解问题出在哪。真正落地,需要把合照翻译成数据契约。


两个偏差,不是同一个东西

用当前名单回测过去,会引入两种问题。它们来自不同机制,修正方法也不同。

生存者偏差是指样本里只留下了存活下来的公司。退市、被调出、被合并的公司消失在回测视野里。如果这些退出样本的表现系统性差于存活样本,回测结果可能偏高。但偏差的方向和幅度取决于退出原因和策略逻辑——并非所有被调出的公司都表现不佳。

Brown et al. 1992年在《Review of Financial Studies》发表了"Survivorship Bias in Performance Studies"(DOI: 10.1093/rfs/5.4.553),系统论述了生存者偏差对绩效研究的影响。CRSP在构建Survivor-Bias-Free US Mutual Funds数据库时,核心原则就是保留已终止和退出的样本。Brown等人的论文与CRSP数据库共同说明:绩效研究应保留退出样本。二者均基于基金数据,不能直接量化A股个股策略的偏差幅度。

前视偏差是决策使用了当时尚未公开的信息。一份成分调整公告如果3月1日发布、3月15日生效,公告发布后调整信息已经可知;但新成员在生效日前仍不是有效成分股。提前把它纳入有效成分池属于成员资格时间错配——这是股票池规则实现错误,不是前视偏差。若回测在公告日前便使用该调整结果,才构成前视偏差。

两者的关系: 生存者偏差让你选错了样本池——样本里只剩下存活者,如果退出样本表现系统性地差于存活样本,回测结果可能偏高。成员资格时间错配让你把未生效的成员提前纳入有效成分池。当前名单倒灌历史使用了历史时点未知的未来成员集合;若同时遗漏退市、调出等历史样本,还会叠加生存者偏差。

修正生存者偏差需要保留所有历史成分股,包括退出的;修正成员资格错配需要区分公告日和生效日。

适用边界:问题的严重程度取决于回测的时间跨度和样本调整频率。跨度越长、调整越频繁,偏差累积可能越明显。对于短期、样本稳定的回测,影响可能有限。


指数成分不是一成不变的

中证指数有限公司《沪深300指数编制方案》明确,指数样本定期审核调整,依据过去一年的日均总市值和日均成交金额等指标筛选,调整有明确的生效日期和公告安排。深交所于2006年3月24日发布了《关于调整和补充沪深300指数规则的公告》。任何一个时点的沪深300成分股名单,都是当时那个时间窗口内符合条件的公司。窗口过了,名单就变了。

S&P DJI在《Index Mathematics Methodology》中也指出,专业的历史指数分析通常使用成分分层数据,并对回测中的hindsight、survivor和look-ahead偏差提出边界提醒。注意,S&P方法是针对其自身指数的通用说明,不能等同于中证规则。

适用边界:不同指数的调整规则、频率和信息披露节奏不同。本文讨论的原则适用于定期审核调整的成分指数,对固定池或极少调整的指数影响较小。


三日期契约:把合照翻译成数据

把"回到过去做决策"落成数据能执行的契约,每只股票在某个股票池中的成员资格,需要三个日期来定义。

  • announced_at:调整信息何时公开
  • effective_from:成员资格何时生效
  • effective_to:成员资格何时结束

成员有效区间采用 [effective_from, effective_to)。

三者合在一起,回答了一个问题:在历史上的任意一天,当时可知且按规则生效的成员集合是什么。注意:成员资格不代表证券一定可交易——停牌、上市状态等需单独处理。

策略在每次选股决策时,成员需同时满足两个条件:

  • 信息可得条件:announced_at ≤ decision_time
  • 成员有效条件:effective_from ≤ decision_time < effective_to

不会有来自未来的公司提前出现在候选池里。

适用边界:三日期契约假设公告和生效日期数据完整可得。对于历史久远、公告记录缺失的指数,某些日期可能需要合理推算,此时应标注推算方法和不确定性。


Point-in-Time 股票池的最小表结构

把这个契约落成数据表,至少需要这些字段:

字段含义示例
symbol证券代码000001.SZ
universe_id股票池标识CSI300
announced_at调整公告日期2015-06-01
effective_from成员资格生效日期2015-06-15
effective_to成员资格结束日期2015-12-11
source_version数据来源版本csindex_20250608_v1

这不是声称任何行情API已经提供这些字段。它是一个数据契约示意——如果你要自己建一份可用于回测的历史股票池,这是最小信息集。QuantConnect研究文档指出,应使用动态资产池和point-in-time数据,避免将当前成分直接倒灌到历史回测中。

行情价格数据不能替代历史股票池和证券身份数据。 价格数据告诉你在某个时点花多少钱能买卖一只股票;股票池数据告诉你那个时点到底有哪些股票可以选。两者是不同维度的信息。


回测前检查卡

在做涉及指数成分或股票池的回测之前,用这张卡检查你的数据。

检查项通过标准
股票池是否按历史日期变化?每个决策时点使用当时生效的成员名单,不是从头到尾同一份
是否保留已退出、退市和合并的样本?退出样本保留在历史记录中,退出时点的持仓处理有明确规定
入选信息在决策时点是否已公开?公告日早于或等于决策日,信息真正可得
证券代码变更是否可追踪?同一公司的历史代码变化可追溯,换代码不等于退市
退出时如何停止交易和处理持仓?样本退出时的交易停止规则和持仓处理逻辑已定义
是否区分官方指数历史与自建策略回测?官方指数收益率作为参照基准单独计算,不与策略收益率混淆

一个行情API的例子

以上讨论的股票池治理,前提是行情数据本身可靠。以TickDB为例,它提供结构化的行情查询接口。开发者可将TickDB行情数据与外部历史成分、证券身份数据结合,自行构建point-in-time回测数据集。本文不主张TickDB提供历史成分或PIT表结构。


本文仅讨论回测样本与数据治理,不构成投资建议。


参考来源

  • 中证指数有限公司,《沪深300指数编制方案》
  • 深交所,《关于调整和补充沪深300指数规则的公告》,2006-03-24
  • S&P DJI,《Index Mathematics Methodology》
  • QuantConnect,Survivorship Bias研究文档
  • Brown et al. 1992,"Survivorship Bias in Performance Studies",Review of Financial Studies,DOI: 10.1093/rfs/5.4.553
  • CRSP,Survivor-Bias-Free US Mutual Funds Database
  • TickDB API文档

通过 TickDB API 获取实时行情数据

一个 API 接入外汇、加密货币、美股、港股、A股、贵金属和全球指数的实时行情。支持 WebSocket 低延迟推送,免费开始使用。

免费领取 API Key查看 API 文档

相关文章