Vintage账龄分析表计算底层逻辑(Python实操)

大家好,我是东哥。

信贷风控领域中,经常用到账龄Vintage报表,这是入门初学者的难点之一,因为它涉及到用户还款、逾期等多种行为以及业务上的多种统计口径,因此很多朋友一直无法将逻辑梳理清楚。本次来给大家详细介绍Vintage报表的底层计算逻辑是什么样的。

出品人:东哥起飞
原创:👉原创大数据风控课程《100天风控专家》

一、4个统计时点

以2022-11放款月份为例,各个MOB对应的M2+逾期率为:

MOB1的M2+逾期率=MOB1的M2+逾期金额/2022年11月总放款金额=0

MOB2的M2+逾期率=MOB2的M2+逾期金额/2022年11月总放款金额=0.95%

MOB12的M2+逾期率=MOB12的M2+逾期金额/2022年11月总放款金额=3.22%

通用公式:MOB(N)的M2+逾期率=MOB(N)的M2+逾期金额/xx放款月份的总放款金额

要计算每个单元格的逾期率,需要首先了解4个统计时点:应还款日、实际还款日、MOB观察日,当前观察日。

  • 应还款日:还款计划生成后,确定了每个月的还款日。有两个方式,第一种是还款日根据放款日而定,比如2022年11月10日放款,那么后续每个月10号还款,第二种是所有客户都是同一还款日,比如所有客户都在每个月的21号还款。

  • 实际还款日:客户实际的还款日,由客户还款行为决定,与应还款日比较以后可有三种方式,提前还款、按时还款、逾期不还。

  • MOB观察日:每个MOB月的观察时点,也分为两种,一种是期末时点,一种是月末时点。

  • 当前观察日:就是假设你站在了某个时点,然后对历史每个月放款后各MOB逾期数据的回看。与前三个时点不同,当前观察日不是周期性产生的,而是固定不变的,对于所有放款月都一样。

总结一下,在进行Vintage计算之前需要确认几个事项:

  • 当前观察日是哪天?
  • MOB观察日的口径,是月末时点,还是期末时点?
  • 观察逾期的口径,是当前current逾期,还是曾经ever逾期?
  • 金额口径还是订单口径?

实际业务场景中,比较常用的是“MOB月末时点观测+当前逾期口径+逾期未结清余额”的逾期率口径。

以上4个都确定以后,剩下就看应还款日和实际还款日了,而应还款日是根据产品设计而定的,因此只有实际还款日是不确定的。实际还款日是由客户行为决定的,可以发生在任何的时间点,所以根据实际还款日的不同发生位置,就会产生多种情况。

二、逾期天数计算

第一种是,当应还日超过当前观察日的时候,也就是应还日还在未来,是未发生的事,因此我们无法判断。

第二种是,应还日在当前观察日之内了,属于我们可以观察到的历史数据了。此时,如果实际还款日在应还日当天或者之前,说明是正常还款,未发生逾期,因此逾期天数为0。

第三种是,实际还款日在应还日和mob观察日之间,说明虽然逾期了,但在mob观察日之前还上了。此时如果是当前逾期的口径,那么在mob月底观察是未发生逾期的,那么逾期天数为0;如果是曾经逾期口径,那么就发生过逾期了,逾期天数=实还日-应还日=5

第四种是,实际还款日在mob观察日之后,虽然也还了,但晚于mob观察点,因此当前逾期与曾经逾期口径是一样的,逾期天数都=MOB观察日-应还款日=21

第五种是,从应还日一直到当前观察日,客户一直没有还款动作,也就是一直未结清。因此当前逾期与曾经逾期口径也是一样的,逾期天数都=MOB观察日-应还款日=21

三、逾期金额计算

前面我们根据4个统计时点,计算出每个客户在各个mob下的逾期状态和逾期天数。

  • 逾期天数可以转化为逾期期数,比如M1+/M2+/M3+等等,因此我们就可以观察M1+/M2+/M3+的逾期率在vintage账龄下的趋势。

  • 通过各mob的逾期状态判断,我们也可以统计出逾期的剩余未还本金,也就是我们前面所要求的金额逾期率口径的分子。

四、逾期率计算逻辑

五、Python代码实操

对于核心部分逾期天数和金额计算的Python代码展示如下。

