4. 表现期与观察期设计:观察期(特征窗口)与表现期(标签窗口)的长度确定原则、滚动率分析(Roll Rate Analysis)方法
在额度模型样本构建中,观察期(Observation Window)与表现期(Performance Window)的合理设计直接决定了特征与标签的时序对齐质量。若窗口长度设置不当,轻则导致模型区分度下降,重则引入未来信息(Look-ahead Bias)或标签截断偏差(Label Truncation Bias)。本节将系统阐述窗口长度的确定原则,并重点介绍滚动率分析(Roll Rate Analysis)这一核心工具。
4.1 观察期与表现期的定义与对齐关系
观察期(又称特征窗口)是用于提取客户历史行为特征的时间区间;表现期(又称标签窗口)是用于定义客户违约/逾期标签的时间区间。两者在时间轴上必须严格遵循“观察期在前、表现期在后”的时序约束,且中间不可存在时间缝隙或重叠。
| 窗口类型 | 英文术语 | 时间位置 | 产出内容 | 典型长度 |
|---|---|---|---|---|
| 观察期 | Observation Window | 样本点之前 | 特征变量(X) | 6~24个月 |
| 表现期 | Performance Window | 样本点之后 | 标签变量(Y) | 3~24个月 |
| 样本点 | Sample Point | 观察期与表现期交界 | 样本唯一标识 | 固定时点 |
4.2 窗口长度确定的核心原则
4.2.1 观察期长度确定原则
- 业务周期覆盖原则:观察期至少覆盖一个完整的业务周期(如信用卡账单周期30天、消费贷放款周期12个月),确保特征能捕捉到客户行为的季节性波动。
- 数据稳定性原则:观察期越长,特征统计量越稳定,但样本量会因数据缺失而减少。一般建议观察期长度在6~24个月之间,具体取决于产品类型。
- 特征衰减原则:距离样本点越近的行为对当前信用状况影响越大。观察期过长(如超过36个月)可能导致早期行为信息衰减至无统计意义。
4.2.2 表现期长度确定原则
- 违约定义对齐原则:表现期长度必须与业务定义的“坏客户”标准一致。例如,若定义“逾期90天以上”为坏客户,则表现期至少需要90天。
- 滚动率收敛原则:表现期长度应使得逾期状态基本收敛,即大多数客户在表现期结束时已明确进入“好”或“坏”状态,而非停留在中间逾期状态。
- 样本量平衡原则:表现期越长,坏样本越充分,但样本点时间越靠后,可用样本量越少。需要在坏样本充分性与样本量之间取得平衡。
4.3 滚动率分析(Roll Rate Analysis)方法
滚动率分析是确定表现期长度的核心定量方法。它通过追踪客户在不同逾期天数之间的转移概率,判断逾期状态何时趋于稳定,从而确定标签窗口的合理长度。
4.3.1 滚动率分析的基本原理
滚动率(Roll Rate)定义为:在某个时间点处于逾期状态 i 的客户,在下一个时间点转移到逾期状态 j 的比例。通常将逾期状态划分为:C0(正常)、C1(1~30天)、C2(31~60天)、C3(61~90天)、C4(91~120天)、C5(120天以上)等。
滚动率分析的核心假设是:当表现期足够长时,大多数客户要么滚回正常(C0),要么滚入严重逾期(C4+),中间状态(C1~C3)的比例会趋于稳定或下降。当滚动率矩阵呈现“两端收敛”特征时,即可确定表现期长度。
4.3.2 滚动率分析的实施步骤
- 定义逾期状态:根据业务规则将逾期天数划分为若干区间(如C0、C1、C2、C3、C4+)。
- 选择时间窗口:以月为单位,计算每个月底各逾期状态的客户分布。
- 计算转移矩阵:对于每个相邻月份,计算从状态 i 转移到状态 j 的客户比例。
- 绘制滚动率曲线:以表现期月数为横轴,以各逾期状态的占比为纵轴,观察曲线收敛趋势。
- 确定收敛点:当C1~C3状态的占比降至较低水平(如<5%)且不再显著变化时,对应的月数即为推荐的表现期长度。
4.3.3 滚动率矩阵示例
下表展示了某消费信贷产品在表现期第6个月时的滚动率转移矩阵(单位:%):
| 当前状态 | 下月C0 | 下月C1 | 下月C2 | 下月C3 | 下月C4+ |
|---|---|---|---|---|---|
| C0(正常) | 97.2 | 2.5 | 0.2 | 0.1 | 0.0 |
| C1(1~30天) | 45.0 | 30.0 | 20.0 | 4.0 | 1.0 |
| C2(31~60天) | 20.0 | 15.0 | 25.0 | 30.0 | 10.0 |
| C3(61~90天) | 5.0 | 8.0 | 12.0 | 35.0 | 40.0 |
| C4+(91天以上) | 1.0 | 2.0 | 3.0 | 5.0 | 89.0 |
从矩阵可以看出:C4+状态有89%的概率留在C4+,C0状态有97.2%的概率留在C0,而C1~C3状态则呈现明显的“向两端分化”趋势。这表明在6个月的表现期内,逾期状态已基本收敛。
4.4 滚动率分析的可视化:收敛曲线
下图展示了不同表现期长度下各逾期状态的占比变化趋势,帮助直观判断收敛点:
4.5 滚动率分析的进阶应用:多期滚动率矩阵
单期滚动率矩阵只能反映相邻月份的转移情况,而多期滚动率矩阵可以展示客户在多个时间窗口内的累计转移路径。这对于判断“逾期状态是否真正收敛”更为可靠。
以下代码展示了如何用Python计算多期滚动率矩阵:
import pandas as pd
import numpy as np
def calculate_roll_rate_matrix(df, status_col, date_col, periods=6):
"""
计算多期滚动率矩阵
参数:
df: DataFrame,包含客户ID、逾期状态、日期
status_col: 逾期状态列名(如 'C0', 'C1', 'C2', 'C3', 'C4+')
date_col: 日期列名
periods: 滚动期数(月)
返回:
roll_rate_matrix: 多期滚动率矩阵
"""
# 按客户ID和日期排序
df = df.sort_values(['customer_id', date_col])
# 计算每个客户在periods个月后的状态
df['future_status'] = df.groupby('customer_id')[status_col].shift(-periods)
# 删除未来状态缺失的行
df_clean = df.dropna(subset=['future_status'])
# 计算转移矩阵
transition = pd.crosstab(
df_clean[status_col],
df_clean['future_status'],
normalize='index'
)
return transition
# 示例用法
# roll_rate_6m = calculate_roll_rate_matrix(data, 'status', 'month_end', periods=6)
# print(roll_rate_6m)
4.6 窗口设计的常见陷阱与避坑指南
| 陷阱类型 | 问题描述 | 后果 | 解决方案 |
|---|---|---|---|
| 未来信息泄露 | 观察期包含了样本点之后的数据 | 模型线上效果远低于线下 | 严格按样本点切割,使用时间戳校验 |
| 表现期过短 | 标签窗口未覆盖完整违约周期 | 坏样本被误标为好样本 | 使用滚动率分析确定收敛点 |
| 表现期过长 | 标签窗口跨越了业务策略变更点 | 标签定义不一致,模型不稳定 | 控制在12~24个月内,避开策略变更 |
| 观察期数据稀疏 | 客户在观察期内无足够行为记录 | 特征缺失率高,样本量骤减 | 设置最低观察期长度要求(如≥6个月) |
| 忽略季节性 | 观察期或表现期跨越了春节、双11等 | 特征分布偏移,标签分布异常 | 加入季节性虚拟变量或调整窗口对齐 |
4.7 窗口设计的完整流程总结
下图总结了观察期与表现期设计的完整决策流程:
4.8 实战案例:某消费金融产品的窗口设计
某消费金融公司计划开发一款额度模型,产品期限为12个月,还款方式为等额本息。历史数据覆盖2018年1月至2023年12月。通过滚动率分析,得到以下结论:
- 滚动率分析结果:在表现期第6个月时,C1~C3状态的客户占比已降至3.2%,且后续变化幅度小于0.5%。C4+状态的客户占比稳定在8.5%左右。
- 观察期选择:考虑到产品期限为12个月,且客户行为在6个月内具有较好的稳定性,选择12个月作为观察期长度。
- 表现期选择:基于滚动率收敛点,选择6个月作为表现期长度。坏客户定义为“表现期内任意逾期超过90天”。
- 样本点设置:以2022年6月30日为样本点,观察期为2021年7月~2022年6月,表现期为2022年7月~2022年12月。