2. 市值风格轮动的数据基础

要识别市值风格轮动,第一步不是画图,也不是算动量,而是把“大市值—中市值—小市值”这三条风格线变成可比较、可回测、可复现的日频数据序列。沪深300、中证500、中证1000分别对应大盘、中盘、小盘的代表性指数,但它们并不是三个互不重叠的“市值桶”:沪深300取规模大、流动性好的300只,中证500剔除沪深300后再取500只,中证1000再剔除前两者后取1000只。理解这一编制逻辑,才能理解为什么三者可以近似看作大、中、小三层,也才能理解成分变更、样本空间调整会如何影响风格信号。

本节的核心任务可以概括为两条数据链:一条是指数日频行情链,包括开高低收、成交量额、复权处理;另一条是成分与权重链,包括成分股名单、权重、生效日期、调入调出记录。两条链最终要按“交易日 × 指数”对齐,形成一张干净的面板数据,供后续计算相对强弱、轮动速度与风格切换信号使用。

市值分层指数数据构建:双链汇聚为统一面板 原始日频行情 开高低收 / 成交量额 / 日期 复权处理 前复权 / 后复权统一口径 停牌与缺失处理 前值填充 / 标记不可交易 交易日历对齐 剔除非交易日 / 统一时区 成分股名单 沪深300 / 中证500 / 中证1000 权重与生效日期 定期调整 / 临时调整记录 调入调出与退市 成分变更事件表 时点快照对齐 按生效日生成每日成分视图 统一面板数据 交易日 × 指数 × 复权价 / 成分权重 输出:风格相对强弱与轮动信号输入

一、指数行情:复权口径必须先定死

指数点位本身是价格指数,不含分红再投资,但成分股层面的价格数据必须处理复权,否则除权除息日会出现虚假跳空,污染动量与波动率计算。实践中建议统一采用后复权价格序列:后复权以历史某日为基准,后续价格随分红送转向上调整,优点是任意两个日期的比值直接对应真实持有收益,不会因为基准日变化而改变历史收益率。若采用前复权,最新价固定,历史价随每次新分红而变动,回测中容易出现“未来数据泄漏”式的口径漂移。因此本节约定:所有个股与指数成分的价格计算统一使用后复权收盘价,指数点位使用官方发布的收盘点位,两者不混用。

停牌处理要区分两种场景。若某成分股在T日停牌,其价格不可得,但指数仍在交易,此时不能简单删除该行,否则会造成成分权重分母变化。推荐做法是:停牌日价格以前一有效收盘价填充,同时增加一个is_tradable标志位记为0,后续计算换手率、成交额占比时排除该样本。退市股票则不同,退市后不再有价格,应在退市生效日将其从当日成分视图中移除,并保留一条退市事件记录,避免回测时“死而复生”。

二、成分数据:按生效日构建时点快照

成分数据最容易出错的地方是“用今天的名单回测历史”。沪深300、中证500、中证1000每年6月和12月定期调整,另有临时调整。正确做法是维护一张成分变更事件表,字段至少包括:指数代码、证券代码、调入/调出、生效日期。然后按交易日展开:对每个交易日,取生效日期不晚于该日的最近一次名单状态,生成当日的成分快照。这样在2015年的回测中,使用的就是2015年当时真实的成分,而不是2024年的名单。

权重数据同理。指数公司通常按月度或调整日公布权重,两次公布之间可用“权重不变、价格变动”的方式近似推算每日权重:某成分当日权重 ≈ 前一日权重 × (1+当日个股后复权收益率) / Σ[前一日权重 × (1+当日个股后复权收益率)]。这一近似在两次调整之间足够使用,但在成分调整生效日必须用新公布的权重重置,否则误差会累积。

三、对齐与校验:让三条风格线可比

完成上述清洗后,把三个指数的日频收盘点位按交易日对齐,形成宽表:行是交易日,列分别是沪深300、中证500、中证1000。对齐时以三者的共同交易日为准,任一指数缺失的交易日整行剔除,保证后续相对强弱计算不会因缺失值产生偏差。随后做三项基础校验:一是检查每个指数序列是否存在超过阈值的单日跳变(例如±11%以上),若有则回溯是否为复权或数据源错误;二是检查成分快照的股票数量是否与指数编制规则一致(300、500、1000);三是检查权重合计是否接近1,偏离过大说明权重推算或调整日重置出了问题。

教学示例:假设以2019-01-02至2024-12-31为样本区间,取三个指数的后复权收盘点位,按共同交易日对齐后得到约1450个交易日。若某指数在某一日缺失,整行剔除后样本量减少,需在报告中注明,避免不同指数样本区间不一致导致相对强弱不可比。

这张干净的面板数据,就是后续识别市值风格轮动的“地基”。只有复权口径统一、成分按生效日还原、缺失与退市处理有明确规则,三条风格线才真正可比,轮动信号才不会建立在错误的数据之上。