4. 评分卡开发流程:样本定义(好/坏客户)、观察期与表现期设定、模型训练与验证

催收评分卡(Collection Score)的开发遵循一套严谨的量化流程,核心在于通过历史数据预测债务人在未来特定时间段内的还款概率。本章将拆解开发流程中的三个关键环节:样本定义(好/坏客户界定)、观察期与表现期设定、以及模型训练与验证。

4.1 样本定义:好客户与坏客户

样本定义是评分卡开发的基石。定义标准直接决定了模型学习的目标。在催收场景中,通常以“逾期后是否在特定时间内结清”作为评判依据。

核心原则: 坏客户的定义必须与业务催收策略强相关。定义过严(如逾期1天未还即为坏)会导致样本量不足;定义过宽(如逾期180天未还才算坏)则模型无法区分早期风险。
客户类型 定义标准(示例) 业务含义 标签赋值
好客户 逾期进入催收后,在 30天 内全额结清或达成有效还款协议 具备还款意愿和能力,短期流动性问题 0
坏客户 逾期进入催收后,超过 90天 仍未结清,或进入核销/法务阶段 还款意愿低或丧失还款能力,高风险 1
不确定样本 逾期状态介于好/坏之间(如逾期60天) 状态模糊,通常从建模样本中剔除 —
实操建议: 建议采用“滚动率分析(Roll Rate Analysis)”来科学确定好/坏定义的时间窗口。例如,分析逾期30天的客户中,有多少比例最终滚动到逾期90天。若滚动率超过某个阈值(如70%),则可将该逾期天数作为坏客户定义的起点。

4.2 观察期与表现期设定

评分卡模型需要明确“用哪段时间的数据预测哪段时间的结果”。这涉及两个关键时间窗口:观察期和表现期。

  • 观察期(Observation Window): 用于提取客户特征(X变量)的时间段。例如,取客户过去6个月的还款行为、催收接触次数、收入稳定性等数据。
  • 表现期(Performance Window): 用于定义客户好坏标签(Y变量)的时间段。例如,观察期结束后,再观察客户未来3个月是否还款。
  • 时间间隔(Gap): 观察期结束与表现期开始之间的时间点,通常为0,即观察期结束的次日开始计算表现。
评分卡开发时间窗口示意图 观察期(6-12个月) 提取特征:还款行为、催收记录、负债率 T0 T1(观察期结束) 表现期(3-6个月) 定义好坏标签:是否结清 T2(表现期结束) 时间间隔(Gap = 0) 关键参数设定原则 观察期越长,特征稳定性越好,但样本量可能减少;表现期越长,坏客户定义越准确,但样本时效性变差。 催收场景建议:观察期≥6个月,表现期≥3个月。

4.3 模型训练与验证

在完成样本定义和时间窗口设定后,进入模型开发的核心环节。通常采用逻辑回归(Logistic Regression)作为基础模型,因其可解释性强,适合金融监管要求。

4.3.1 训练流程

  1. 数据划分: 将样本集按时间顺序或随机方式分为训练集(60%)、验证集(20%)和测试集(20%)。
  2. 特征筛选: 通过IV值(Information Value)、相关性分析、逐步回归等方法筛选入模变量。
  3. 模型拟合: 使用训练集拟合逻辑回归模型,得到各特征的权重系数。
  4. 评分转换: 将模型输出的概率值通过线性变换转换为整数评分(如300-900分)。

4.3.2 验证指标

验证指标 计算公式/说明 合格标准
KS值 衡量模型区分好坏客户的最大差距 ≥ 0.3(催收场景)
AUC ROC曲线下面积,衡量模型整体排序能力 ≥ 0.7
PSI 群体稳定性指标,衡量模型在时间上的稳定性 ≤ 0.1
Lift值 模型在最高风险组中识别坏客户的能力倍数 ≥ 2.0
模型训练与验证流程 1. 数据准备与清洗 2. 特征工程与筛选 3. 逻辑回归模型训练 4. 模型验证(KS/AUC/PSI) 不达标则迭代 验证集用于调参,测试集用于最终评估,严禁在测试集上反复训练。

4.4 模型输出与评分卡转换

训练完成的逻辑回归模型输出的是违约概率(PD)。为了便于业务使用,需要将其转换为整数评分卡。转换公式如下:

# 评分卡转换示例(Python伪代码)
# 假设模型系数已求出
import numpy as np

# 设定基准分和PDO(Point of Double Odds)
base_score = 600
pdo = 50  # 评分每增加50分,好坏比翻倍

# 计算偏移量和刻度因子
factor = pdo / np.log(2)
offset = base_score - factor * np.log(0.5 / 0.5)  # 假设基准好坏比为1:1

# 将概率转换为评分
def prob_to_score(prob):
    odds = prob / (1 - prob)
    score = offset - factor * np.log(odds)
    return int(round(score))

# 示例:违约概率0.8的客户评分
print(prob_to_score(0.8))  # 输出:约450分
重要提醒: 评分卡上线前必须进行回溯测试(Backtesting),使用至少3个月的新数据验证评分分布是否与开发样本一致。若PSI超过0.1,需重新校准模型或重建特征。