2. 金融模型基础
在金融业务中,“模型”并不是一个抽象概念,而是直接参与决策的生产工具。信用评分决定是否放款,风险定价决定利率高低,量化交易决定买卖时点,资产配置决定资金分布。不同模型的目标函数、数据形态、约束条件和评估方式差异很大,但它们在工程上共享一条生命周期,并依赖一组可比较的性能指标。理解这些基础,是后续讨论量化与精度性能权衡的前提。
一、四类常见金融模型的核心原理
金融模型可以按“决策对象”和“输出形式”划分为四类。信用评分模型输出违约概率或评分,本质是二分类或概率校准问题;风险定价模型输出利差或价格,需要在违约损失与资金成本之间建立映射;量化交易模型输出信号或仓位,强调时序预测与执行成本;资产配置模型输出权重向量,关注组合层面的风险收益平衡。
- 信用评分:常用逻辑回归、梯度提升树(GBDT)、评分卡。输入包括收入、负债、历史逾期、查询次数等。输出通常映射到 300~850 分区间,并需满足监管可解释性。
- 风险定价:在违约概率(PD)、违约损失率(LGD)、违约风险暴露(EAD)基础上,叠加资金成本、运营成本和目标利润,形成利率或信用利差。
- 量化交易:包括因子模型、统计套利、机器学习信号。核心是预测未来收益或波动,并考虑滑点、手续费、冲击成本。
- 资产配置:均值方差、风险平价、Black-Litterman、机器学习权重。输出为各资产权重,需满足仓位、行业、流动性等约束。
二、模型生命周期:从需求到退役
模型生命周期不是一次性的建模动作,而是一个闭环。典型阶段包括:业务需求定义、数据准备、特征工程、模型训练、验证与校准、上线部署、监控预警、迭代或退役。每个阶段都有明确的交付物和准入标准。
- 需求定义:明确决策场景、目标变量、约束条件和成功标准。例如“将坏账率控制在 2% 以内,同时通过率不低于 60%”。
- 数据准备:包括样本选择、时间窗口划分、缺失值处理、异常值检测。需特别注意时间穿越和样本偏差。
- 特征工程:构造统计量、交叉特征、WOE 分箱、时序滞后特征。特征需可解释、可监控、可回溯。
- 模型训练:选择算法、调参、交叉验证。训练集、验证集、测试集需按时间切分,避免未来信息泄露。
- 验证与校准:评估区分度、稳定性、校准度。信用评分常用 KS、AUC、PSI;定价模型看 MAE、RMSE;交易模型看夏普、最大回撤。
- 部署上线:将模型封装为 API 或批量任务,记录版本、参数、输入输出,支持回滚。
- 监控预警:监控特征分布、预测分布、业务指标。设置 PSI、KS 下降、偏差阈值等告警。
- 迭代或退役:当性能衰减或业务变化时,重新训练或替换模型,并保留审计记录。
三、性能指标:区分度、校准度与稳定性
不同模型关注不同指标。信用评分最看重区分度和稳定性;风险定价最看重误差和校准;量化交易最看重风险调整后收益;资产配置最看重组合波动和尾部风险。下表给出常用指标及其适用场景。
| 指标 | 含义 | 适用模型 | 注意事项 |
|---|---|---|---|
| AUC | 排序能力,随机取正负样本,正样本得分更高的概率 | 信用评分、量化信号 | 对类别不平衡不敏感,但不反映校准 |
| KS | 正负样本累计分布的最大差值 | 信用评分 | 需结合业务阈值解读 |
| PSI | 群体稳定性指数,衡量分布偏移 | 信用评分、风险定价 | PSI > 0.25 通常需预警 |
| MAE / RMSE | 预测值与真实值的平均绝对/平方误差 | 风险定价 | 对异常值敏感度不同 |
| 夏普比率 | 单位波动带来的超额收益 | 量化交易、资产配置 | 假设收益近似正态,需结合回撤 |
| 最大回撤 | 峰值到谷底的最大损失幅度 | 量化交易、资产配置 | 反映尾部风险,需与恢复期一起看 |
四、案例与常见误区复盘
假设某消费金融公司要上线一款信用评分模型。业务目标是控制坏账率,同时提升通过率。团队用逻辑回归训练,AUC 达到 0.78,KS 为 0.35,看起来不错。但上线三个月后,PSI 升至 0.31,KS 降至 0.22,坏账率上升。复盘发现:训练样本只用了疫情前数据,未覆盖收入波动;特征中“近 3 个月查询次数”在业务策略调整后分布剧变;模型未做校准,导致高分人群实际违约率高于预期。
这个案例暴露了三个典型误区:第一,只看区分度,忽略稳定性和校准;第二,训练集与生产环境时间窗口不一致;第三,缺少上线后的监控闭环。正确的做法是:在验证阶段同时输出 KS、AUC、PSI 和校准曲线;上线后按周监控特征分布和预测分布;当 PSI 超过阈值时触发复查,而不是等到坏账暴露才行动。
# 示例:信用评分模型监控指标计算(伪代码)
ks = compute_ks(y_true, y_pred)
auc = compute_auc(y_true, y_pred)
psi = compute_psi(train_pred_dist, prod_pred_dist)
calibration = compute_calibration_curve(y_true, y_pred)
if psi > 0.25 or ks < ks_threshold:
trigger_alert("模型稳定性或区分度下降,需复查")