基于Rank变换与PLS回归的极简方案

——基于Rank与Bootstrap-PLS的稳健方案

股票涨跌方向预测:
——基于Rank与Bootstrap-PLS的稳健方案

学号已脱敏 大数据管理与应用 笔者

非正式摘要:

写在最前:2026年5月4日凌晨,我在室友的温馨提醒下发现我忽略了Category.csv,悲喜交加下对我的算法做出了+0.6% 的重大提升,而此时我已经写完了报告,只能狼狈的进行项目重构。

我的最终代码在Rank百分位变换后加入类别聚合均值、类别内标准差和变量相对Major类别均值的残差,进行标准化后,再通过Bootstrap重复训练PLS Regression,并用Median聚合预测结果;最后根据0附近预测值大量聚集的现象,把方向判断阈值微调为0.00001。

该方案的优势在于模型结构与数据结构高度匹配:50个x之间存在平均相关系数约0.272的共同因子结构,PLS可以在利用X协方差信息的同时引入Y的监督信号;Rank变换削弱异常值与量纲影响;Category元信息的价值有限但真实: Cat+Bootstrap vs 无Cat+Bootstrap的差异约0.65%,说明变量组结构信息对预测有贡献,但贡献不大。这意味着灰龟公司在数据采集阶段不需要过度依赖精细的变量分类,基础的分行业/分品类统计已足够。

一个比较有意思的发现是,方向判断阈值较为敏感:预测值在0附近存在大量聚集(约占测试样本15-20%),这些”临界样本”的方向判断对最终加权准确率影响极大。阈值从0调整到0.00001本质上是对市场负面偏见的先验假设——金融市场的负预期使得靠近0的预测更可能是负。

值得注意的是,我的最初版本(PLS,压缩至12维,Random seed = 42)仅使用了49行就取得了0.58366的成绩,我觉得这个简洁性和速度都是值得关注的。简洁与可解释力在我看来是单一模型而非合并模型所具有的较大优势。

最后,在灰龟公司使用本模型时,应将其作为日频行业方向研判的辅助。同时建议在行业/板块方向判断、风险敞口监控预警等场景中使用,并且实际使用中,要保留时间戳,增强模型可训练能力。

关键词:Rank变换,Bootstrap,PLS,股票方向预测,阈值微调

一、问题定义与评价指标

任务目标是对测试集437天、50只股票的方向进行预测。训练集包含1746天数据,每天有50个x变量与50个y变量;测试集仅包含50个x变量。

课程采用加权准确率,当预测方向与真实收益同号时,样本贡献为正;反号时贡献为负;收益绝对值越大,该样本对总分影响越大。

二、数据结构观察

图4_PCA累计方差解释率曲线

图3、4 x变量相关矩阵热力图、PCA主成分分析图

三、核心算法:Category + Bootstrap PLS12方案

3.1 算法流程

步骤 实现 作用
1. 缺失值处理 按训练集每列x的中位数填充train/test 缺失比例低,避免复杂插补带来不稳定性
2. Rank变换 rank data(col) / n 统一分布、降低异常值影响、增强线性关系
3. Category扩展 Major / Minor均值、标准差、Major残差 把变量类别元信息转为样本级特征
4. 标准化 Standard Scaler 让变量进入PLS前尺度一致
5. PLS回归 PLS Regression (n = 12) 有监督降维,同时预测50个y
6. Bootstrap聚合 30次外层Bootstrap × 5个seed,Median 降低单次抽样和单次拟合带来的波动
7. 方向输出 Sign_safe(pred) 将连续预测转为±1,阈值取+0.00001

3.2 为什么选择PLS

PLS的关键优势是“有监督降维”。PCA只关心X自身方差,可能把与Y无关但方差很大的方向保留下来;PLS则寻找能同时解释X并与Y协方差较大的低维方向。对于本题这种x变量高度相关、y目标多达50个的任务,PLS比“PCA+Ridge”的两阶段流程更贴近评价目标。

图5 简单PLS组件数调参折线图

3.3 手写PLS复现验证

为了确认PLS主干不是单纯依赖sklearn封装(我记得上课时候bootstrap好像自己写代码和官方库有点区别),我额外尝试了自己构建PLS的方法。

下表是对比,算法结果是一致的:

实现方式 最佳n_components 5折CV 提交方向分布
sklearn PLS 12 约0.5820 +1=10880,-1=10970
NumPy PLS 12 0.582054 +1=10881,-1=10969

四、迭代与转折

在这里,我想讲一讲我整体的尝试过程,从初步接触项目到最终结束陆陆续续过了两周时间,整个过程我觉得具有一定的递进性,总体而言我分为了以下五个阶段:

4.1 第一阶段:基线与过拟合

初始阶段,我先建立Ridge、ElasticNet、逐股子集选择、PCA+Ridge、Logistic等无rank基线,并将这五个版本提交到Kaggle公开榜复核。