############################逾期标识#########################################
# 加工出逾期标志
# VX搜:100天风控专家
# 原创作者:东哥起飞
data_all_1['odu_flag'] = 0
data_all_1.loc[(data_all_1['actual_repay_date']>data_all_1['obser_month_end'])|(data_all_1['actual_repay_date'].isnull()),'odu_flag'] = 1
data_all_1['odu_flag_sft'] = data_all_1.groupby('order_id')['odu_flag'].transform(lambda x:x.shift(1))
data_all_1['actual_repay_date_sft'] = data_all_1.groupby('order_id')['actual_repay_date'].transform(lambda x:x.shift(1))
data_all_1['odu_first_flag'] = 0
data_all_1.loc[(data_all_1['odu_flag_sft']==1)&(data_all_1['odu_flag']==1)&(data_all_1['actual_repay_date_sft']>data_all_1['obser_month_end']),'odu_first_flag'] = 2
data_all_1.loc[(data_all_1['odu_flag_sft']==1)&(data_all_1['odu_flag']==1)&(data_all_1['actual_repay_date_sft']<=data_all_1['obser_month_end']),'odu_first_flag'] = 1
# 更新剩余本金
data_all_1.loc[data_all_1['odu_first_flag']==1,'balance'] = data_all_1['balance_sft']
data_all_1.loc[(data_all_1['odu_first_flag']==2),'balance'] = np.nan
data_all_1['balance'] = data_all_1.groupby('order_id')['balance'].transform(lambda x:x.ffill())
############################逾期天数#########################################
# 实还未超过月底观测日
data_all_1.loc[(data_all_1['actual_repay_date'].isnull()==False)&(data_all_1['actual_repay_date']<=data_all_1['obser_month_end']),'odu_days'] = 0
# 逾期-首次逾期的
data_all_1.loc[(data_all_1['odu_first_flag']==1),'odu_days'] = (data_all_1['obser_month_end']-data_all_1['expected_date']).dt.days
# 继续逾期的
data_all_1['expected_date_2'] = data_all_1['expected_date']
data_all_1.loc[(data_all_1['odu_first_flag']==2),'expected_date_2'] = np.nan
data_all_1['expected_date_2'] = data_all_1.groupby('order_id')['expected_date_2'].transform(lambda x:x.ffill())
data_all_1.loc[(data_all_1['odu_first_flag']==2),'odu_days'] = (data_all_1['obser_month_end']-data_all_1['expected_date_2']).dt.days

以上是全部。

完整代码如下(真实企业数据+代码实操):

在这里插入图片描述


以上内容是《100天风控专家》报表篇Vintage理论篇节选内容,本专栏共更新100期以上,涵盖业务、产品、策略、模型、数据、系统等6大核心模块,理论+Python代码实操,课件+数据+代码均支持下载学习。规则篇课件内容如下。

Vintage账龄报表,30页PPT,40min视频👇

感兴趣可VX搜:100天风控专家
我是东哥,我们下期再见

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/462478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机系统基础 2 Intel 中央处理器

Intel微处理器的发展史 INTegrated ELectronics&#xff08;集成电子&#xff09;的缩写 先后推出的中央处理器&#xff1a; Intel4004、Intel8008、Intel8080/8085、8086/8088、80186、80286、i386、i486 Pentium&#xff08;奔腾&#xff09;、Pentium II、Pentium III、Pen…

布局Uniswap(UNI)的基本逻辑和bitget钱包使用教程

我们都知道&#xff0c;牛市里板块轮动是很明显的&#xff0c;这个概念涨完下一个概念涨&#xff01; 背后本质是场内的筹码在交换的过程&#xff0c;抓住这种交换的规律&#xff0c;可以大大提高资金的使用效率和总体收益&#xff01; 目前行情继续稳中有进&#xff0c;大饼也…

html--花瓣

代码 <!DOCTYPE html> <html lang"en" ><head> <meta charset"UTF-8"> <title>Petals</title><link rel"stylesheet" href"css/style.css"></head><body><div class"…

记录工作中莫名其妙的bug

1、问题&#xff1a;办公室的电脑突然除了我之外&#xff0c;都不能访问我们的线上系统了 原因&#xff1a;因为是内网&#xff0c;同事有刚刚升级了Windows11&#xff0c;配置的DNS被清了&#xff0c;还有同事换了公司的新电脑&#xff0c;还没有配DNS 位于&#xff1a;C /Win…

postman---postman参数化

我们在做接口测试的过程中&#xff0c;都会遇到同一个接口不同的数据&#xff0c;每次去一个个填写数据就太麻烦了&#xff0c;今天我们一起学习下如何通过postman进行参数化 一、参数化 参数化就是1个接口请求不同的数据&#xff0c;我们可以通过把请求的数据放入到一个文件…

创业板指399006行情数据API接口

# 测试&#xff1a;返回不超过10条数据&#xff08;2年历史&#xff09; https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399006&order2Python示例 import requestsurl f"https://tsanghi.com/api/fin/index/CHN/daily?tokendemo&ticker399…

某团mtgsig1.1和_token逆向

前言 只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目前已成功逆向&#xff01;&#xff01; 1.1版本适用于h5和小程序 使用python调用js逆向脚本&#xff0c;获取mtgsig 效…

