2. 行业轮动数据准备

行业轮动策略的收益差异,往往在数据准备阶段就已经埋下伏笔。同一个轮动逻辑,用不同的行业指数口径、不同的对齐方式、不同的缺失值处理,回测结果可能相差数个百分点。本节的任务不是讨论轮动信号本身,而是把"行业指数行情 + 财务数据 + 宏观数据"这三类异构数据,整理成一张时间×行业、可直接送入回测引擎的行业面板数据集。这张面板的质量,决定了后续所有择时与持有期比较的可信度。

一、明确三类数据的角色与口径

行业轮动回测通常需要三类输入,它们的时间频率、更新节奏和结构完全不同:

  • 行业指数行情:日频的收盘价、成交额,是计算动量、波动率、换手等轮动因子的基础。关键是选定一套行业分类标准(如申万一级、中信一级),并保证全样本期内分类口径一致。若中途发生行业调整或成分变更,需要记录变更日期,避免"用今天的行业划分回看历史"造成前视偏差。
  • 财务数据:季频的营收增速、ROE、净利润等,用于行业景气度或质量因子。财务数据最大的陷阱是披露时点——报告期结束日不等于数据可用日。例如一季报报告期为3月31日,但实际披露可能到4月底,回测中必须按公告日而非报告期对齐,否则会用到当时尚不存在的信息。
  • 宏观数据:月频的PMI、CPI、社融、利率等,用于判断宏观状态或作为择时条件。宏观数据同样存在发布滞后,且不同指标滞后天数不同,需要逐项确认。

三类数据的频率分别是日、季、月,直接合并会产生大量空值。因此数据准备的核心工作可以概括为:统一口径 → 按可用时点对齐 → 合理填充 → 形成规整面板。

二、数据清洗与对齐的关键操作

第一步是交易日历对齐。以交易日历为主索引,将各行业指数行情按日期左连接,非交易日不产生记录。若某行业在早期尚未成立(如某些细分行业指数2010年后才有),该段应保留为空而非填零,并在回测中标记为"不可选"。

第二步是财务数据的时点对齐。推荐做法是构造"可用日期"字段:以公告日为准,将每条财务记录映射到公告日之后的第一个交易日,再向前填充(forward fill)到下一次公告前。这样在任意交易日,取到的都是当时市场上真实可见的最新财报。示例逻辑如下:

# 示例:财务数据按公告日对齐到交易日(示意参数,非实测)
fin["avail_date"] = fin["announce_date"].map(
    lambda d: next_trading_day(d))
panel = trade_cal.merge(fin, left_on="date",
    right_on="avail_date", how="left")
panel["roe"] = panel.groupby("industry")["roe"].ffill()

第三步是缺失值处理,需要分类型对待,不能一刀切:

  • 行情缺失:多为停牌或数据源缺口。短缺口(1~3日)可用前值填充;长缺口应标记并剔除该行业当期,避免用陈旧价格计算动量。
  • 财务缺失:若因未披露而缺失,向前填充是合理的;若因行业本身无该指标,应保留空值并在因子计算时跳过,不要用行业均值硬填,否则会稀释行业间差异。
  • 宏观缺失:发布频率固定,通常按"发布日+前值填充"处理;季频转月频时可用插值,但需注意插值只用于展示,回测中仍应使用实际发布值。
常见错误:用报告期直接对齐财务数据、用0填充停牌期收益、对宏观数据做未来插值。这三类操作都会在回测中引入前视偏差或虚假收益,是最需要警惕的问题。

三、面板结构与时点对齐示意

下图展示三类原始数据如何按"可用时点"汇入同一张行业面板,以及缺失值在不同情形下的处理分支。注意图中财务与宏观数据都是先确定"何时可见",再进入面板,而不是按报告期直接拼接。

行业面板数据集的时点对齐与缺失处理 行业指数行情 日频 · 收盘价/成交额 按交易日历索引 财务数据 季频 · ROE/营收增速 报告期 ≠ 可用日 宏观数据 月频 · PMI/CPI/社融 发布滞后需确认 交易日历对齐 左连接 · 保留空值 公告日 → 可用日 映射到下一交易日 再向前填充 发布日对齐 按实际发布日 前值填充至下次发布 缺失值分类处理 行情短缺口 → 前值填充 行情长缺口 → 标记剔除 财务未披露 → 向前填充 财务无指标 → 保留空值 宏观未发布 → 前值填充 季转月 → 仅展示插值 禁止:0填充 / 未来插值 行业面板数据集 行:交易日 列:行业 × 指标 含可用标记 可直接回测 面板字段示例(示意) date | industry | close | ret | roe | rev_growth | pmi | cpi | avail_flag avail_flag:1=数据完整可用,0=当期不可选(停牌/未成立/未披露) 回测时先按 avail_flag 过滤可选行业,再计算轮动因子,避免用陈旧或缺失数据打分

四、形成可回测面板的验收标准

数据准备完成后,不能直接进入回测,应先做几项基本检查,确认面板"干净":

  1. 索引完整性:面板行数应等于交易日数,每个交易日每个行业恰好一行,无重复、无错位。
  2. 时点正确性:随机抽取若干交易日,核对财务与宏观字段是否等于该日之前最近一次已发布的值,而不是未来值。
  3. 缺失率统计:按行业、按年份统计各字段缺失比例。若某行业早期缺失率超过阈值(如30%),应在回测中设置该行业"上市满N个月才可选"的规则。
  4. 极值检查:对收益率、增速类字段做分位数检查,识别数据源错误导致的异常跳变(如价格单位不一致、除权未处理)。
建议在面板中额外保留一列 avail_flag,把"数据是否可用"与"数据值本身"分开表达。这样回测逻辑只需按标记过滤,而不必在因子计算中反复判断空值,既清晰又不易出错。

完成上述步骤后,得到的是一张以交易日为行、以行业和指标为列、带有可用标记的规整面板。它不包含任何轮动信号,却是后续动量、景气、宏观择时等所有因子的共同底座。数据准备做得扎实,后面关于持有期长短、调仓频率的比较才有意义;反之,任何精巧的轮动模型都可能被一个错位对齐的财务字段悄悄毁掉。