目的:通过约束模型复杂度来缓解过拟合
|
L1正则化 (Lasso):
|
L2正则化 (Ridge):
|
Elastic Net:结合L1 + L2,
K-Fold CV (k=5):
数据: [=====]====]====]====]=====
Fold 1: [TEST][TRAIN][TRAIN][TRAIN][TRAIN]
Fold 2: [TRAIN][TEST][TRAIN][TRAIN][TRAIN]
Fold 3: [TRAIN][TRAIN][TEST][TRAIN][TRAIN]
Fold 4: [TRAIN][TRAIN][TRAIN][TEST][TRAIN]
Fold 5: [TRAIN][TRAIN][TRAIN][TRAIN][TEST]
金融时序专用 - 滚动窗口CV:
训练: [=====] 测试: [=====]
训练: [=========] 测试: [=====]
训练: [=============] 测试: [=====]
关键点:时间序列数据必须使用滚动窗口或扩展窗口CV,不能使用随机K-Fold,否则会造成未来信息泄露。
|
金融场景:
|
没有一个机器学习算法在所有问题上都优于其他算法。
|
金融工程含义:
|
实践建议:
|
什么是学习曲线:模型性能随训练样本量变化的曲线
训练误差 -> (样本越多越难完美拟合)
验证误差 -> (样本越多泛化越好)
两者收敛 → 模型合适
|
诊断高偏差 vs 高方差:
|
金融中的特殊考虑:
|
三图对比:同一数据集,不同模型复杂度
欠拟合 (Underfitting): 合适 (Good Fit):
y ↑ * y ↑ *
│ * * │ * *
│ * * │ * *
│* * │ * *
│────(直线)──→ x │──(平滑曲线)──→ x
R²_train=0.62, R²_test=0.60 R²_train=0.85, R²_test=0.83
过拟合 (Overfitting):
y ↑ * *
│ * ** * 诊断口诀:
│** ** ** 训练R² ≫ 测试R² → 过拟合
│* ** * 训练R² ≈ 测试R² ≈ 低 → 欠拟合
│──(扭曲曲线)──→ x
R²_train=0.97, R²_test=0.61
|
金融数据不能用普通K-Fold CV! 原因:金融数据是时间序列,随机打乱会引入前视偏差 Time Series Split:
|
代码实现:
|
金融定制变种:
No Free Lunch定理的数学直觉:
对所有可能的数据分布取平均,所有算法的期望表现相同
对金融模型选择的含义:
金融数据的已知特征 → 模型选择指南:
| 数据特征 | 适合的模型 | 不适合的模型 |
|---|---|---|
| 特征多(>100) + 样本少 | Lasso/Ridge/XGBoost | 深度神经网络 |
| 特征高度相关 | Ridge/PCR/PLS | 普通OLS |
| 非线性关系 | GAM/树模型/样条 | 线性模型 |
| 类别不平衡 | XGBoost(scale_pos_weight) | 朴素贝叶斯 |
| 需要概率输出 | 逻辑回归/XGBoost | SVM |
| 需要可解释性 | 线性模型/GAM/SHAP | 深度神经网络 |
好的特征 = 差的模型 > 差的特征 = 好的模型
特征构造方法:
| 方法 | 描述 | 金融示例 |
|---|---|---|
| 数学变换 | log, sqrt, 平方 | 对数收益率、平方收益率 |
| 滞后特征 | 过去N期值 | 过去5日收益率 |
| 滚动统计 | 滚动均值/方差/偏度 | 20日滚动波动率 |
| 交叉特征 | 特征相乘/相除 | 市盈率×市值 |
| 分箱 | 连续值离散化 | PE分位数分组 |
| 编码 | 类别特征数值化 | 行业One-Hot编码 |
# 金融特征工程示例
def create_financial_features(df):
features = pd.DataFrame(index=df.index)
# 滞后特征
for lag in [1, 5, 10, 20]:
features[f'return_lag_{lag}'] = df['return'].shift(lag)
# 滚动统计
for window in [5, 10, 20, 60]:
features[f'ma_{window}'] = df['close'].rolling(window).mean()
features[f'vol_{window}'] = df['return'].rolling(window).std()
features[f'max_{window}'] = df['high'].rolling(window).max()
features[f'min_{window}'] = df['low'].rolling(window).min()
# 技术指标
features['rsi_14'] = compute_rsi(df['close'], 14)
features['macd'] = compute_macd(df['close'])
features['bb_position'] = (df['close'] - df['close'].rolling(20).mean()) / \
(df['close'].rolling(20).std() * 2)
return features
为什么需要特征选择?
三种特征选择方法:
| 方法 | 描述 | 优点 | 缺点 | 金融适用性 |
|---|---|---|---|---|
| Filter(过滤法) | 统计指标筛选(IC/互信息) | 计算快 | 忽略特征交互 | 初步筛选 |
| Wrapper(包装法) | 递归特征消除(RFE) | 考虑模型效果 | 计算慢 | 特征<50时 |
| Embedded(嵌入法) | Lasso/Tree重要性 | 结合训练过程 | 可能过拟合 | 最常用 |
# Lasso特征选择
from sklearn.linear_model import LassoCV
lasso = LassoCV(cv=5, max_iter=10000)
lasso.fit(X_train, y_train)
selected_features = X_train.columns[lasso.coef_ != 0]
print(f"压缩前特征数: {X_train.shape[1]}")
print(f"压缩后特征数: {len(selected_features)}")
# Tree特征重要性
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=100)
rf.fit(X_train, y_train)
importance = pd.DataFrame({
'feature': X_train.columns,
'importance': rf.feature_importances_
}).sort_values('importance', ascending=False)
金融分类问题的阈值选择:
from sklearn.metrics import precision_recall_curve
# 对于违约预测这样的不平衡分类问题
# 简单用0.5作为阈值通常不是最优
def find_optimal_threshold(y_true, y_prob):
"""找到最大化F1的阈值"""
precisions, recalls, thresholds = precision_recall_curve(
y_true, y_prob
)
f1_scores = 2 * (precisions * recalls) / (precisions + recalls + 1e-10)
optimal_idx = np.argmax(f1_scores[:-1])
return thresholds[optimal_idx]
# 不同场景的阈值选择策略
# 违约预测: 低阈值(0.2-0.3) 捕获更多违约
# 交易信号: 高阈值(0.6-0.7) 减少虚假信号
# 欺诈检测: 动态阈值 根据成本调整
阈值选择的金融含义:
降低阈值 → 更多交易信号,更高交易量,更多佣金
→ 可能捕获更多盈利机会,但也增加亏损交易
提高阈值 → 更少信号,更高质量
→ 机会成本(错过盈利)vs 风险控制(减少亏损)
2.2 回归模型Regression Models |
|
模型:
OLS估计:
解析解:
|
假设条件:
|
金融应用:
|
|
问题1:线性假设太强
|
问题2:对异常值敏感
|
|
问题3:多重共线性
|
问题4:过拟合
|
|
graph TD
OLS["OLS
普通最小二乘"] -->|存在共线性| Ridge["Ridge回归 L2正则化 系数收缩但不为零"] OLS -->|高维特征选择| Lasso["Lasso回归 L1正则化 系数稀疏化"] Ridge --> Elastic["Elastic Net L1+L2 兼顾两者优势"] Lasso --> Elastic |
选择指南:
|
|
多项式回归:
|
样条回归 (Splines):
|
金融应用:
|
从分段到光滑的演进: Step 1 — 阶梯函数 (Step Functions):
|
Step 2 — 分段多项式 (Piecewise Polynomials):
|
|
Step 3 — 约束样条 (Constrained Splines):
|
为什么需要导数连续性?
|
Truncated Power Basis — 样条的显式表示:
一个在ξ处有节点的d次样条可表示为:
其中
直观理解:
|
|
截断幂基的问题:数值不稳定(当x很大时(x-ξ)^d爆炸)→ B-spline解决
问题:普通样条在边界处方差很大(外推极不稳定)
自然样条约束:
在边界节点之外(x < ξ₁ 和 x > ξ_K),函数为线性:
|
为什么好:
|
与多项式回归的对比:
|
|
思想:不选择节点(所有点都是潜在节点),用惩罚项控制光滑度
有效自由度: |
金融应用对比:
|
模型:
其中
优点:
金融应用:
违约概率 = β₀ + f₁(杠杆率) + f₂(盈利能力) + f₃(规模) + ...
↑ ↑ ↑ ↑
样条函数 样条函数 线性函数 线性函数
金融数据中预测变量高度相关(多重共线性),普通OLS不稳定。两种降维回归方法:
主成分回归 (PCR, Principal Component Regression):
Step 1: 对X进行PCA → 提取前k个主成分 Z₁, Z₂, ..., Zₖ
Step 2: 用Y对主成分回归 → Y = γ₀ + γ₁Z₁ + ... + γₖZₖ
Step 3: 将系数转换回原始变量空间
偏最小二乘 (PLS, Partial Least Squares):
Step 1: 寻找线性组合 T₁ = w₁'X,使得 Cov(T₁, Y) 最大化
Step 2: 用残差重复步骤1,提取后续成分
Step 3: 用Y对 PLS 成分回归
PCR vs PLS vs Ridge/Lasso 对比:
| 方法 | 降维方式 | 使用Y信息 | 适用场景 |
|---|---|---|---|
| PCR | PCA → 回归 | 预测变量高度相关 | |
| PLS | 最大化Cov(X,Y) | Y引导降维(预测导向) | |
| Ridge | L2收缩 | 系数收缩 | 所有特征都有贡献 |
| Lasso | L1稀疏化 | 特征选择 | 需要自动特征选择 |
金融应用:PLS常用于宏观经济因子与资产收益的关系建模;PCR常用于高维因子组合的降维。
| 数据特征 | 推荐方法 | 原因 |
|---|---|---|
| 特征少 (<10),线性 | OLS | 简单、可解释 |
| 存在多重共线性 | Ridge | 收缩系数,稳定模型 |
| 高维,需要特征选择 | Lasso | 自动稀疏化 |
| 兼顾收缩+选择 | Elastic Net | L1+L2组合 |
| p > n (特征多于样本) | Lasso / Elastic Net / PLS | 稀疏性或降维 |
| 非线性关系 | 样条回归 / GAM | 灵活建模非线性 |
| 多因子共线+预测导向 | PLS | 监督降维 |
| 纯降维去噪 | PCR | 无监督降维 |
| 离群值多 | 稳健回归 (Huber) | 减少异常值影响 |
| 需要完全可解释 | OLS / GAM | 每个变量贡献清晰 |
为什么金融数据需要稳健回归?
金融数据中离群值的来源:
OLS对离群值敏感:一个极端点可能大幅改变回归线
Huber损失 (Huber Loss):
Huber回归参数:
δ=1.345: 95% 高斯效率 (默认)
δ=0.7: 更稳健 (接近L1)
δ=∞: 退化为OLS
δ→0: 退化为LAD (最小绝对偏差)
Quantile回归:
其中
金融应用:
2.3 分类模型Classification Models |
|
模型:
决策边界:
损失函数 (交叉熵):
|
金融应用:
|
为什么金融中用逻辑回归多?
|
线性SVM:找到最大化间隔的超平面
核技巧 (Kernel Trick):
将数据映射到高维空间,使非线性可分变为线性可分
| 核函数 | 公式 | 参数 |
|---|---|---|
| 线性核 | 无 | |
| 多项式核 | ||
| RBF核 | ||
| Sigmoid核 |
金融应用:信用评级分类、市场状态识别、异常交易模式检测
原理:基于贝叶斯定理,假设特征条件独立
|
优点:
|
金融应用:
|
局限性:特征独立假设在金融中通常不成立(因子之间高度相关)
原理:假设每个类别服从多元正态分布,协方差矩阵相同
决策规则:将x分配给使后验概率最大的类
LDA的决策边界:
LDA金融应用:
LDA vs 逻辑回归:
| 维度 | LDA | 逻辑回归 |
|---|---|---|
| 假设 | 正态+等协方差 | 无分布假设 |
| 效率 | 假设满足时更高效(~30%少样本) | 假设不满足时更稳健 |
| 多分类 | 天然支持 | 需要扩展 |
| 可解释性 | 判别方向可视化 | 系数=对数几率 |
QDA vs LDA:QDA允许各类别有自己的协方差矩阵
决策边界为二次曲线(因为
什么时候用QDA?
经验法则:
样本量 n < p²/2 → 用LDA (QDA过参数化)
样本量 n > p² → 考虑QDA
金融中p通常很大 → LDA更常用,但QDA在小规模精选特征后有效
模型(K个类别):
(其中一个类别设为基准,
Softmax损失:
金融应用:
核心区别:
生成式 (Generative):
建模 P(x, y) = P(x|y)·P(y) → 推断 P(y|x)
例: LDA, QDA, 朴素贝叶斯
优势: 可生成新样本,缺失数据处理
劣势: 建模联合分布更难
判别式 (Discriminative):
直接建模 P(y|x)
例: 逻辑回归, SVM, XGBoost
优势: 专注分类边界,通常更准
劣势: 不可生成数据
金融应用场景选择:
| 场景 | 推荐 | 原因 |
|---|---|---|
| 信用评分 (需概率) | 判别式 (逻辑回归) | 直接估计PD |
| 数据增强 (样本少) | 生成式 (LDA) | 可生成合成样本 |
| 高维分类 | 判别式 (SVM/XGBoost) | 对高维更稳健 |
| 缺失特征 | 生成式 | 可边际化缺失变量 |
| 监管合规 (需解释) | 两者皆可 (逻辑回归/LDA) | 都有清晰的决策规则 |
混淆矩阵详解:
预测
正类 负类
实际 正类 TP FN (TP+FN)
负类 FP TN (FP+TN)
(TP+FP) (FN+TN)
核心指标及其金融含义:
| 指标 | 公式 | 金融含义 |
|---|---|---|
| Precision (精确率) | TP/(TP+FP) | 预测为"买入"的股票中,真正涨了的比例 |
| Recall (召回率) | TP/(TP+FN) | 真正涨了的股票中,被模型选出的比例 |
| Specificity | TN/(TN+FP) | 没涨的股票中,被正确排除的比例 |
| F1-Score | 2PR/(P+R) | 精确率和召回率的调和平均 |
ROC曲线与AUC:
ROC: TPR (Recall) vs FPR (1-Specificity)
AUC = 1.0: 完美分类
AUC = 0.5: 随机猜测
AUC < 0.5: 比随机还差(可反向使用!)
AUC在金融中的解释:
AUC=0.80: 随机选一个正样本和一个负样本,
模型给正样本更高分的概率为80%
Precision-Recall曲线(类别不平衡时更有用):
| 应用场景 | 推荐方法 | 原因 |
|---|---|---|
| 违约预测(不平衡数据) | XGBoost/LightGBM + 阈值调整 | 处理非线性 + 类别权重 |
| 欺诈检测(极度不平衡) | XGBoost + SMOTE 或 Isolation Forest | 异常检测+过采样 |
| 市场方向预测(涨/跌) | 逻辑回归(基线)→ XGBoost | 简单可解释 → 复杂提升 |
| 信用评分(需可解释性) | 逻辑回归 + WOE分箱 | 监管要求可解释 |
| 文本情感分类 | 朴素贝叶斯(基线)/ FinBERT | 轻量基线 → 深度模型 |
| 高维特征分类 | SVM + RBF核 / XGBoost | 处理复杂边界 |
| 客户分群后分类 | 随机森林 | 对噪声鲁棒 |
| 实时交易决策 | LightGBM | 推理速度快 |
| 监管合规要求高 | 逻辑回归 / 决策树(单棵) | 完全可解释 |
| 预测精度优先 | XGBoost/LightGBM/CatBoost | 集成方法通常最优 |
通用选择原则:
2.4 树模型与集成学习Tree Models & Ensemble |
|
|
分类与回归树 (Classification And Regression Tree)
graph TD
X1["X1 < 阈值?"] -->|是| X2["X2 < 阈值?"]
X1 -->|否| X3["X3 < 阈值?"]
X2 -->|是| Leaf1["叶节点: y=0.1"]
X2 -->|否| Leaf2["叶节点: y=0.3"]
X3 -->|是| Leaf3["叶节点: y=0.6"]
X3 -->|否| Leaf4["叶节点: y=0.9"]
|
分裂准则:
剪枝 (Pruning):控制树复杂度,防止过拟合 金融应用:简单直观的规则提取,如"PE < 15 且 ROE > 15% → 买入" |
|
Bagging (Bootstrap Aggregating):
|
随机森林 (Random Forest):
|
|
关键超参数:
|
金融应用:
|
核心思想:串行训练弱学习器,每个新模型纠正前一个的错误
AdaBoost:调整样本权重,关注难分类样本
Gradient Boosting:每棵树拟合前一轮的梯度方向(负梯度残差)
其中
XGBoost (eXtreme Gradient Boosting) 是金融领域最流行的ML算法之一。
关键创新:
二阶泰勒展开:使用一阶+二阶梯度信息,收敛更快
正则化目标函数:
列采样:类似随机森林,防止过拟合
缺失值自动处理:学习默认分裂方向
并行化:特征维度并行(但树仍串行)
|
金融实践建议:
|
CatBoost (Categorical Boosting):Yandex开发,专门处理类别特征
关键创新:
金融应用:
XGBoost vs LightGBM vs CatBoost 选择:
| 场景 | 推荐 |
|---|---|
| 纯数值特征 | XGBoost |
| 大数据量 | LightGBM |
| 多类别特征 | CatBoost |
| 竞赛/精度优先 | 三者Ensemble |
2.5 模型可解释性SHAP & Interpretability |
|
为什么金融中可解释性格外重要?
| 需求 | 说明 | 监管要求 |
|---|---|---|
| 模型审计 | 监管机构需要理解模型决策逻辑 | Basel III, 银保监会 |
| 风控合规 | 风控拒绝贷款需要提供理由 | 《个人信用信息基础数据库管理暂行办法》 |
| 模型改进 | 理解错误来源才能改进 | — |
| 信任建立 | 交易员不会盲目信任黑箱 | — |
| 公平性 | 防止歧视性预测 | 反歧视法规 |
可解释性 vs 性能的权衡:
SHAP (SHapley Additive exPlanations) 基于博弈论中的Shapley值
核心思想:每个特征对预测的贡献 = 该特征在所有特征组合中的边际贡献的平均值
|
直观理解:
|
优点:
|
|
1. 全局特征重要性 (Summary Plot)
|
输出解读:
|
|
2. 局部单样本解释 (Waterfall Plot)
|
输出解读:
|
案例:企业违约预测模型解释
模型:XGBoost违约预测模型
样本:某制造企业
基准违约概率:5%(训练集平均值)
样本预测违约概率:23%
SHAP分解:
特征 SHAP值 说明
资产负债率 68% +8.5% ← 杠杆率偏高,违约风险↑
流动比率 0.8 +6.2% ← 短期偿债能力不足
行业=制造业 +3.1% ← 该行业整体风险偏高
营收增长率 12% -2.5% ← 增长良好,风险↓
现金流/负债 0.15 +2.7% ← 现金流覆盖不足
其他特征合计 +5.0% ← 其他因素
合计: 5% + 8.5% + 6.2% + 3.1% - 2.5% + 2.7% + 5.0% = 23%
监管价值:可以向借款企业解释"为什么被拒贷"的具体原因
端到端量化因子建模流程:
|
|
|
|
|
|
Stacking (堆叠泛化):
Layer 1 (基学习器):
├─ XGBoost → 预测 ŷ₁
├─ LightGBM → 预测 ŷ₂
├─ CatBoost → 预测 ŷ₃
└─ RandomForest → 预测 ŷ₄
Layer 2 (元学习器):
ŷ_final = LogisticRegression(ŷ₁, ŷ₂, ŷ₃, ŷ₄)
(简单模型避免过拟合)
Blending (混合):
与Stacking类似,但元学习器只用hold-out集训练(更简单,防泄露)
策略层面的集成:
量化多策略融合:
策略1 (价值): y₁ = XGBoost(value_factors)
策略2 (动量): y₂ = LightGBM(momentum_factors)
策略3 (质量): y₃ = CatBoost(quality_factors)
最终信号 = w₁·y₁ + w₂·y₂ + w₃·y₃
权重w基于: 滚动Sharpe / 信息比率 / 动态风险预算
金融ML集成注意事项:
全面评估体系:
| 指标 | 公式 | 优点 | 缺点 | 金融适用 |
|---|---|---|---|---|
| MSE | 可导/优化方便 | 对离群值敏感 | OLS损失函数 | |
| MAE | $\frac{1}{n}\Sigma | y_i-\hat{y}_i | $ | 抗离群值 |
| RMSE | 与y同单位 | 同MSE | 常用汇报 | |
| MAPE | $\frac{1}{n}\Sigma\frac{ | y_i-\hat{y}_i | }{y_i}$ | 百分比直观 |
| 解释方差比例 | 过度使用 | 基线参考 | ||
| Adj |
惩罚模型复杂度 | — | 模型选择 | |
| IC (信息系数) | RankCorr(预测, 实际) | 关注排序 | 忽略幅度 | 因子评价首选 |
| Rank IC | Spearman ρ(pred, actual) | 稳健排序 | — | 量化核心指标 |
金融中的评估层次:
L1 统计层: RMSE, R², MAE (模型拟合质量)
L2 排序层: IC, Rank IC (截面预测能力)
L3 投资层: Sharpe, MaxDD, Turnover (策略实际表现)
L4 归因层: 因子贡献分解, 行业/风格暴露
关键: L1好 ≠ L3好!必须在投资层面验证
金融数据中的离群值类型:
| 类型 | 示例 | 是否正确值 | 处理方法 |
|---|---|---|---|
| 真实极端值 | 1987崩盘日收益-20% | 保留或Winsorize | |
| 数据错误 | PE录入0.001而非10.0 | 删除或修正 | |
| 结构性断点 | 会计准则变更 | 标记+分段处理 | |
| 停牌恢复 | 复牌首日涨跌>100% | 标记处理 |
检测方法:
|
|
|
|
处理策略:
场景:使用ML构建月度多因子选股模型
|
Step 1 — 因子库 (20个因子):
|
Step 2 — 数据处理:
|
|
Step 3 — 模型选择:
|
Step 4 — 分层回测 (Top-Bottom Decile):
|
关键发现:XGBoost的Rank IC(0.06)相比于OLS(0.03)提升一倍,但换手率也从30%升至45%
2.6 AutoMLAutomated Machine Learning |
|
|
传统ML工作流:
|
AutoML工作流:
|
金融价值:
局限性:AutoML不是万能,金融领域仍需领域知识指导
| 方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 网格搜索 | 枚举所有组合 | 简单、可并行 | 维度灾难 | 参数少(<3) |
| 随机搜索 | 随机采样参数空间 | 高效、覆盖好 | 可能错过最优 | 参数适中 |
| 贝叶斯优化 | 用代理模型引导搜索 | 高效、智能 | 串行计算 | 参数多且评估慢 |
| 遗传算法 | 进化式搜索 | 全局优化 | 收敛慢 | 复杂空间 |
| Optuna | 树状采样+剪枝 | 高效、自动 | 需配置 | 通用推荐 |
import optuna
def objective(trial):
params = {
'max_depth': trial.suggest_int('max_depth', 3, 12),
'learning_rate': trial.suggest_float('lr', 0.01, 0.3),
'n_estimators': trial.suggest_int('n_est', 50, 500),
'subsample': trial.suggest_float('subsample', 0.5, 1.0),
'colsample_bytree': trial.suggest_float('colsample', 0.3, 1.0),
}
model = XGBRegressor(**params)
score = cross_val_score(model, X_train, y_train, cv=5).mean()
return score
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
| 框架 | 特点 | 金融适用性 |
|---|---|---|
| AutoGluon (AWS) | 多层级Ensemble,表格数据强 | |
| H2O AutoML | 成熟稳定,可解释性好 | |
| TPOT | 遗传编程搜索管线 | |
| AutoSklearn | 基于sklearn,全面 | |
| FLAML (微软) | 高效低成本,支持时间序列 |
金融推荐:AutoGluon和H2O AutoML在表格数据上表现最优,且有较好的可解释性支持。
2.7 无监督学习Unsupervised Learning |
|
原理:找到数据方差最大的方向进行投影
|
关键概念:
|
金融应用:
|
from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(returns)
print(f"方差解释比例: {pca.explained_variance_ratio_}")
# 输出类似:[0.89, 0.07, 0.03] (前三主成分解释99%方差)
|
算法:
|
金融应用:
|
选择K:肘部法则(Elbow Method)、轮廓系数(Silhouette Score)
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 对市场状态进行聚类
scaler = StandardScaler()
features_scaled = scaler.fit_transform(market_features)
kmeans = KMeans(n_clusters=3, random_state=42)
states = kmeans.fit_predict(features_scaled)
# states: 0=牛市, 1=熊市, 2=震荡
2.8 实践环节信用评分+SHAP分析 |
|
# 1. 数据加载与探索
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import xgboost as xgb
import shap
# 加载信用评分数据集(Kaggle或自制)
df = pd.read_csv("credit_data.csv")
# 特征:收入、负债率、信用历史长度、逾期次数、...
# 目标:是否违约 (0/1)
# 2. 训练/测试分割(按时间)
df = df.sort_values("申请日期")
split_idx = int(len(df) * 0.8)
train = df.iloc[:split_idx]
test = df.iloc[split_idx:]
X_train = train.drop(["是否违约", "申请日期"], axis=1)
y_train = train["是否违约"]
X_test = test.drop(["是否违约", "申请日期"], axis=1)
y_test = test["是否违约"]
# 3. 训练XGBoost
model = xgb.XGBClassifier(
n_estimators=200,
max_depth=5,
learning_rate=0.05,
subsample=0.8,
colsample_bytree=0.8,
eval_metric="auc",
early_stopping_rounds=20
)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)],
verbose=False
)
# 4. 评估
from sklearn.metrics import roc_auc_score, classification_report
y_pred_prob = model.predict_proba(X_test)[:, 1]
print(f"AUC: {roc_auc_score(y_test, y_pred_prob):.4f}")
# 5. SHAP解释
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
# 全局特征重要性
shap.summary_plot(shap_values, X_test)
# 单个样本解释(被拒客户)
shap.plots.waterfall(shap_values[0])
# 特征依赖图
shap.dependence_plot("负债率", shap_values, X_test)
提交内容:
1. Jupyter Notebook
- 完整数据预处理 → 建模 → SHAP分析流程
- 关键步骤添加注释说明
- 输出评估结果和图表
2. 分析报告要点:
- 模型选择的理由
- 最重要的3个特征及其金融含义
- SHAP分析揭示的关键业务洞察
- 模型局限性和改进方向
3. 思考题:
- 为什么金融评分模型不推荐使用深度学习?
- 如何处理样本不平衡(违约样本通常<5%)?
- SHAP值是否能作为监管解释的依据?
|
核心收获
预习准备
|
下周预告
|
教材
论文
实践资源