3. 滚动率基础概念:什么是滚动率(Roll Rate),滚动率矩阵的构建逻辑
3.1 滚动率的定义与业务含义
滚动率(Roll Rate)是信贷风控中衡量资产质量迁移的核心指标。它描述的是:处于某一逾期状态(如 M1)的账户,在下一个观察周期(通常为一个月)结束时,有多少比例迁移到了更严重的逾期状态(如 M2)。
滚动率直接反映了借款人的还款意愿与还款能力的变化趋势,是构建逾期预测模型、计提拨备、制定催收策略的基础。
核心公式:
Roll Rate (Mx → M(x+1)) = (期末处于 M(x+1) 的账户数) / (期初处于 Mx 的账户数)
Roll Rate (Mx → M(x+1)) = (期末处于 M(x+1) 的账户数) / (期初处于 Mx 的账户数)
例如:若月初有 1000 个 M1 账户,月末有 300 个变成了 M2,则 M1→M2 的滚动率为 30%。
3.2 滚动率矩阵的构建逻辑
滚动率矩阵是将不同逾期状态之间的滚动率汇总在一个二维表格中,形成对资产质量迁移的全景视图。构建逻辑分为以下 4 个步骤:
- 确定观察窗口:通常以月为周期(如 30 天),对齐账单周期。
- 划分逾期状态:定义 C(正常)、M1(1-30天)、M2(31-60天)、M3(61-90天)等状态。
- 计算状态迁移:统计每个状态在期初的账户数,以及期末迁移到各状态的账户数。
- 填充矩阵:将迁移比例填入矩阵,行表示期初状态,列表示期末状态。
业务洞察: 滚动率矩阵中,对角线附近的数值通常较高(如 M1→M2),而跨多级迁移(如 M1→M3)的比例极低,这符合逾期恶化的渐进性规律。
3.3 滚动率矩阵示例
下表展示了一个典型的月度滚动率矩阵(数据为模拟值):
| 期初 \ 期末 | C(正常) | M1 | M2 | M3+ |
|---|---|---|---|---|
| C(正常) | 95.0% | 4.5% | 0.4% | 0.1% |
| M1 | 40.0% | 30.0% | 25.0% | 5.0% |
| M2 | 10.0% | 15.0% | 35.0% | 40.0% |
| M3+ | 2.0% | 3.0% | 5.0% | 90.0% |
从矩阵中可以读出关键信息:
- 正常账户:95% 保持正常,仅 4.5% 滑入 M1,说明资产质量整体稳定。
- M1 账户:40% 回落到正常(还款),但 25% 滚动到 M2,5% 直接进入 M3+,需要重点干预。
- M2 账户:仅 10% 能回到正常,40% 继续恶化至 M3+,催收难度显著上升。
- M3+ 账户:90% 停留在该状态或进一步恶化,基本进入坏账区间。
3.4 滚动率与逾期预测模型的关系
滚动率矩阵是逾期预测模型的标签定义依据和校准基准:
- 定义好坏样本:通过滚动率判断哪些逾期是暂时的(会回滚),哪些是恶化的(会继续滚动),从而区分“技术性逾期”与“实质性违约”。
- 校准模型输出:模型预测的逾期概率应与历史滚动率分布一致,若偏差过大则需调整模型阈值或特征。
- 计算损失率:结合滚动率与回收率,可估算不同逾期阶段的预期信用损失(ECL)。
常见误区: 滚动率不是静态的,它会随宏观经济、催收策略、客群结构变化而波动。模型开发时应使用多个时间窗口的滚动率矩阵进行交叉验证,避免过拟合到单一周期。
3.5 滚动率矩阵构建流程图
下图展示了从原始还款数据到滚动率矩阵的完整构建流程:
3.6 滚动率矩阵的典型应用场景
| 应用场景 | 具体方法 | 业务价值 |
|---|---|---|
| 催收策略分层 | 根据 M1→M2 滚动率高低,将账户分为高、中、低风险组 | 差异化配置催收资源,提升回款率 15-20% |
| 拨备计提 | 结合滚动率与回收率,计算各阶段的预期损失率 | 满足 IFRS 9 准则要求,拨备覆盖率更精准 |
| 模型标签定义 | 以滚动率是否超过阈值(如 50%)定义“坏客户” | 避免将短期逾期误判为坏账,提升模型区分度 |
| 资产证券化定价 | 用滚动率矩阵预测资产池未来现金流 | 合理定价 ABS 产品,降低发行风险 |
3.7 构建滚动率矩阵的代码示例(Python)
以下代码展示了如何用 Python 从账户级还款数据构建滚动率矩阵:
import pandas as pd
import numpy as np
# 模拟账户月度状态数据
# 列:account_id, month, status (C/M1/M2/M3+)
df = pd.read_csv('account_status.csv')
# 定义状态顺序
status_order = ['C', 'M1', 'M2', 'M3+']
# 构建期初和期末状态
df_begin = df[df['month'] == '2024-01'].copy()
df_end = df[df['month'] == '2024-02'].copy()
# 合并得到迁移对
merged = pd.merge(
df_begin[['account_id', 'status']].rename(columns={'status': 'begin_status'}),
df_end[['account_id', 'status']].rename(columns={'status': 'end_status'}),
on='account_id', how='inner'
)
# 计算迁移矩阵
migration_matrix = pd.crosstab(
merged['begin_status'],
merged['end_status'],
normalize='index'
)
# 按状态顺序重排行列
migration_matrix = migration_matrix.reindex(
index=status_order, columns=status_order, fill_value=0
)
# 转换为百分比
roll_rate_matrix = migration_matrix * 100
roll_rate_matrix = roll_rate_matrix.round(1)
print("滚动率矩阵(%):")
print(roll_rate_matrix)
代码要点:
- 使用
pd.crosstab(normalize='index')自动计算行归一化的迁移比例。 - 通过
reindex确保矩阵的行列顺序与业务定义一致,避免状态错位。 - 实际生产环境中需处理账户注销、新增账户等边界情况,建议使用左连接并填充缺失值。