【Python使用】python高级进阶知识md总结第4篇:静态Web服务器-命令行启动动态绑定端口号,html 的介绍【附代码文档】

python高级进阶全知识知识笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;操作系统&#xff0c;虚拟机软件&#xff0c;Ubuntu操作系统&#xff0c;Linux内核及发行版&#xff0c;查看目录命令&#xff0c;切换目录命令&#xff0c;绝对路径和相对…

AI健身教练-引体向上-俯卧撑计数-仰卧起坐姿态估计-康复训练姿态识别-姿态矫正

在AI健身应用中&#xff0c;通过关键点检测技术可以实现对用户动作的精准捕捉和分析&#xff0c;从而进行统计计数和规范性姿态识别。 统计计数&#xff1a;比如在做瑜伽、健身操等运动时&#xff0c;系统可以通过对人体关键点&#xff08;如手部、脚部、关节等&#xff09;的…

Xinstall助力web唤起iOS,打破平台壁垒,实现无缝跳转

在移动互联网时代&#xff0c;web与App之间的跳转已成为用户日常使用中不可或缺的一部分。然而&#xff0c;对于iOS系统的用户来说&#xff0c;web唤起App的过程往往充满了挑战和不便。这时&#xff0c;Xinstall作为一款专业的移动开发者服务工具&#xff0c;为开发者们提供了解…

分析型数据库的主要使用场景有哪些?

如今数据已经成为了企业和组织的核心资产。如何有效地管理和利用这些数据&#xff0c;成为了决定竞争力的关键。分析型数据库作为数据处理领域的重要工具&#xff0c;为各行各业提供了强大的数据分析和洞察能力。基于分析型数据库&#xff08;Apache Doris &#xff09;构建的现…

2核4G云服务器能支持多少人同时访问?性能测评来了

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;并发数为10&#xff0c;经阿腾云测试&a…

支付模块-基于消息队列发送支付通知消息

消息队列发送支付通知消息 需求分析 订单服务作为通用服务&#xff0c;在订单支付成功后需要将支付结果异步通知给其他对接的微服务&#xff0c;微服务收到支付结果根据订单的类型去更新自己的业务数据 技术方案 使用消息队列进行异步通知需要保证消息的可靠性即生产端将消息…

【echarts中解决适配窗口大小的问题】

适配窗口大小 一、基础适配方案&#xff1a;remflexible.js布局二、echart图表适配1.resize函数2.使用resize的前提&#xff01;重点&#xff01;不然resize极有可能失效 一、基础适配方案&#xff1a;remflexible.js布局 vscode插件&#xff1a;cssrem 编写好的less文件保存后…

什么又是线程呢??

线程&#xff1a; 线程可以并发的执行&#xff0c;但是线程的地址是可以共享的 进程与线程的比较&#xff1a; 进程>线程 线程分三种&#xff1a; 用户线程 只有用户程序的库函数来 用户线程 因为操作系统感知不到 线程&#xff0c;如果有线程在运行&#xff0c;然后不交…

Docker使用(二)Docker安装和常见典型操作

Docker使用(二)Docker安装和常见典型操作 二、软件安装 1、Docker安装 &#xff08;1&#xff09;环境准备 [rootlocalhost ~]# uname -r 3.10.0-327.el7.x86_64 # cat /etc/os-release &#xff08;2&#xff09;卸载旧版本 $ sudo yum remove docker \ ​ docker-cli…

内衣洗衣机怎么选?推荐四大表现突出的宝藏内衣洗衣机

近年来&#xff0c;家庭洗衣机的标准容量有了很大的提高&#xff0c;从5公斤、6公斤发展到9公斤和10公斤。大容量的洗衣机可以在家里清洗大尺寸的衣服和床单被子。不过&#xff0c;因为洗衣机里的所洗的衣服都是比较混杂的&#xff0c;所以很多时候&#xff0c;由于内衣袜子和婴…

HTML

什么是HTML&#xff1f; HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的 HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息&#xff…

Registry dubbo的注册中心

1. 架构说 注册中心。注册中心&#xff08;Registry&#xff09;在微服务架构中的作用举足轻重&#xff0c;有了它&#xff0c;服务提供者&#xff08;Provider&#xff09; 和消费者&#xff08;Consumer&#xff09; 就能感知彼此。从下面的 Dubbo 架构图中可知&#xff1a;…

零信任SDP是什么,有什么作用

物理边界曾经是可信网络和不可信网络之间的有效分割。防火墙通常部署于网络的边缘&#xff0c;基于静态策略来限制网路流量。位于防火墙内部的用户会被授予较高信任等级来访问企业的敏感资源&#xff0c;因为他们被默认是可信的。 然而随着云计算、移动互联、物联网、人工智能…