3. 滚动率基础概念:什么是滚动率(Roll Rate),滚动率矩阵的构建逻辑

3.1 滚动率的定义与业务含义

滚动率(Roll Rate)是信贷风控中衡量资产质量迁移的核心指标。它描述的是:处于某一逾期状态(如 M1)的账户,在下一个观察周期(通常为一个月)结束时,有多少比例迁移到了更严重的逾期状态(如 M2)。

滚动率直接反映了借款人的还款意愿与还款能力的变化趋势,是构建逾期预测模型、计提拨备、制定催收策略的基础。

核心公式:
Roll Rate (Mx → M(x+1)) = (期末处于 M(x+1) 的账户数) / (期初处于 Mx 的账户数)

例如:若月初有 1000 个 M1 账户,月末有 300 个变成了 M2,则 M1→M2 的滚动率为 30%。

3.2 滚动率矩阵的构建逻辑

滚动率矩阵是将不同逾期状态之间的滚动率汇总在一个二维表格中,形成对资产质量迁移的全景视图。构建逻辑分为以下 4 个步骤:

  1. 确定观察窗口:通常以月为周期(如 30 天),对齐账单周期。
  2. 划分逾期状态:定义 C(正常)、M1(1-30天)、M2(31-60天)、M3(61-90天)等状态。
  3. 计算状态迁移:统计每个状态在期初的账户数,以及期末迁移到各状态的账户数。
  4. 填充矩阵:将迁移比例填入矩阵,行表示期初状态,列表示期末状态。
业务洞察: 滚动率矩阵中,对角线附近的数值通常较高(如 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 滚动率矩阵构建流程图

下图展示了从原始还款数据到滚动率矩阵的完整构建流程:

滚动率矩阵构建流程图 原始还款数据 逾期状态划分 期初/期末状态快照 状态迁移计数 滚动率矩阵 关键参数 • 观察周期:30天 • 状态粒度:C/M1/M2/M3+ • 计算方式:比例 = 迁移数/期初数 • 输出:二维迁移概率表

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 确保矩阵的行列顺序与业务定义一致,避免状态错位。
  • 实际生产环境中需处理账户注销、新增账户等边界情况,建议使用左连接并填充缺失值。