4. SHAP值计算
在量化因子归因中,SHAP值的计算方式并非只有一种。不同模型结构对应不同的SHAP估计算法,它们在计算复杂度、精度保证、特征依赖假设上存在本质差异。选错算法,轻则归因结果失真,重则在高频场景下无法落地。本节围绕KernelSHAP、TreeSHAP、DeepSHAP、LinearSHAP四条技术路线,讲清它们的原理边界与选型逻辑。
一、核心原理:从Shapley值到四种近似路径
SHAP的数学根基是合作博弈论中的Shapley值:将模型预测值视为所有特征"合作"产生的收益,每个特征的贡献等于它在所有可能特征子集中的边际贡献的加权平均。精确计算需要遍历2^M个子集,M为特征数,在因子场景中通常有几十到上百个特征,直接计算不可行。四种算法本质上是对这一精确解的四种近似策略。
- KernelSHAP:将SHAP值估计转化为加权线性回归问题。对每个样本,通过采样特征子集构造"联盟向量",用Shapley核权重拟合一个线性模型,回归系数即为SHAP值。它不依赖模型内部结构,属于模型无关方法。
- TreeSHAP:利用树模型的递归结构,在遍历树节点时直接计算每个特征对预测路径的贡献。通过记录样本在每棵树中经过的节点和分支条件,精确计算SHAP值,复杂度从指数级降到多项式级。
- DeepSHAP:基于DeepLIFT的思想,将神经网络中的激活差异按比例反向传播到输入特征。它利用网络层间的线性近似和链式法则,把输出与基准值之差分配给各输入维度。
- LinearSHAP:针对线性模型,SHAP值有解析解。当特征独立时,第i个特征的SHAP值等于其系数乘以特征值与基准值之差;若特征存在相关性,则需引入协方差结构进行修正。
二、方法流程与关键参数
以量化因子归因中最常见的XGBoost选股模型为例,TreeSHAP的调用流程如下:
import shap
import xgboost as xgb
# 训练XGBoost因子模型
model = xgb.XGBRegressor(n_estimators=300, max_depth=6)
model.fit(X_train, y_train)
# TreeSHAP解释器
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
# 单样本归因
shap.force_plot(explainer.expected_value, shap_values[0], X_test.iloc[0])
# 全局因子重要性
shap.summary_plot(shap_values, X_test, plot_type="bar")
KernelSHAP则需要指定背景数据集和采样数,采样数直接决定估计方差:
# KernelSHAP:需提供背景数据作为基准
explainer = shap.KernelExplainer(model.predict, X_background)
shap_values = explainer.shap_values(X_test, nsamples=2000)
参数建议:KernelSHAP的nsamples建议不低于2×特征数×100;TreeSHAP无需采样参数,但需注意model_output类型(raw/margin/probability)会影响归因尺度;DeepSHAP需指定背景样本数,通常取100~500条代表性样本。
三、适用场景对照
| 算法 | 适用模型 | 计算速度 | 精度 | 量化场景建议 |
|---|---|---|---|---|
| KernelSHAP | 任意模型 | 慢 | 近似 | 异构集成、自定义模型、小规模归因 |
| TreeSHAP | 树模型 | 快 | 精确 | XGBoost/LightGBM因子归因首选 |
| DeepSHAP | 神经网络 | 中等 | 近似 | LSTM/Transformer因子挖掘 |
| LinearSHAP | 线性模型 | 极快 | 精确 | 线性多因子模型、风险归因 |
四、误区与复盘
误区一:用KernelSHAP解释树模型。虽然可行,但计算成本极高且结果与TreeSHAP存在采样误差。在日频因子归因中,TreeSHAP可在秒级完成全市场股票归因,KernelSHAP可能需要数小时。
误区二:忽略特征相关性对LinearSHAP的影响。当因子间存在共线性时,独立假设下的解析解会高估单个因子的贡献。此时应使用条件期望版本或改用TreeSHAP。
复盘要点:算法选型的第一原则是"匹配模型结构"。树模型用TreeSHAP,神经网络用DeepSHAP,线性模型用LinearSHAP,只有无法归类时才用KernelSHAP兜底。第二原则是"精度与速度的权衡":TreeSHAP和LinearSHAP是精确解,DeepSHAP和KernelSHAP是近似解,后者需要关注采样数和背景集选择带来的稳定性问题。第三原则是"归因尺度一致性":同一份报告中不要混用不同算法的SHAP值,因为基准期望值的定义方式不同,会导致因子贡献不可比。