精华帖子

用 SHAP 看懂这套量化选股策略:从模型打分到数学归因

由bq5973r5创建,最终由bq5973r5 被浏览 25 用户

在量化投资中,越来越多的策略开始引入机器学习模型来做选股。机器学习的优势在于,它能够同时处理大量因子,自动学习复杂的非线性关系,从而提高对未来收益的预测能力。

但与此同时,也会带来一个非常关心的问题:

模型为什么会选这些股票?\n它到底依据了哪些因子?\n某只股票入选,是因为估值低、盈利好,还是动量强?

如果没有解释机制,我们看到的往往只是一个结果列表:买了哪些股票、打了多少分,却很难理解模型背后的逻辑。这样一来,模型虽然“能算”,但未必“能被信任”。

这正是 SHAP 归因分析 的意义所在。

在这套策略中,我们不仅使用了随机森林模型进行选股,还引入了 SHAP 机制来解释模型的决策过程。它既能告诉我们模型整体最依赖哪些因子,也能告诉我们某只股票为何会被选中。更重要的是,SHAP 并不是经验性的解释,而是建立在严格数学理论基础上的归因方法。

所以,这套策略不仅是在做选股,还在做一件更重要的事:

把模型决策过程,从黑箱变成可解释、可验证、可沟通的透明逻辑。

一、这套策略本身在做什么

这是一套基于 随机森林回归模型 的 A 股量化选股策略,核心流程可以概括为四步:

  1. 从股票因子库中提取候选股票及财务、估值、动量等因子
  2. 用过去一段时间的数据训练模型
  3. 预测当前截面中每只股票未来收益排名
  4. 选出模型评分最高的前 30 只股票持有,并按固定周期调仓

二、为什么量化策略进行 SHAP 归因分析

如果没有 SHAP,这套策略虽然能输出一个分数,但我们看到的只是:

  • 这次买了哪 30 只股票
  • 某只股票分数高低是多少

但这些信息还远远不够。

因为我们真正想知道的是:

  • 模型这次到底更偏好什么风格?
  • 是价值风格在起作用,还是动量风格在起作用?
  • 某只股票为什么被选中?
  • 模型逻辑最近有没有发生漂移?

而 SHAP 正是把这些问题变得可解释的工具。

1. SHAP 的本质

SHAP 来源于博弈论中的 Shapley Value。它的核心思想是:

把模型的一次预测结果,看作多个特征共同“贡献”出来的结果,然后计算每个特征分别贡献了多少。

放到这套策略里,就是:

  • 模型给一只股票打了一个分数
  • SHAP 会把这个分数拆开
  • 告诉我们每个因子分别把这个分数推高了多少,或者拉低了多少

所以,SHAP 不是简单的“特征重要性排序”,而是一种更细粒度的归因分析方法。

它既可以回答:

模型整体最看重哪些因子?

也可以回答:

某只股票入选,究竟是哪些因子在推动?

三、这套策略里的 SHAP 是怎么做的

在代码里,SHAP 分析是围绕每个调仓日展开的。也就是说,每次模型重新训练并对当前股票池打分后,系统会额外做一轮解释工作。

整体分为两部分:

1. 全局 SHAP 归因

全局归因关注的是:

在当前这次调仓中,模型整体最依赖哪些因子。

具体实现方式是:

  • 用训练好的随机森林模型
  • 对当前预测截面的股票计算 SHAP 值
  • 对每个因子的 SHAP 值取绝对值后求平均
  • 得到一个“当前调仓日因子重要性排序”

这对应代码里的 global_importance_df。

它的意义在于:我们可以看到,当前这期模型整体更偏好哪类特征。例如:

  • 如果 momentum_60d 的 SHAP 值显著更高,说明模型近期更偏动量
  • 如果 ep_ratio、bp_ratio 更高,说明模型近期更偏估值修复
  • 如果 roe、roic 更高,说明模型更重视盈利质量

换句话说,全局 SHAP 揭示的是策略当前的“风格暴露”

2. 局部 SHAP 归因

局部归因关注的是:

具体某只股票为什么得分高。

在代码中,策略会对预测分数最高的前几只股票做单独解释。对于每只股票,会列出影响最大的若干因子,并给出它们各自的 SHAP 值。

例如,一只股票得分较高,可能是因为:

60 日动量很强,给了明显正贡献

ROE/PB 比值较高,说明性价比不错,也带来正贡献

市值较大,可能带来一定负贡献

短期波动过高,拉低了分数

最终,这只股票的分数不是一句“模型觉得它好”就结束,而是能被拆解成若干因子的共同作用。

这对我们理解策略特别重要。因为我们看到的将不再是一个抽象的分数,而是一份“入选原因说明书”。

四、如何理解 SHAP 的正负值

在这套策略中,模型预测的是 未来收益排名百分位,因此 SHAP 的含义要按这个口径理解。

SHAP 值为正

表示这个因子在当前股票上,推动了模型预测分数上升,也就是推动它在未来收益排名中更靠前。

SHAP 值为负

表示这个因子在当前股票上,拖累了模型预测分数,使它在未来收益排名中更靠后。

举个简单例子。

假设某只股票的局部 SHAP 结果显示:

  • momentum_60d:+0.035
  • roe_to_pb:+0.021
  • log_market_cap:-0.012
  • volatility_price:-0.008

