3. 案例2
行业轮动策略的选股与打分几乎完全依赖“某只股票属于哪个行业”这一基础标签。问题在于,行业分类并不是一张静态表:交易所与指数公司会定期调整行业归属,上市公司自身也会因主业转型、并购重组、剥离资产而改变行业。如果回测时直接用“今天的行业分类”去回溯“五年前的历史行情”,就等于让策略提前知道了未来才会发生的分类结果,这是一种典型的前视偏差(look-ahead bias),它不会报错,却会系统性地抬高回测收益。
举个具体例子。假设某只股票在2019年被归入“传统化工”,2021年因切入锂电材料被调入“电力设备与新能源”。2020—2021年新能源板块大幅上涨,若用当前分类回溯,这只股票在2020年的收益会被计入新能源行业,行业动量因子因此“提前”捕捉到了它,回测曲线会显得异常漂亮。但真实交易中,2020年的投资者看到的它仍是化工股,策略根本不会把它当作新能源标的买入。偏差的来源不是数据错误,而是时点错配:用T日的分类去解释t日(t < T)的收益。
偏差是如何被放大的
行业分类变更引发的偏差,通常通过三条路径放大。第一是行业收益序列被污染:变更股票的历史收益被错误地归入新行业,导致新行业的历史收益虚高、旧行业虚低,行业动量排序失真。第二是成分股集合漂移:回测在t日选出的“行业龙头”其实是事后才知道会归入该行业的股票,选股池本身就带有未来信息。第三是换手率与交易成本被低估:真实调仓时分类变更会触发成分调整,而错误回测往往平滑掉了这部分换手。
识别这类偏差有一个简单有效的自检方法:把回测中每个调仓日的行业成分股列表导出,与当时可获得的分类快照逐一比对。如果发现某只股票在t日的成分列表里,但其分类生效日期晚于t日,就说明存在时点错配。另一个信号是:当把回测起点向前推移、而收益曲线形态几乎不变时,要警惕分类表可能是“全历史统一版本”。
核心处理思路:构建时点行业分类映射表
正确的做法是建立一张带生效区间的行业归属映射表,让每一次查询都只能看到“在查询日已经生效”的分类。表的核心字段包括:证券代码、行业分类体系(如申万、中信、GICS)、行业代码、生效日期、失效日期、变更原因。查询逻辑遵循“生效日期 ≤ 查询日 < 失效日期”的半开区间规则,这样同一只股票在不同时点可以返回不同行业,且不会出现区间重叠或空档。
-- 时点行业分类映射表(示例结构)
CREATE TABLE industry_map (
sec_code VARCHAR(10), -- 证券代码
std_system VARCHAR(20), -- 分类体系:SW2021 / CITIC / GICS
industry_code VARCHAR(20), -- 行业代码
effective_dt DATE, -- 生效日期(含)
expire_dt DATE, -- 失效日期(不含),当前有效填 9999-12-31
change_rsn VARCHAR(50) -- 变更原因:主业转型/并购/指数调整
);
-- 时点查询:取查询日当天有效的行业归属
SELECT sec_code, industry_code
FROM industry_map
WHERE std_system = 'SW2021'
AND effective_dt <= '2020-06-30'
AND expire_dt > '2020-06-30';
建表的关键难点在数据来源。历史分类快照往往难以完整获取,实践中可采用“当前分类表 + 变更事件回溯”的方式重建:以当前分类为基准,向前追溯每一次已知的行业调整公告或指数成分调整记录,逐条插入历史区间。对于无法确证生效日期的变更,应保守处理——宁可让旧分类多延续一段时间,也不要把新分类提前,因为提前正是前视偏差的方向。
回测引擎中的落地方式
映射表建好后,回测引擎的每个调仓日都必须以“当日快照”的方式取数,而不是在回测开始时一次性加载全量分类。具体做法是:在调仓日t,先按上述半开区间条件查出当日有效的(证券, 行业)映射,再与t日行情表关联,生成当日的行业成分。这样即使同一只股票在回测区间内换过三次行业,每个调仓日拿到的都是当时真实可见的标签。
还需要处理两个边界情况。其一是新股与退市股:新股在上市前不应出现在任何行业成分中,映射表的生效日期应不早于上市日;退市股在退市后应失效,避免“僵尸成分”污染行业收益。其二是分类体系切换:若回测区间跨越申万2014版到2021版,不能把两套代码混用,应选定一套体系并建立新旧代码的对照转换,或在映射表中保留体系字段、查询时固定体系。
验证与结果判读
修正后如何确认偏差已被消除?可以从三个角度观察。第一,对比修正前后的行业动量因子IC与分组收益:若修正后IC明显下降、多空组合收益收敛,说明原回测确实吃到了分类变更带来的未来信息。第二,检查调仓日成分列表与历史快照的一致性,抽样若干变更股票,确认其在变更生效日之前始终归入旧行业。第三,观察换手率变化:时点映射会带来更真实的成分调整,换手率通常上升,若修正后换手率反而下降,需排查是否映射表区间写错导致成分被冻结。
需要强调的是,时点映射表并不能消除所有行业相关偏差,它解决的是“分类时点错配”这一类问题。对于分类体系本身的历史不可得、变更生效日期记录缺失等情况,应在回测报告中明确披露数据假设与保守处理原则,而不是用一张看似完整的表掩盖不确定性。把映射表当作回测基础设施的一部分来维护,每次分类调整都同步更新区间,才能让行业轮动策略的回测结论经得起实盘检验。