2、选股问题建模:将选股转化为排序问题

好,咱们直接进入正题。上一章我们聊了排序学习的基本概念,这一章我带你看看,怎么把选股这件事,真正变成一个排序问题。

说实话,我刚开始做量化那会儿,也踩过不少坑。最典型的就是——拿回归模型硬怼。结果呢?回测曲线漂亮得不行,实盘一跑就崩。后来我才明白,选股的本质,从来不是预测收益率具体是多少,而是判断哪只股票相对更好

2.1 为什么选股本质上是排序问题?

你想想看,我们做选股,最终目的是什么?是构建一个投资组合。组合里,我们需要决定:买哪些股票?每只买多少?

这背后隐含的逻辑是:我们只需要知道股票A比股票B好,股票B比股票C好……至于A的预期收益是5%还是5.1%,其实没那么重要。只要排序对了,组合的收益就不会差太多。

我个人习惯把这个问题叫做「相对价值判断」。说白了,就是给全市场股票打个分,然后按分数从高到低排序。前10%买入,后10%卖出——这就是最朴素的选股策略。

核心观点: 选股不是预测绝对值,而是判断相对优劣。

2.2 传统回归/分类模型的局限性

嗯,这里我要重点说一下。很多新手上来就用线性回归预测下个月收益率,或者用分类模型预测涨跌。这些方法不是不能用,但有几个硬伤。

2.2.1 回归模型的痛点

回归模型的目标是让预测值尽可能接近真实值。比如预测下个月收益率,模型会努力拟合出5.2%、3.8%这样的具体数字。

但问题来了:

  • 噪声太大:股票收益率本身信噪比极低,你很难精确预测到小数点后一位
  • 目标不一致:我们真正关心的是排序,不是精确值。模型花大量精力去拟合那些微小的波动,反而忽略了相对关系
  • 分布偏移:不同时间段的收益率分布差异很大,牛市和熊市的模型参数可能完全不同

我曾经用LSTM预测个股收益率,回测时R²能到0.3,觉得稳了。结果实盘一跑,排序效果还不如简单的动量因子。为什么?因为模型学到了很多噪声模式,换了个市场环境就失效了。

2.2.2 分类模型的局限

分类模型呢?把问题简化为「涨」或「跌」。这看起来更直接,但同样有问题:

  • 信息损失严重:涨5%和涨0.1%都被归为「涨」类,但这两者的投资价值天差地别
  • 阈值敏感:分类边界怎么定?用0%?还是用中位数?不同的阈值会导致完全不同的结果
  • 类别不平衡:A股市场长期来看,上涨和下跌的天数其实差不多,但幅度差异很大。分类模型很难处理这种「幅度不平衡」
避坑指南: 我曾经用XGBoost做二分类预测涨跌,准确率做到了55%。但实际构建组合时,发现选出来的股票和随机选没什么区别。因为模型虽然判断对了方向,但完全无法区分「大涨」和「小涨」——这才是选股的关键。

2.3 Pairwise思路:两两比较

既然直接预测绝对值不行,那换个思路——我们让模型比较两只股票,判断哪只更好。这就是Pairwise方法的核心。

具体来说:

  1. 从训练集中随机抽取两只股票A和B
  2. 如果A的收益率高于B,则标记为(A优于B)
  3. 模型学习一个打分函数,使得对于任意一对(A, B),如果A优于B,则score(A) > score(B)

这有点像我们平时说的「两两对比」。你想想看,让你直接说茅台值多少钱,你可能说不准。但让你比较茅台和五粮液哪个更好,你就能说出个一二三来。

Pairwise的经典模型是RankNet,后来发展出LambdaRank、LambdaMART等。这些模型在搜索排序领域取得了巨大成功,后来被引入到量化选股中。

个人经验: 我在做A股选股时,Pairwise模型的效果通常比回归模型提升5-10%的IC值。但要注意,Pairwise的训练样本量会爆炸——N只股票会产生N*(N-1)/2个样本对。所以需要做采样,我一般每期采样10万对左右。

2.4 Listwise思路:整体排序

Pairwise虽然比回归好,但有个问题:它只关注两两之间的相对关系,忽略了整个列表的全局结构。

举个例子,假设我们有5只股票,真实排序是[1,2,3,4,5]。Pairwise模型可能学到的排序是[1,3,2,4,5]——虽然大部分两两关系是对的,但2和3的顺序颠倒了。从组合构建的角度看,这种局部错误可能影响不大。但如果模型把第1名和第5名搞反了,那就麻烦了。

Listwise方法就是为了解决这个问题。它直接以整个排序列表为优化目标,常用的损失函数包括:

  • NDCG损失:归一化折损累计增益,关注排名靠前的准确性
  • MAP损失:平均准确率,适合关注头部排序的场景
  • ListNet损失:基于排列概率分布的损失函数

说白了,Listwise就是让模型直接学习「怎么排这个队」,而不是「谁比谁高一点」。

2.5 三种方法的对比

我整理了一个表格,方便你对比:

方法 优化目标 优点 缺点 适用场景
回归 预测精确值 简单直接,容易实现 噪声敏感,目标不一致 因子合成、风险预测
分类 预测涨跌方向 结果直观,可解释性强 信息损失,阈值敏感 择时、事件驱动
Pairwise 两两相对关系 符合排序本质,效果稳定 样本量大,忽略全局 中低频选股、因子挖掘
Listwise 整体排序质量 全局最优,头部准确 计算复杂,实现难度大 高频选股、组合优化

2.6 知识体系框架图

下面这张图,帮你理清本章的核心逻辑:

选股问题建模:从预测到排序 选股本质:排序问题 回归/分类模型 Pairwise 方法 Listwise 方法 局限性 噪声敏感 目标不一致 信息损失 核心思想 两两比较 相对关系 RankNet/LambdaMART 核心思想 整体排序 全局最优 NDCG/ListNet 结论:排序学习更适合选股场景 Pairwise 稳定可靠,Listwise 追求极致

2.7 实战中的选择建议

说了这么多,到底该用哪种方法?我个人的经验是:

  • 刚入门:先从Pairwise开始,用LambdaMART模型。实现简单,效果稳定,不容易翻车
  • 有一定基础:尝试Listwise方法,特别是关注头部排序的场景(比如只选前10%的股票)
  • 做高频交易:Listwise更合适,因为高频场景对排序的精度要求更高
  • 做低频选股:Pairwise足够了,加上一些因子筛选,效果就很不错
一个小技巧: 我习惯先用Pairwise模型跑一遍,得到初步的排序结果。然后在这个结果上,用Listwise做一次微调。这样既保证了稳定性,又提升了头部排序的准确性。有点像「先粗排,再精排」的思路。

好了,这一章我们重点解决了「为什么选股是排序问题」以及「三种建模方式的优劣」。下一章,我会带你手把手实现一个完整的Pairwise选股模型,从数据准备到模型训练,再到回测验证,全部走一遍。


公众号:蓝海资料掘金营,微信deep3321