1. 课程导入
欢迎进入《Learning to Rank横截面选股实战》。在正式写第一行模型代码之前,我们需要先建立一张清晰的“认知地图”:这门课到底解决什么问题,它和传统多因子打分、时间序列预测有什么本质区别,以及我们将用怎样的流程把排序学习落地到A股横截面选股中。本章不涉及复杂公式,但会决定你后续30章的学习效率。
一、学习目标:学完你能做到什么
本课程的目标不是让你背下某个模型的API,而是让你具备独立搭建一套“排序型选股系统”的能力。具体来说,学完后你应当能够:
- 理解排序学习(Learning to Rank, LTR)的三种范式:Pointwise、Pairwise、Listwise,并说清它们与回归预测、分类预测的差异。
- 把选股问题形式化为排序问题:每个交易日为一个“查询”,股票池为“候选文档”,未来收益或超额收益为“相关性标签”。
- 独立构造训练样本:完成横截面标准化、标签构造、分组(query id)生成与数据切分,避免未来函数。
- 训练并评估LTR模型:使用LambdaMART、RankNet等模型,并用NDCG、Rank IC、Top-K组合收益等指标评估。
- 完成回测与归因:把排序分数转化为持仓权重,分析换手率、行业暴露与风格暴露。
一句话概括:本课程教你用“排序”而不是“预测涨跌”的方式,从全市场股票中稳定地挑出相对更强的一批。
二、核心概念:先分清三组容易混淆的词
在量化选股中,很多人把“预测收益”“打分”“排序”混为一谈。它们的目标函数、损失函数和评估方式完全不同。下面这张表是本章最需要记住的清单:
| 概念 | 目标 | 典型输出 | 评估指标 | 选股中的角色 |
|---|---|---|---|---|
| 回归预测 | 逼近真实收益数值 | 预测收益率 | MSE、R² | 直接排序,但对极端值敏感 |
| 分类预测 | 判断涨/跌类别 | 概率或标签 | AUC、准确率 | 只关心方向,丢失强弱信息 |
| Pointwise LTR | 对单只股票打分 | 相关性分数 | NDCG、Rank IC | 退化为回归/分类 |
| Pairwise LTR | 判断两只股票谁更强 | 偏好概率 | Pairwise Accuracy | 直接优化相对顺序 |
| Listwise LTR | 优化整个股票列表顺序 | 列表级分数 | NDCG@K | 最贴近组合选股目标 |
可以看到,Listwise方法最接近真实选股场景:我们并不关心某只股票收益是3.1%还是3.2%,只关心它是否排在市场前10%。这也是本课程以LambdaMART为主线的原因。
三、整体框架:一条从数据到组合的流水线
下面这张SVG展示了本课程的核心数据流。请特别注意“Query分组”和“标签构造”两个环节,它们是LTR区别于普通机器学习的关键。
这条流水线中,“标签与Query”是最容易被做错的一步。在LTR中,每个交易日是一个query,当天所有可交易股票是候选文档,标签不是绝对收益,而是按收益分位数转换后的相关性等级(如0~4级)。这样模型学到的才是“谁比谁更强”,而不是“明天涨多少”。
四、案例场景:一个典型的横截面选股任务
假设我们要在沪深300成分股中,每个交易日选出未来5日超额收益最高的20只股票。传统做法可能是:用线性回归预测5日收益,再按预测值排序取前20。但这样做有两个问题:
- 回归损失对极端值敏感:某只股票因重组暴涨,模型会过度关注它,导致整体排序不稳定。
- 回归目标与选股目标不一致:我们只关心前20名是否真的强,不关心第150名和第200名的细微差别。
改用LTR后,流程变为:每个交易日,把300只股票的特征和未来5日收益分位数标签组成一个list,用LambdaMART直接优化NDCG@20。模型输出的分数只用于排序,不解释为收益预测。回测时,每天取分数最高的20只等权持有5日。这样,训练目标与交易目标高度一致,通常能获得更稳定的Rank IC和更高的Top-K组合收益。
提示:如果你之前做过XGBoost回归选股,可以把它理解为“Pointwise LTR”的近似。本课程会在此基础上,教你如何用group参数和lambdarank目标函数,把回归模型升级为真正的排序模型。
五、常见误区与复盘:新手最容易踩的五个坑
- 误区一:把全市场股票混在一起训练。 不同交易日的市场环境不同,必须按日期分组(query id),否则模型会学到“某天整体涨跌”的噪声。
- 误区二:标签直接用原始收益。 原始收益受市场beta影响大,应使用超额收益或横截面分位数,并转换为离散相关性等级。
- 误区三:特征不做横截面标准化。 不同日期的因子量纲差异大,必须每日做z-score或排名标准化,否则模型会偏向某些日期的极端值。
- 误区四:用随机切分代替时间切分。 金融数据存在强自相关,随机切分会导致未来信息泄露,回测结果虚高。
- 误区五:只看NDCG,不看交易成本。 排序模型容易高换手,必须结合手续费、滑点和冲击成本评估净收益。
复盘建议:在进入第2章之前,请先检查你手头的数据是否包含“日期、股票代码、因子列、未来收益”四类字段。如果缺少日期字段,后续无法构造query分组,课程将无法继续。
六、本章小结与行动清单
本章建立了三个核心认知:第一,选股本质是排序问题,不是回归问题;第二,LTR通过query分组和相关性标签,把横截面选股形式化为标准排序任务;第三,Listwise方法最贴近组合管理目标。接下来,请完成以下准备动作:
- 确认你的数据包含至少3年日频行情和财务因子。
- 安装
lightgbm、pandas、numpy、scikit-learn,并验证lambdarank目标可用。 - 准备一个股票池(如中证500或沪深300),并明确调仓频率(如5日)。
- 思考你的标签构造方式:是超额收益分位数,还是行业中性化后的收益排名。
# 快速验证LightGBM排序目标是否可用
import lightgbm as lgb
print(lgb.__version__)
# 若输出 4.x 及以上,则支持 lambdarank 目标
当你完成以上准备,就可以进入下一阶段:深入理解Pointwise、Pairwise、Listwise三种范式的数学直觉与代码实现。记住,排序学习的核心不是模型有多复杂,而是训练目标与交易目标是否对齐。