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区别于普通机器学习的关键。

LTR横截面选股流水线 原始数据 行情·财务·因子 特征工程 横截面标准化 标签与Query 未来收益分组 LTR模型 LambdaMART 排序分数 全市场打分 组合构建 Top-K等权/优化 回测评估 NDCG·IC·收益 关键约束:所有特征与标签必须按时间切分,禁止未来函数 训练集 → 验证集 → 测试集,按交易日滚动或扩展窗口

这条流水线中,“标签与Query”是最容易被做错的一步。在LTR中,每个交易日是一个query,当天所有可交易股票是候选文档,标签不是绝对收益,而是按收益分位数转换后的相关性等级(如0~4级)。这样模型学到的才是“谁比谁更强”,而不是“明天涨多少”。

四、案例场景:一个典型的横截面选股任务

假设我们要在沪深300成分股中,每个交易日选出未来5日超额收益最高的20只股票。传统做法可能是:用线性回归预测5日收益,再按预测值排序取前20。但这样做有两个问题:

  1. 回归损失对极端值敏感:某只股票因重组暴涨,模型会过度关注它,导致整体排序不稳定。
  2. 回归目标与选股目标不一致:我们只关心前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方法最贴近组合管理目标。接下来,请完成以下准备动作:

  1. 确认你的数据包含至少3年日频行情和财务因子。
  2. 安装lightgbm、pandas、numpy、scikit-learn,并验证lambdarank目标可用。
  3. 准备一个股票池(如中证500或沪深300),并明确调仓频率(如5日)。
  4. 思考你的标签构造方式:是超额收益分位数,还是行业中性化后的收益排名。
# 快速验证LightGBM排序目标是否可用
import lightgbm as lgb
print(lgb.__version__)
# 若输出 4.x 及以上,则支持 lambdarank 目标

当你完成以上准备,就可以进入下一阶段:深入理解Pointwise、Pairwise、Listwise三种范式的数学直觉与代码实现。记住,排序学习的核心不是模型有多复杂,而是训练目标与交易目标是否对齐。