3. 成交额数据预处理
在验证“多板块成交额跷跷板效应”之前,我们必须先回答一个更基础的问题:手里的成交额数据能不能直接用来做相关性分析?答案通常是否定的。真实行情数据里混杂着停牌、节假日、新股上市、指数成分调整、单位不一致等问题,如果直接把这些原始序列丢进相关系数或轮动强度的计算里,得到的结论很可能来自数据缺陷而非市场规律。本节的任务,就是把原始的多板块日度成交额整理成一张“规整面板”:行是交易日,列是板块,单元格是当日该板块的成交额,且缺失、异常、停牌、节假日都被一致地处理过。
一、先明确面板的“规整”标准
所谓规整面板,需要同时满足四个条件。第一,时间轴统一:所有板块共用同一套交易日索引,不能出现某板块有 2024-03-15 而另一板块没有的情况。第二,缺失可解释:每个空值都能说明是停牌、未上市、数据源缺失还是节假日,而不是“不知道为什么是空的”。第三,量纲一致:所有板块的成交额单位统一为“亿元”或“万元”,不能混用。第四,异常可追溯:被修正或剔除的极端值有记录,便于复核。只有满足这四点,后续的滚动相关、跷跷板强度指标才有可比性。
这里先约定一个贯穿全课程的方向约定:本课程中“跷跷板效应”指两个板块成交额反向变动,即一个放大、另一个萎缩,相关系数为负代表跷跷板明显,为正代表同向共振。这个符号约定在数据预处理阶段就要固定下来,避免后面解读时反复切换参照系。
二、交易日历对齐:节假日与停牌的第一道关
最容易被忽视的一步是交易日历对齐。不同数据源给出的日期序列可能包含周末、法定节假日,甚至因为调休出现“周末开市”的特殊情况。正确做法是以交易所官方交易日历为基准,生成一个主索引,再把各板块数据按日期左连接到这个索引上。这样做的结果是:节假日不会产生“假缺失”,真正的停牌才会留下空值。
举个教学示例(以下数据为合理假设,非实测):假设主索引为 2024 年 3 月的 21 个交易日,某板块因重大事项停牌 3 天,那么对齐后该板块应有 3 个空值,而不是 0 个。如果直接对原始序列做 dropna(),这 3 天会被整行删除,导致其他板块也损失 3 天数据,样本量被无谓压缩。因此对齐顺序应当是:先建主索引,再左连接,最后才决定如何填补。
import pandas as pd
# 主索引:交易所交易日历
trade_days = pd.to_datetime(exchange_calendar) # 示例:2024-03-01 至 2024-03-29 的交易日
panel = pd.DataFrame(index=trade_days)
# 各板块原始成交额按日期左连接
for sector, df in raw_sector_data.items():
df = df.set_index("date")["amount"]
panel[sector] = df.reindex(trade_days) # 缺失保留为 NaN,便于后续分类处理
三、缺失值分类处理:停牌、未上市与数据源缺口
对齐之后出现的空值不能一刀切。停牌造成的缺失,成交额本质上是“没有发生”,用 0 填充是合理的,因为当天该板块确实没有成交;但若用前值填充,会人为制造“仍有成交”的假象,污染后续的成交额占比计算。未上市或指数发布前的缺失,应当保留为 NaN 并在样本起点上截断,而不是填 0,否则会把“不存在”误读为“成交为零”。数据源缺口(如某天接口漏抓)则属于质量问题,应优先回补,回补不了再考虑用前后均值或标记为缺失。
实践中可以给每个单元格打一个状态标签,例如 normal / suspended / not_listed / source_gap,再按标签分别处理。这样面板里既有数值,也有“为什么是这个数值”的解释,后续排障会轻松很多。
四、异常值识别:成交额数据的特殊性
成交额的异常值有两类。一类是真实的极端行情,比如政策利好当天某板块成交额放大到平时的 5 倍,这类值应当保留,因为它正是跷跷板效应研究的对象。另一类是数据错误,比如单位从“万元”错写成“元”导致数值放大一万倍,或者接口重复推送导致某天数值翻倍。区分二者的关键是看量级突变是否伴随价格和成交量的同步变化:真实放量通常伴随换手率上升,而单位错误往往只影响单一字段。
一个可操作的检查方法是计算每个板块成交额的日环比 r_t = amount_t / amount_{t-1} - 1,对 |r_t| 超过阈值(示例取 300%)的点逐一核查。若同一日期多个板块同时出现同比例跳变,多半是单位或口径问题;若只有单板块跳变且价格同步异动,则倾向保留。下面的 SVG 展示了从原始数据到规整面板的完整处理链路,以及每个环节的输入、判断与输出。
五、单位统一与口径核对
不同板块的数据可能来自不同接口,单位有的是“亿元”,有的是“万元”,还有的是“手”或“股”。在合并前必须统一到同一量纲,建议统一为“亿元”并保留两位小数。口径上还要注意:有的数据是“成交额”,有的是“成交金额”含大宗交易,有的只统计连续竞价。若各板块口径不一致,跷跷板效应的强度会被系统性扭曲。一个简单的核对办法是抽查某一天,把各板块成交额加总,与全市场成交额对比,偏差超过 5% 就要回头查口径。
六、面板成型后的自检清单
处理完成后,建议做一次快速自检,确认面板可以直接进入分析。检查项包括:索引是否为交易日且无重复;各列缺失率是否在合理范围(例如停牌板块缺失率偏高属正常);是否存在全 0 列(可能是数据源整段缺失);单位是否统一;异常值修正是否有记录。下面的表格给出一个可直接套用的自检示例,数值为教学假设。
| 检查项 | 示例结果 | 判断 |
|---|---|---|
| 交易日索引唯一性 | 21 个交易日,无重复 | 通过 |
| 各板块缺失率 | 银行 0%,某停牌板块 14% | 停牌板块需标注 |
| 全 0 列检查 | 无 | 通过 |
| 单位一致性 | 全部为亿元 | 通过 |
| 异常值修正记录 | 修正 2 处单位错误 | 已留痕 |
完成以上步骤后,我们得到的就不再是一堆零散的行情导出文件,而是一张时间对齐、缺失可解释、量纲统一、异常可追溯的板块成交额面板。它是后续计算滚动相关系数、构建跷跷板强度指标的唯一数据基础,也是整门课程结论可靠性的第一道保障。