4. 数据准备与清洗实战
RRG(相对旋转图)的结论是否可信,八成取决于数据准备阶段。RRG本质上是在比较“板块指数”与“基准指数”的相对强弱及其动量变化,任何一处日期错位、缺失或异常值,都会在RS-Ratio与RS-Momentum坐标上被放大成虚假的转向信号。本节以A股申万一级行业指数与沪深300基准为例,完整走一遍从获取日线数据到生成标准化数据集的流程。文中出现的具体数值均为教学示例,用于说明处理逻辑,不代表真实行情。
一、明确数据对象与字段口径
RRG计算需要的最小数据集是“日期 + 收盘价”,并按标的横向展开。建议直接以宽表形式组织:第一列为交易日,其余每列为一个板块指数或基准指数的收盘价。字段口径必须统一:全部使用收盘价(不复权指数无需复权处理,若使用个股或含分红再投资的指数则需明确复权方式),全部使用同一交易日历,全部为数值型而非带千分位逗号的字符串。基准指数只保留一个,例如沪深300,作为所有板块的相对强弱分母。
获取渠道上,常见做法是通过行情软件导出CSV,或使用数据接口批量拉取。无论哪种方式,导出后第一件事是检查列名与日期格式是否一致。示例中某板块导出文件首行为 日期,收盘价,而另一文件为 trade_date,close,这类差异必须在合并前统一。
二、数据对齐:以交易日历为骨架
不同板块指数的停牌、新发布、节假日安排可能导致日期序列不完全一致。正确做法是先确定一个“主交易日历”——通常取基准指数的全部交易日,再用左连接把各板块收盘价挂上去。这样得到的宽表行数等于基准交易日数,列数等于板块数加基准一列。切忌直接用 concat 按行拼接,否则会出现同一日期多行、不同日期错位的混乱结构。
对齐后要检查两件事:一是行数是否等于主日历交易日数;二是每个板块列的非空值数量是否合理。若某板块非空值明显少于总交易日数,说明该指数发布较晚或长期停牌,需要在后续处理中特别标注。
三、缺失值处理:区分“短缺口”与“长缺口”
对齐后出现的空值分两类。第一类是短缺口,通常由单日停牌或数据源偶发漏采造成,长度在1至3个交易日。这类缺口可用前向填充(用上一有效收盘价补齐),因为指数在停牌期间价格实质未变,前向填充不会引入方向性偏差。第二类是长缺口,例如某板块指数2021年才发布,2020年整段为空,或长期停牌超过10个交易日。这类缺口不能用前向填充硬补,否则会人为制造一条水平直线,使相对强弱曲线在该区间“冻结”,RRG上表现为长时间停在原地,误导判断。正确做法是把该板块在缺口区间的值置为空,并在计算RRG时对该板块单独截取有效区间,或直接剔除该板块。
实操中建议设定一个填充比例阈值,例如某板块被填充的交易日占其有效区间总交易日数的比例超过5%,就应在数据质量日志中标记为“低可信”,供后续筛选。示例中某板块共480个交易日,前向填充了9个,比例约1.9%,属于可接受范围。
四、异常值修正:识别“跳变”而非“波动”
异常值不是指正常的大涨大跌,而是指明显违背数据逻辑的跳变,例如单日涨跌幅超过±11%(对指数而言已极不寻常)、收盘价突然变为0或负数、同一日期出现两个不同价格。识别方法很直接:对每个板块列计算日收益率 r = P_t / P_{t-1} - 1,筛出 |r| > 0.11 的记录逐条核对。核对时对照原始行情或相邻板块走势,判断是真实行情还是录入错误。
若确认为录入错误(例如小数点错位导致价格放大10倍),修正方式是回填正确值;若无法确定正确值,则将该点置为空,再按缺失值规则处理。切忌用均值或中位数直接替换价格序列中的异常点,因为价格具有时间连续性,均值替换会破坏序列结构。示例中某板块在2023年某日出现 收盘价 1234.56 而前后日均为 123.45 左右,判定为小数点错位,回填为 123.46 后序列恢复正常。
五、标准化输出与交付检查
完成上述步骤后,输出一张宽表:第一列 date 为交易日,其余列为各板块收盘价与基准收盘价,全部为浮点数,无空值(或空值已按规则处理并记录)。交付前做四项检查:行数等于基准交易日数;各列非空值数量与预期一致;日收益率无超出阈值的未解释跳变;日期严格递增无重复。这张表即可直接进入RRG计算环节,用 RS = 板块收盘价 / 基准收盘价 得到相对强弱序列。