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天。
  • 滚动率收敛原则:表现期长度应使得逾期状态基本收敛,即大多数客户在表现期结束时已明确进入“好”或“坏”状态,而非停留在中间逾期状态。
  • 样本量平衡原则:表现期越长,坏样本越充分,但样本点时间越靠后,可用样本量越少。需要在坏样本充分性与样本量之间取得平衡。
经验参考值:对于消费信贷产品,常见组合为“观察期12个月 + 表现期6个月”或“观察期6个月 + 表现期12个月”。对于房贷等长期产品,表现期可延长至24个月。

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)的比例会趋于稳定或下降。当滚动率矩阵呈现“两端收敛”特征时,即可确定表现期长度。

常见误区:滚动率分析不能替代Vintage分析。滚动率用于确定表现期长度,Vintage用于评估不同时期放款的质量。两者是互补工具,不可混淆。

4.3.2 滚动率分析的实施步骤

  1. 定义逾期状态:根据业务规则将逾期天数划分为若干区间(如C0、C1、C2、C3、C4+)。
  2. 选择时间窗口:以月为单位,计算每个月底各逾期状态的客户分布。
  3. 计算转移矩阵:对于每个相邻月份,计算从状态 i 转移到状态 j 的客户比例。
  4. 绘制滚动率曲线:以表现期月数为横轴,以各逾期状态的占比为纵轴,观察曲线收敛趋势。
  5. 确定收敛点:当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 滚动率分析的可视化:收敛曲线

下图展示了不同表现期长度下各逾期状态的占比变化趋势,帮助直观判断收敛点:

滚动率收敛曲线:各逾期状态占比随表现期变化 1月 3月 6月 9月 12月 18月 表现期长度(月) 0% 25% 50% 75% 100% C0(正常) C1(1~30天) C2(31~60天) C3(61~90天) C4+(91天以上) ← 收敛点(6月) 说明:C0与C4+曲线在6个月后趋于稳定,C1~C3曲线降至低位,表明6个月是合理的表现期长度

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等 特征分布偏移,标签分布异常 加入季节性虚拟变量或调整窗口对齐
最佳实践:在确定窗口长度后,建议进行敏感性分析——分别尝试6个月、9个月、12个月的表现期,观察模型AUC和KS的稳定性。若不同窗口下的模型性能波动较大,说明标签定义可能存在问题,需要重新审视滚动率分析结果。

4.7 窗口设计的完整流程总结

下图总结了观察期与表现期设计的完整决策流程:

观察期与表现期设计决策流程 1. 业务定义违约标准 2. 滚动率分析确定表现期 3. 确定观察期长度 4. 敏感性分析验证 5. 确定最终窗口方案 关键输入 • 产品类型(消费贷/房贷/信用卡) • 历史逾期数据(至少24个月) • 业务策略变更记录 • 监管合规要求 最终输出 • 观察期长度(月) • 表现期长度(月) • 样本点时间序列 • 标签定义文档

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月。
验证结果:该窗口方案下,模型训练集AUC为0.78,验证集AUC为0.76,线上AUC为0.74,表现稳定。若将表现期缩短至3个月,AUC下降至0.71;若延长至12个月,样本量减少30%,AUC仅提升0.01。最终确认6个月为最优表现期长度。