4. 数据清洗与预处理实战
板块轮动热力图的质量,八成取决于进入绘图环节之前的数据是否干净。热力图本质上是“板块 × 时间”的二维矩阵,每个单元格对应一个收益率或强度值。只要矩阵中存在缺失、异常、错位或成分口径不一致,颜色就会失真,进而误导轮动判断。本节围绕四类最常见的数据质量问题展开:缺失值、异常值、时间对齐、板块成分变更,并给出可落地的处理方式。
一、先明确数据口径:热力图的“单元格”到底是什么
在动手清洗前,必须先固定三个口径,否则后续处理会互相矛盾。第一是收益口径:单元格通常填日收益率,建议统一用对数收益率 r = ln(P_t / P_{t-1}),便于跨板块、跨时间加总。第二是时间口径:以交易日为行,且必须使用交易日历对齐,不能用自然日。第三是板块口径:每个板块对应一个成分股集合,成分变更会导致同一板块在不同日期的含义不同。口径固定后,清洗才有判断标准。
二、缺失值:先分类,再决定填补还是剔除
缺失值不能一律用 0 填充,因为 0 在收益率语境下表示“无涨跌”,会人为压低波动、扭曲热力图颜色。实际处理时先区分三类缺失:
- 停牌缺失:个股停牌导致当日无成交价。若板块内多数成分正常,可用板块内其余成分的等权或市值加权收益近似替代;若停牌比例过高,该单元格应标记为缺失而非填 0。
- 数据源缺失:接口未返回或字段为空。应优先回补数据源,其次用前后交易日插值,但插值跨度不宜超过 2 个交易日。
- 结构性缺失:板块尚未成立或已退市,属于“本就不该有值”,应保留为空并在热力图中显示为灰色,而不是填补。
一个可执行的判断规则是:单板块单日缺失成分占比低于 20% 时用剩余成分加权补全;20%~50% 时标记为“低置信”并用前一有效值延续;超过 50% 时直接置空。这样既避免 0 值污染,也保留了数据可信度的层次。
三、异常值:区分“真事件”与“脏数据”
异常值处理最忌一刀切。板块单日大涨 8% 可能是真实行情,也可能是成分股除权未复权、代码错配或单位错误。建议采用“统计筛查 + 业务复核”两步法。统计上可用稳健的 MAD 方法:对每个板块的收益率序列计算中位数 med 与绝对中位差 MAD,当 |r - med| > 5 × 1.4826 × MAD 时标记为疑似异常。业务上再核对:是否伴随除权除息、是否为新成分纳入首日、是否为数据单位从“元”误录为“分”。
确认是脏数据的,用缩尾处理(Winsorize)把极端值截断到 1% 与 99% 分位;确认是真实事件的,保留原值但在观察清单中加备注,避免后续复盘时误判为噪声。这一步直接决定热力图中“最红/最绿”的格子是否可信。
四、时间对齐:交易日历是唯一基准
不同板块、不同数据源的时间戳经常不一致:有的按 15:00 收盘记录,有的按自然日 00:00 记录,港股与 A 股节假日也不同。正确做法是先建立统一的交易日历,再对所有序列做左连接或重采样。对日频数据,用 reindex 到交易日历后,缺失日按上一节规则处理;对分钟频数据,先聚合到日频再对齐,避免跨日错位。特别要注意时区:统一转换为交易所本地时间后再取收盘价,否则会出现“今天用了明天的数据”这类前视偏差。
五、板块成分变更:按生效日切换,避免“口径漂移”
板块成分不是静态的。指数调样、行业分类调整、个股并购退市都会改变板块内涵。如果直接用最新成分回溯历史,会产生严重的幸存者偏差。正确做法是维护一张“成分变更表”,字段至少包括板块代码、成分代码、纳入日期、剔除日期。计算某日板块收益时,只取该日有效的成分集合,并按当日权重加权。对于调样日前后,建议在热力图上用细线或标记提示“口径切换点”,方便复盘时区分“真实轮动”与“成分变化带来的跳变”。
六、可执行的清洗检查清单
把上述规则固化成一份可复用的检查清单,每次更新数据后逐项核对,能显著降低返工率:
| 检查项 | 判断标准 | 处理动作 |
|---|---|---|
| 交易日历一致性 | 所有序列日期集合与基准日历一致 | reindex 对齐,缺失日记入缺失台账 |
| 时区与收盘时点 | 统一为交易所本地时间 15:00 收盘 | 转换时区后取收盘价,禁止前视 |
| 成分有效性 | 当日成分均处于纳入区间内 | 按变更表过滤,调样日加标记 |
| 缺失比例 | 单板块单日缺失成分占比 | <20% 加权补全;20%~50% 低置信;>50% 置空 |
| 异常值 | |r − med| > 5 × 1.4826 × MAD | 业务复核后缩尾或保留并备注 |
| 复权处理 | 价格序列已做前复权或后复权 | 统一复权方式,除权日重点核对 |
完成以上四类处理后,得到的“板块 × 交易日”矩阵才具备进入热力图计算的条件。清洗阶段多花的时间,会在后续轮动信号识别和观察清单维护中成倍节省回来。