那么可以解释为:

这只股票之所以被模型看好,主要是因为中期动量较强,同时 ROE 相对 PB 的性价比较高;但它的市值特征和价格波动特征对分数有一定拖累。

这种解释方式非常符合我们的阅读习惯,因为它把复杂模型的输出,翻译成了接近投研语言的表达。

五、全局 SHAP 能说明什么

如果你把每次调仓日的全局 SHAP 结果记录下来,其实就能形成一条非常有价值的“风格监控线”。

1. 看策略近期偏什么风格

我们最直观的问题就是:

这段时间策略到底是在买什么样的股票?

通过全局 SHAP,可以很容易看出来:

  • 动量因子长期排名靠前,说明策略近期偏趋势跟随
  • 估值因子显著增强,说明策略偏低估值修复
  • 盈利质量因子抬升,说明策略更偏基本面质量

这比单纯看持仓名称更有解释力。

因为持仓名称只能看到“买了谁”,而全局 SHAP 能看到“为什么买这类股票”。

2. 看策略是否发生风格切换

市场环境变化时,模型的偏好往往会变化。

比如:

  • 在强趋势市场里,动量类因子可能主导
  • 在风格均值回归阶段,估值因子可能更强
  • 在业绩驱动行情里,盈利质量因子可能抬升

全局 SHAP 能帮助我们理解:策略不是死板地执行某一套固定规则,而是在既定因子框架内,动态学习当前更有效的信号。

3. 监控模型是否异常

如果某段时间突然出现一些不太符合常识的因子持续占据高权重,比如某些噪声型交易变量异常抬升,就可以提醒我们:

  • 是否数据质量有问题
  • 是否模型对某些局部特征过拟合
  • 是否市场环境已经发生明显变化

所以,全局 SHAP 不仅是解释工具,也是模型诊断工具。

六、局部 SHAP 能说明什么

如果说全局 SHAP 解决的是“策略整体怎么看市场”,那么局部 SHAP 解决的就是“这只股票为什么被选中”。

局部 SHAP 可以把答案拆得非常具体。

1. 把“入选”变成可解释的因子组合

对于一只入选股票,局部 SHAP 会告诉我们:

  • 哪些因子在主要贡献正向分数
  • 哪些因子在产生负向影响
  • 最终为什么它仍然排进了前 30

这能帮助我们理解:模型不是因为某一个单一因子买入,而是多个信号综合作用后的结果。

2. 看到模型判断和投研语言之间的对应关系

很多时候,我们并不熟悉机器学习,但熟悉投研表达。

比如:

  • “这只股票中期动量强”
  • “盈利质量不错,而且估值不贵”
  • “短期交易活跃度提升”
  • “市值暴露略有拖累”

而局部 SHAP 恰好可以把机器学习模型的结果,翻译成这样的投研语言。

七、SHAP 的数学原理是什么

这部分是理解 SHAP 的核心。

SHAP 的理论来源是博弈论中的 Shapley Value(夏普利值)。原本它用于解决一个经典问题:

在一个合作博弈中,多个参与者共同创造了一个总收益,那么这个总收益应该如何公平地分配给每个参与者?

例如,几个人共同完成一个项目,最后得到一笔奖金。问题是,每个人到底贡献了多少?不能只看谁最后出现,也不能只看谁先加入,而应该综合考虑每个人在所有可能合作顺序中的边际贡献。

Shapley Value 给出了一个严格而公平的分配方案。

1. 把机器学习解释问题转化为“合作博弈”

在 SHAP 中,我们把模型解释问题转化成一个“特征合作博弈”:

  • 每个特征,视作一个“参与者”
  • 模型输出,视作“总收益”
  • 每个特征的 SHAP 值,表示它对当前预测结果的边际贡献

也就是说,对于某只股票,模型最后给出的预测分数,并不是一个不可拆分的黑箱结果,而是可以写成:

这条公式非常重要。它说明:

一个样本最终的预测值,等于基准值加上所有特征贡献之和。

这就是 SHAP 的“可加性”来源。

2. Shapley Value 的定义

对于第 i 个特征,其 Shapley Value 定义为:

这条公式的含义是:

特征 i 的贡献,不是只看它单独出现时有多重要,而是要看它在所有可能特征组合中,平均能带来多少增量。

换句话说,SHAP 衡量的是一个特征在“所有合作情景”下的平均边际贡献。

这也是 SHAP 最大的数学优势所在:它不是拍脑袋分配贡献,而是基于严格定义进行公平分解。

3. 为什么需要考虑“所有组合”

因为一个特征的重要性会依赖于它和其他特征的关系。

比如在量化因子里:

  • roe 和 roic 都是盈利质量因子
  • ep_ratio 和 bp_ratio 都与估值相关
  • momentum_20d 和 momentum_60d 都体现趋势强弱

如果只看某个特征单独作用,容易高估或低估它的真实贡献。因为它的作用可能和其他特征重叠,也可能和其他特征形成交互。

所以,Shapley Value 不会只看一个顺序,而是遍历所有可能的特征组合,计算平均边际贡献。这样得出的归因结果更公平,也更稳健。

策略源码:https://bigquant.com/square/ai/f7968361-b24e-2189-c636-bf03a51ab926

{link}