3. PSI 指标原理:群体稳定性指标
群体稳定性指标(Population Stability Index, PSI)是风控模型监控中最核心的量化工具,用于衡量两个样本群体在特征分布或评分分布上的差异程度。在信贷风控场景中,PSI 常被用来监测模型评分卡、关键特征或坏账率在时间维度上的“漂移”情况,从而触发哨兵预警。
3.1 数学定义
PSI 基于信息论中的 KL 散度(Kullback-Leibler divergence) 对称化改造而来,其数学表达式为:
PSI = Σ (P_i - Q_i) × ln(P_i / Q_i)
其中:
- P_i:实际样本(当前期)在第 i 个分箱中的占比
- Q_i:基准样本(如建模期、上一期)在第 i 个分箱中的占比
- ln:自然对数
- Σ:对所有分箱求和
PSI 的本质是衡量两个概率分布之间的“距离”——当两个分布完全一致时,每个分箱的 P_i = Q_i,ln(1)=0,PSI=0;差异越大,PSI 值越高。
关键理解: PSI 不是对称距离(原始 KL 散度不对称),但通过 (P_i - Q_i) × ln(P_i/Q_i) 的构造,使得交换 P 和 Q 后 PSI 值不变,具备对称性。
3.2 计算步骤
PSI 的计算分为三个核心步骤:分箱 → 计算占比 → 计算 PSI 值。以下以模型评分(0-100分)为例,展示完整流程。
步骤一:分箱(Binning)
将连续变量或评分划分为若干区间(通常 5-15 箱)。分箱方式有两种:
- 等距分箱:按数值范围均匀切分,如 0-20、20-40、40-60、60-80、80-100
- 等频分箱:按样本量均匀切分,每箱包含大致相同的样本数
风控实践中推荐使用 等频分箱,因为等距分箱在数据分布极端时会导致某些箱样本过少,使 ln(P_i/Q_i) 不稳定。
步骤二:计算占比
分别统计基准样本和实际样本在每个分箱中的样本数,并转换为占比:
Q_i = 基准样本在第 i 箱的样本数 / 基准样本总数
P_i = 实际样本在第 i 箱的样本数 / 实际样本总数
步骤三:计算 PSI 值
代入公式逐箱计算并求和:
PSI = Σ (P_i - Q_i) × ln(P_i / Q_i)
以下是一个完整的计算示例表格:
| 分箱区间 | 基准占比 Q_i | 实际占比 P_i | P_i - Q_i | ln(P_i / Q_i) | 单箱贡献 |
|---|---|---|---|---|---|
| 0-20 | 0.10 | 0.15 | +0.05 | 0.4055 | 0.0203 |
| 20-40 | 0.20 | 0.25 | +0.05 | 0.2231 | 0.0112 |
| 40-60 | 0.40 | 0.35 | -0.05 | -0.1335 | 0.0067 |
| 60-80 | 0.20 | 0.18 | -0.02 | -0.1054 | 0.0021 |
| 80-100 | 0.10 | 0.07 | -0.03 | -0.3567 | 0.0107 |
| 合计 | 1.00 | 1.00 | 0.00 | — | 0.0510 |
上例中 PSI = 0.0510,属于中等漂移水平。
计算注意事项: 当某个分箱中 P_i 或 Q_i 为 0 时,ln(0) 无定义。实践中通常对占比做平滑处理(如加极小值 1e-6),或将该箱与相邻箱合并。
3.3 PSI 评判标准
在金融风控领域,PSI 的评判标准已形成行业共识,通常按以下阈值划分漂移等级:
| PSI 值范围 | 漂移等级 | 业务含义 | 建议动作 |
|---|---|---|---|
| PSI < 0.10 | 无显著漂移 | 群体分布稳定,模型表现与基准期一致 | 正常监控,无需干预 |
| 0.10 ≤ PSI < 0.25 | 轻度漂移 | 群体分布发生一定变化,需关注趋势 | 加强监控频率,排查可能的原因 |
| PSI ≥ 0.25 | 严重漂移 | 群体分布发生显著偏移,模型可能失效 | 立即触发哨兵预警,启动模型重训或调整 |
阈值调整说明: 上述 0.10 和 0.25 是通用经验值。在坏账率哨兵预警场景中,建议根据业务容忍度微调:高风险产品可收紧至 0.05/0.15,低风险产品可放宽至 0.15/0.30。
3.4 PSI 计算流程图
下图展示了从原始数据到 PSI 哨兵预警的完整计算链路:
3.5 PSI 在坏账率哨兵预警中的特殊应用
在回测坏账率场景中,PSI 不仅用于监控模型评分分布,还直接用于监控 实际坏账率 的时序稳定性。此时:
- 基准分布:建模期或上一期的坏账率分布(按评分区间分箱)
- 实际分布:当前期的坏账率分布
- 预警逻辑:当 PSI 超过阈值时,说明坏账率结构发生漂移,模型对风险的排序能力可能已失效
实战经验: 在坏账率哨兵预警中,建议同时监控 评分分布 PSI 和 坏账率分布 PSI。前者反映客群结构变化,后者反映风险表现变化,两者结合可更早发现模型失效信号。
3.6 Python 快速实现
以下是一个简洁的 PSI 计算函数,可直接用于回测场景:
import numpy as np
def calculate_psi(actual, expected, bins=10):
"""
计算群体稳定性指标 PSI
参数:
actual: 实际样本数组(当前期)
expected: 基准样本数组(建模期/上一期)
bins: 分箱数量,默认10箱
返回:
psi_value: PSI 值
"""
# 基于基准样本确定分箱边界(等频分箱)
percentiles = np.linspace(0, 100, bins + 1)
bin_edges = np.percentile(expected, percentiles)
# 分别统计两个样本在各箱中的占比
actual_counts, _ = np.histogram(actual, bins=bin_edges)
expected_counts, _ = np.histogram(expected, bins=bin_edges)
# 转换为占比(加平滑避免除零)
actual_pct = actual_counts / actual_counts.sum() + 1e-6
expected_pct = expected_counts / expected_counts.sum() + 1e-6
# 计算 PSI
psi_value = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
return psi_value
# 示例用法
# psi = calculate_psi(current_scores, base_scores, bins=10)
# print(f"PSI = {psi:.4f}")
代码说明: 函数使用 np.percentile 基于基准样本自动生成等频分箱边界,确保每个箱的基准样本量大致相等。平滑项 1e-6 避免了 ln(0) 的计算异常。