Python:关于RollRate&Vintage的研究与应用

文章介绍了如何利用Python进行金融数据分析,特别是针对逾期贷款的风险评估。通过RollRate计算不同逾期天数转化为坏账的概率,以及运用Vintage分析放款质量,关注放款后的逾期比率、逾期分布和成熟期。文章提供了详细的代码示例,展示了如何处理和计算逾期率,并绘制Vintage图表以展示客户表现趋势。

RollRate:在当前催收水平下,不同逾期天数转换为坏账的概率。

Vintage:通过账龄分析评估放款的质量。其中,逾期率的计算有两种方式。
第一种:应收口径下,风险偏好偏保守。分子:已逾期的借款其所有已到期但未还本金和未到期本金,全部计入逾期未还本金中; 分母:贷款本金。具体公式
如下:
𝑜𝑑𝑢𝑒_𝑟𝑎𝑡𝑒=(𝑐𝑢𝑟𝑟𝑒𝑛𝑡_𝑜𝑑𝑢𝑒_𝑎𝑚𝑡+𝑛𝑜_𝑑𝑢𝑒_𝑎𝑚𝑡)𝑙𝑜𝑎𝑛_𝑎𝑚𝑡

第二种:各借款已经到期的借款。分子:已逾期的借款其所有已到期但未还本金。分母:已到期各期本金总和。具体公式如下:
𝑜𝑑𝑢𝑒_𝑟𝑎𝑡𝑒=𝑐𝑢𝑟𝑟𝑒𝑛𝑡_𝑜𝑑𝑢𝑒_𝑎𝑚𝑡𝑑𝑢𝑒_𝑙𝑜𝑎𝑛_𝑎𝑚𝑡

其中:MOB指放款后对应的第N个月月底。

对于Vintage的表现,建议关注以下几个方面:
放款后表现:观察每月审批通过后的客户第N个月的逾期比率,对比每月波动。通常波动与审批策略调整有关,
此波动在数据准备阶段的样本抽样过程需要关注。 逾期分布:
逾期分布集中在通过后的前三个月说明审批的策略有待改进,超过三个月之后才慢慢增加,说明贷中的管理 有待提高。
成熟期:确定逾期率在经历第N期趋于稳定。

标签界定多考虑,看完流转看账龄

mport pandas as pd
import numpy as np
from pandas import DataFrame, Series
import warnings

warnings.filterwarnings(action='ignore')
with open(r'F:\知识与学习\Python\Finance\Vintage\loan_detail.xlsx', 'rb') as f:
    loan = pd.read_excel(f)
loan.shape

(253059, 10)

loan.sample(5)

在这里插入图片描述

loan.columns = loan.columns.str.lower()
for col in ['bill_reg_dt', 'perd_str_dt', 'perd_due_dt']:
    loan[col] = loan[col].map(lambda x: datetime.strptime(str(x), '%Y%m%d'))
# 将结清日期转换为日期格式。将缺失值填充为2099-01-01。
loan['perd_off_dt'] = loan['perd_off_dt'].map(
    lambda x: datetime.strptime(str(int(x)), '%Y%m%d') if x > 0
    else datetime.strptime('20990101', '%Y%m%d'))
loan['MOB'] = loan['perd_num'].map(lambda x: 'MOB' + str(x))
loan.loc[loan['bill_no'] == 'BILL2019040217271500079112', :]

在这里插入图片描述
按照第一种方法(应收口径)计算Vintage

# 计算分子中的逾期应还本金。逾期应还本金包括:逾期应还而未还本金和未到期用户本金。
# 提取所有订单明细。
bill_nos = pd.unique(loan['bill_no'])
date = datetime(year=datetime.today().year, month=datetime.today().month, day=1) - timedelta(days=1)
date = datetime(year=date.year, month=date.month, day=25)
# 对于在当前日期尚未到期的用户同一清除。
loan = loan.loc[(date - loan['perd_due_dt']).map(lambda x: x.days) > 0, :]
loan.head()

在这里插入图片描述

dct = dict()

for bill_no in bill_nos:
    part = loan.loc[loan['bill_no'] == bill_no, :]
    part = part.sort_values(['perd_num'])
    
    # 计算截至每一期期末应还本金的累计金额。
    part['cum_sum_amt'] = part['perd_prcp_amt'].cumsum()

    # 分期计算各期的还款情况。
    perds = pd.unique(part['perd_num'])

    for perd in perds:
        part_perd = part.loc[part['perd_num'] <= perd, :]

        # 计算每一期期末的日期,用于比较是否已经还款和历史最大逾期天数。
        due_date = max(part_perd['perd_due_dt'])
        due_amt = max(part_perd['cum_sum_amt'])
        
        # 计算与MOB期末的时间间隔。
        part_perd['delta_days'] = (due_date - part_perd['perd_due_dt']).map(lambda x: x.days)
        # 只要在MOB期末最后一天及以前显示还款(即还清时间小于MOB期末时间),则对应的期数不再纳入最大逾期天数的计算。
        part_perd['is_payoff'] = (due_date - part_perd['perd_off_dt']).map(lambda x: x.days)

        # 计算累计还款金额。
        payoff_amt_df = part_perd.loc[part_perd[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rubyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值