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股市场长期来看,上涨和下跌的天数其实差不多,但幅度差异很大。分类模型很难处理这种「幅度不平衡」
2.3 Pairwise思路:两两比较
既然直接预测绝对值不行,那换个思路——我们让模型比较两只股票,判断哪只更好。这就是Pairwise方法的核心。
具体来说:
- 从训练集中随机抽取两只股票A和B
- 如果A的收益率高于B,则标记为(A优于B)
- 模型学习一个打分函数,使得对于任意一对(A, B),如果A优于B,则score(A) > score(B)
这有点像我们平时说的「两两对比」。你想想看,让你直接说茅台值多少钱,你可能说不准。但让你比较茅台和五粮液哪个更好,你就能说出个一二三来。
Pairwise的经典模型是RankNet,后来发展出LambdaRank、LambdaMART等。这些模型在搜索排序领域取得了巨大成功,后来被引入到量化选股中。
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 知识体系框架图
下面这张图,帮你理清本章的核心逻辑:
2.7 实战中的选择建议
说了这么多,到底该用哪种方法?我个人的经验是:
- 刚入门:先从Pairwise开始,用LambdaMART模型。实现简单,效果稳定,不容易翻车
- 有一定基础:尝试Listwise方法,特别是关注头部排序的场景(比如只选前10%的股票)
- 做高频交易:Listwise更合适,因为高频场景对排序的精度要求更高
- 做低频选股:Pairwise足够了,加上一些因子筛选,效果就很不错
好了,这一章我们重点解决了「为什么选股是排序问题」以及「三种建模方式的优劣」。下一章,我会带你手把手实现一个完整的Pairwise选股模型,从数据准备到模型训练,再到回测验证,全部走一遍。
公众号:蓝海资料掘金营,微信deep3321