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 哨兵预警的完整计算链路:

PSI 计算与哨兵预警流程图 原始评分/特征数据 等频/等距分箱 计算基准占比 Q_i 与实际占比 P_i PSI = Σ(P_i - Q_i) × ln(P_i/Q_i) PSI ≥ 阈值 → 触发哨兵预警 分箱要点 • 推荐 5-15 箱 • 优先等频分箱 • 避免空箱或极端占比 评判标准 • PSI < 0.10:稳定 • 0.10 ≤ PSI < 0.25:轻度漂移 • PSI ≥ 0.25:严重漂移

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) 的计算异常。