4. PSI阈值设定:行业通用阈值(0.1, 0.25)的由来,以及如何根据业务场景自定义阈值
群体稳定性指标(PSI)是衡量模型分数分布随时间偏移程度的核心量化工具。在金融风控领域,PSI阈值直接决定了是否触发模型重训或业务干预。本章将深入剖析行业通用阈值(0.1、0.25)的统计基础,并给出在可疑交易监测场景下自定义阈值的完整方法论。
4.1 行业通用阈值的统计由来
PSI的计算公式基于信息论中的KL散度(Kullback-Leibler divergence),其数学表达式为:
PSI = Σ (Actual_i - Expected_i) × ln(Actual_i / Expected_i)
其中:
- Expected_i = 基准分布中第 i 个分箱的样本占比
- Actual_i = 当前监测分布中第 i 个分箱的样本占比
- 通常将分数等频分为10箱(每箱10%样本)
行业通用阈值(0.1、0.25)并非随意设定,而是基于大量实证统计与业务容忍度的平衡结果。下表展示了不同PSI区间对应的分布偏移程度及行业共识:
| PSI区间 | 偏移程度 | 行业共识 | 典型触发动作 |
|---|---|---|---|
| PSI < 0.1 | 无显著偏移 | 分布稳定,模型表现可信 | 无需干预,持续监测 |
| 0.1 ≤ PSI < 0.25 | 轻度偏移 | 需关注,但未必需要立即重训 | 启动人工审查,分析偏移原因 |
| PSI ≥ 0.25 | 显著偏移 | 分布发生结构性变化,模型失效风险高 | 立即告警,启动模型重训或业务规则调整 |
统计依据: 0.1 和 0.25 这两个阈值来源于对数千个风控模型的历史回测。当 PSI < 0.1 时,模型在验证集上的AUC下降通常不超过 2%;当 PSI > 0.25 时,AUC下降普遍超过 5%,且坏账率预测偏差显著增大。
4.2 行业阈值在可疑交易监测中的局限性
在可疑交易监测场景中,直接套用 0.1/0.25 阈值可能产生两个问题:
- 过度告警: 交易行为天然具有季节性(如节假日交易量激增)、政策驱动性(如反洗钱新规出台),这些正常波动可能导致 PSI 超过 0.1,但模型并未失效。
- 漏报风险: 当新型洗钱手法出现时,分布偏移可能集中在高分箱(高风险交易),而整体 PSI 仍低于 0.25,导致错过关键告警窗口。
下图展示了行业通用阈值与可疑交易场景的适配关系:
4.3 自定义阈值的核心原则
在可疑交易监测中,自定义PSI阈值应遵循以下三条原则:
- 业务容忍度优先: 阈值应与模型误报率(FPR)和漏报率(FNR)挂钩。例如,若监管要求可疑交易报告(STR)的查全率不低于 95%,则阈值应设定在能保证该查全率的最低PSI值。
- 分箱粒度适配: 可疑交易模型通常输出概率值(0~1),建议采用等宽分箱(如每0.1一个箱)而非等频分箱,以捕捉高分箱的细微偏移。
- 动态调整机制: 阈值不应一成不变,应结合历史告警准确率进行季度性校准。
4.4 自定义阈值的实施步骤
以下是在可疑交易监测场景中自定义PSI阈值的完整流程:
实施流程:
- 收集基准分布: 取过去90天(或至少包含一个完整业务周期)的模型分数作为基准。
- 设定候选阈值集: 以0.05为步长,生成 [0.05, 0.10, 0.15, 0.20, 0.25, 0.30] 六个候选阈值。
- 回测历史偏移事件: 对过去12个月的模型分数进行滚动PSI计算,标记已知的模型失效事件(如AUC下降超过5%)。
- 计算每个阈值的告警性能: 对每个候选阈值,计算其检出率(Recall)和误报率(FPR)。
- 选择最优阈值: 在保证Recall ≥ 90%的前提下,选择FPR最低的阈值。
下表展示了一个实际回测案例的阈值选择过程:
| 候选阈值 | 检出率(Recall) | 误报率(FPR) | F1分数 | 是否推荐 |
|---|---|---|---|---|
| 0.05 | 98.2% | 34.5% | 0.81 | ❌ 误报过高 |
| 0.10 | 94.7% | 12.3% | 0.90 | ✅ 推荐 |
| 0.15 | 85.1% | 5.8% | 0.88 | ❌ 漏报偏高 |
| 0.20 | 72.3% | 2.1% | 0.82 | ❌ 漏报严重 |
避坑提示: 不要仅依赖PSI绝对值做决策。在可疑交易监测中,即使PSI低于0.1,如果高分箱(如风险概率 > 0.8)的样本占比从5%骤升至15%,也应立即触发人工审查。建议同时监测 分箱级PSI贡献度,重点关注最高风险分箱的偏移量。
4.5 分箱级PSI贡献度分析
为了弥补全局PSI的不足,我们引入分箱级PSI贡献度(Bin-level PSI Contribution),其计算公式为:
Bin_Contribution_i = (Actual_i - Expected_i) × ln(Actual_i / Expected_i)
其中,PSI = Σ Bin_Contribution_i
通过分析每个分箱的贡献度,可以精准定位偏移来源。下图展示了分箱级贡献度的可视化方法:
实战建议: 在可疑交易监测中,建议将全局PSI阈值设为0.15,同时设置分箱级告警规则:若最高风险分箱(如0.7-0.8)的贡献度超过0.2,即使全局PSI低于0.15,也应触发橙色告警。这种双层阈值机制能有效捕捉新型洗钱手法导致的局部偏移。
4.6 阈值设定的自动化校准
对于生产环境,建议实现阈值自动校准脚本,以下是一个Python伪代码示例:
import numpy as np
from sklearn.metrics import recall_score, precision_score
def calibrate_psi_threshold(baseline_scores, current_scores, labels,
candidate_thresholds=[0.05, 0.10, 0.15, 0.20, 0.25],
min_recall=0.90):
"""
自动校准PSI阈值
Parameters:
- baseline_scores: 基准分数分布 (numpy array)
- current_scores: 当前分数分布 (numpy array)
- labels: 真实标签 (1=可疑交易, 0=正常交易)
- candidate_thresholds: 候选阈值列表
- min_recall: 最低检出率要求
Returns:
- best_threshold: 最优阈值
- performance: 各阈值性能指标
"""
performance = {}
for threshold in candidate_thresholds:
# 计算PSI
psi_value = calculate_psi(baseline_scores, current_scores)
# 生成告警信号(1=告警, 0=不告警)
alerts = (psi_value >= threshold).astype(int)
# 计算检出率和误报率
recall = recall_score(labels, alerts)
precision = precision_score(labels, alerts)
f1 = 2 * (precision * recall) / (precision + recall + 1e-10)
performance[threshold] = {
'recall': recall,
'precision': precision,
'f1': f1,
'psi': psi_value
}
# 选择满足最低检出率且F1最高的阈值
valid_thresholds = {k: v for k, v in performance.items()
if v['recall'] >= min_recall}
if not valid_thresholds:
return None, performance
best_threshold = max(valid_thresholds,
key=lambda k: valid_thresholds[k]['f1'])
return best_threshold, performance
生产环境注意事项: 自动校准脚本应每周运行一次,并保留历史阈值变更记录。每次阈值调整后,需在测试集上验证模型AUC是否下降超过1%,避免因阈值调整引入新的风险。
4.7 本章小结
PSI阈值设定是可疑交易监测模型运维的关键决策点。行业通用阈值(0.1、0.25)提供了良好的起点,但在实际应用中必须结合业务场景进行自定义调整。核心要点包括:
- 理解阈值来源: 0.1和0.25基于大量风控模型的历史回测,但可疑交易场景的分布波动性更高。
- 自定义原则: 业务容忍度优先、分箱粒度适配、动态调整机制。
- 实施方法: 通过回测历史事件,在保证检出率的前提下选择误报率最低的阈值。
- 进阶技巧: 引入分箱级PSI贡献度分析,建立双层告警机制,捕捉局部偏移。