4. 观察期与表现期设定
在贷后预警滚动率模型中,观察期与表现期的设定直接决定了模型捕捉风险信号的时效性与准确性。观察期用于提取客户的历史行为特征,表现期则用于定义“违约”或“预警”的判定窗口。两者通过滚动窗口机制实现动态更新,是模型从静态评分向动态监控演进的核心工程环节。
4.1 观察期窗口定义
观察期(Observation Window)是模型用于计算客户行为指标的历史时间区间。窗口长度需平衡特征稳定性与数据新鲜度:窗口过短易受偶然波动干扰,过长则可能稀释近期风险信号。
| 窗口类型 | 典型长度 | 适用场景 | 注意事项 |
|---|---|---|---|
| 短期窗口 | 30天 / 60天 | 高频交易、现金贷、短期消费分期 | 对还款行为敏感,需排除节假日效应 |
| 中期窗口 | 90天 / 180天 | 信用卡、车贷、中等期限消费贷 | 兼顾稳定性与时效性,最常用 |
| 长期窗口 | 360天 / 720天 | 房贷、经营贷、大额长期资产 | 需剔除历史已结清账户的“静默期”数据 |
工程建议:观察期窗口应至少覆盖2个完整的还款周期。对于月供产品,90天窗口可捕获3次还款行为,足以计算“连续逾期次数”与“还款间隔变异系数”等关键特征。
4.2 表现期长度选择
表现期(Performance Window)是模型判定客户是否触发预警的时间区间。长度选择需与业务催收策略、资产处置周期对齐。
- 短期表现期(30天):用于“早期预警”信号,如首次逾期、还款金额异常下降。适合日催、短信提醒等轻量干预。
- 中期表现期(60-90天):对应“实质性违约”判定,如M2+逾期、连续两期未还。是滚动率模型最常用的表现窗口。
- 长期表现期(180天+):用于“核销/损失”评估,如M6+、核销、法律诉讼。多用于模型验证与损失准备金计提。
| 表现期长度 | 预警等级 | 典型业务动作 | 模型输出用途 |
|---|---|---|---|
| 30天 | 轻度预警 | 短信提醒、智能外呼 | 实时风险排序 |
| 60天 | 中度预警 | 人工电话催收、额度冻结 | 滚动率计算 |
| 90天 | 重度预警 | 委外催收、担保代偿 | 损失率预估 |
| 180天 | 核销预警 | 资产核销、法律诉讼 | 模型回溯验证 |
选择原则:表现期长度应大于或等于观察期长度,确保模型有足够的时间窗口观察到“行为→结果”的完整因果链。例如,观察期90天时,表现期至少设为90天,避免右截断偏差。
4.3 滚动窗口的滑动机制
滚动窗口(Rolling Window)是模型实现动态更新的核心机制。通过固定长度的观察期与表现期,按固定步长向前滑动,使模型在每个时间切片上都能输出最新的预警评分。
4.4 滑动步长与重叠率设计
步长(Step Size)决定了模型更新的频率,重叠率则影响特征序列的平滑程度。两者需根据业务数据更新节奏与计算资源综合设定。
| 步长 | 更新频率 | 重叠率(90天窗口) | 适用场景 |
|---|---|---|---|
| 7天 | 每周 | 92.2% | 高波动资产、现金贷、日结产品 |
| 30天 | 每月 | 66.7% | 信用卡、消费分期、车贷(推荐) |
| 90天 | 每季 | 0% | 房贷、经营贷、低频大额资产 |
避坑提示:步长过小(如1天)会导致窗口间高度重叠,特征序列自相关过强,模型容易过拟合短期噪声。建议步长至少为窗口长度的1/3,保持足够的样本独立性。
4.5 滚动窗口的工程实现要点
- 时间锚点对齐:所有窗口以“数据快照日期”为右边界,观察期与表现期均向左回溯。确保每个样本的观察期数据在表现期开始前已全部落地。
- 样本去重与拼接:同一客户在不同滚动切片中会生成多条样本。需在训练集与验证集中按时间切分,避免同一客户的数据跨切片泄露。
- 冷启动处理:新客户或新账户在初期无足够历史数据时,可采用“最短观察期”策略(如至少30天),不足部分用行业均值或零值填充。
- 窗口截断校验:在表现期结束时,若客户已结清或核销,需标记为“正常结束”或“损失结束”,避免将已结束账户错误地归入“未触发预警”类别。
# Python伪代码:滚动窗口样本生成逻辑
def generate_rolling_samples(loan_data, obs_window=90, perf_window=90, step=30):
samples = []
max_date = loan_data['date'].max()
min_date = loan_data['date'].min()
# 从最早可用日期开始滑动
current_end = min_date + timedelta(days=obs_window + perf_window)
while current_end <= max_date:
obs_start = current_end - timedelta(days=obs_window + perf_window)
obs_end = current_end - timedelta(days=perf_window)
perf_end = current_end
# 提取观察期数据
obs_data = loan_data[(loan_data['date'] >= obs_start) & (loan_data['date'] < obs_end)]
# 提取表现期标签
perf_label = loan_data[(loan_data['date'] >= obs_end) & (loan_data['date'] < perf_end)]
# 聚合特征与标签
sample = aggregate_features(obs_data)
sample['label'] = 1 if any(perf_label['overdue_days'] >= 30) else 0
sample['snapshot_date'] = perf_end
samples.append(sample)
current_end += timedelta(days=step)
return samples
关键校验:在生成滚动样本后,务必检查每个切片中“表现期结束日期”是否严格大于“观察期结束日期”。任何时间倒挂的样本都应直接剔除,防止未来信息泄露导致模型评估虚高。
4.6 观察期与表现期的参数调优建议
- 网格搜索:在开发阶段,对观察期长度(60/90/120天)、表现期长度(60/90/120天)、步长(15/30/45天)进行组合遍历,以KS或AUC为评估指标选择最优参数组。
- 业务对齐验证:最优参数组需与催收策略的“首次联系时间”、“承诺还款期限”等业务节点对齐,避免模型输出与作业节奏脱节。
- 稳定性监控:上线后持续监控各窗口切片的样本分布(如逾期率、特征均值),若某切片分布发生突变,需检查数据源或业务规则是否变更。
最佳实践:建议在模型上线前,使用至少12个月的历史数据回测滚动窗口参数。观察期与表现期的长度比例建议保持在1:1至2:1之间,避免表现期过短导致右截断偏差,或过长导致样本量不足。