方法 5折CV Kaggle 结论
Ridge per-stock 0.575 0.56312 稳定线性基线
Elastic Net 0.578 0.56596 略优于Ridge,但提升有限
子集选择+Ridge 0.581 0.55152 CV较高但公开榜回落,选优过拟合明显
PCA+Ridge无rank版 0.581 0.56785 无rank基线中公开榜最好,说明降维去噪有效
Logistic回归 0.557 0.54688 方向分类并未优于回归后取符号

4.2 第二阶段:Rank变换成为第一次真正突破

Rank变换是整个项目最关键的预处理发现。为了避免把Rank收益误判为某一个复杂模型的偶然结果,我先在前面已经出现过的早期模型上做复核,包括Ridge、Elastic Net、固定Top10子集Ridge、PCA+Ridge和Logistic回归。

复核结果显示,排名变换在测试集上效果分别提升约0.013、0.007、0.013、0.019和0.018,说明Rank变换系统性改善了早期线性模型和降维模型可利用的输入信号质量。

图6 Rank变换在早期模型上的效果对比

4.3 第三阶段:从PCA重新回到有监督降维

我在rank变换、标准化的基础上,去尝试了更多可能的主成分数量。B4 PCA+Ridge在Kaggle公开榜达到0.57654,证明降维去噪方向是正确的。

方案 特征处理 结果 意义
B4 PCA+Ridge Rank + PCA + Ridge Kaggle 0.57654 证明降维去噪有效
B11 PLS Rank + PLS CV约0.5820 用监督信号替代无监督PCA

4.4 第四阶段:Bootstrap成为第三次突破

在PLS12我几乎放弃提升之后,室友的温馨提醒打破了我的“退休生活”,我发现category.csv是描述变量所属Major/Minor类别的信息。于是我把每个类别内的均值、标准差以及单个变量相对Major类别均值的残差构造成新特征,使模型不只看单个Y,也看变量组的共同变化和组内偏离。

阶段 模型设置 Kaggle 验证表现 结论
PLS12主线 Rank + PLS12 Kaggle 0.58366 有监督降维形成强基线
Bootstrap稳健化 Rank + PLS + bootstrap median,无category Kaggle 0.58317 稳定性提高,但外部分数未明显超过B11
第三次突破 Rank + category特征 + PLS12 + bootstrap median Kaggle 0.58917 外部测试提升+0.006

4.5 第五阶段:阈值问题——把目光转向更细的地方

金融市场的结果是负面预期还是正面预期十分重要,预测值在0附近存在大量聚集(约占测试样本的15-20%),这些”临界样本”的方向判断对最终加权准确率影响极大。阈值从0调整到0.00001本质上是对市场负面偏见的先验假设——金融市场的负预期使得靠近0的预测更可能是负。

IMG_256

图7 对于所有数据的预测结果分布

七、结论与反思

维度 本模型 说明 维度
可解释性 PLS 潜在因子+ Category 组结构,可追溯变量贡献 可解释性
稳健性 较高 Bootstrap Median 聚合降低了单次抽样波动 稳健性
金融市场适配 中高 Rank 变换削弱异常值、阈值适配金融市场悲观预期 金融市场适配
极端行情适应 依赖历史协方差结构,极端行情下可能失效 极端行情适应

八、补充说明

8.1变量影响与共同作用

我用PLS的x_weights与多目标平均绝对系数构造综合影响分数。高影响变量的判断,是因为它们更活跃地参与了因子构建。例如x36、x27排名靠前,说明它们在捕捉跨股票、跨行业的共同信息上更有效。

图8 PLS变量影响强度Top12

8.2 对灰龟公司的使用建议

1.建议直接使用模型输出的场景

日内方向研判辅助、行业研判参考、风险敞口监控的输入信号

2.不建议直接使用模型输出的场景

个股独立决策(基于50个x变量的共因子结构做预测,单变量解释力有限

高频交易(以日级别数据训练,对分钟级或小时级市场信号不适用

3.灰龟公司在部署时的额外建议:

定期用新数据重训:建议每季度用新数据重新拟合PLS,避免系数漂移

监控临界样本比例:若某日预测值在±0.001区间内的样本占比突然上升,说明市场处于高不确定性状态,此时应降低模型输出的权重。

九、后记

回归分析真的是一门非常实用的课程,很感谢花老师帮我们重新梳理了基本的原理,比如线性变换的那个动态演示图,让我能够第一次直观的理解。同时回归分析在我实习的面试中也是经常被问到的知识点,参数的解释性更能体现我对数据本身的理解,为我在日常数据处理中提供了很大帮助!

同时也很感谢课上说的“可以参考机器学习的相关知识点”,以及在降维章节提到的“可以重点关注这里的内容”,都为我的课程作业提供了很大的帮助,我觉得这个在我PLS还有category的使用上得到了体现。

最后感谢身边同样选修这门课的朋友,我们在交流中碰撞出了很多思路,从预处理再到模型最后到微调,受益匪浅。