催收成本在单体经济中的分析
作者:互联网
在信贷业务中,一个产品是否盈利取决于收益和成本。收益来源于产品的利率以及罚金,成本则包括获客、坏账、催收、人力等。这篇文章主要是讲催收成本在单体经济中的占比分析,这也是领导经常关心的问题,毕竟做业务赚不赚钱才是最重要的。关于催收成本及单体经济的分析,这块网上几乎没有资料,因此本人结合工作中的一点思考及实践发表一点想法,方法并不一定正确,望大家多多指正。
目录
1.催收计价方式
2.催收成本在单体经济中占比
3.各资产包催收成本分析
4.催收成本的影响因素
5.总结
一、催收计价方式
催收计价方式有坐席制、费率制、计件制三种,各有其优缺点,但通过换算最后的成本应该是一样的。这点在之前的文章中【贷后运营管理】有提及过。因此本文接下来的催收成本计算方式都按计件制来预估,如果非此种方式结佣,可将催收成本换算成计件制单价后再进行预估。
假设本文产品为件均1000元12期的小额分期,催收按M1单价20元,M2单价50元,后端案件由于回收率较低常按费率制计算,占催收成本的比值较小,因此粗略估算的话可不考虑,预估完M1-M2的催收成本后再适当进行放大即可。
二、催收成本在单体经济中的占比
在业务开始初期,设计信贷产品时需要做盈利测算(P&L测算)。比如该产品毛收益在10%,其中去掉获客1%、坏账3%、催收1%,净收益在5%。这里催收的1%其实和坏账的3%是强相关的,坏账越高相应的催收成本也就越高,所以一般都是预估一下产品的坏账,然后直接估一下相应的催收成本。一款额度为1000元的产品,按上述测算,一个客户盈利100元,期望催收成本10元,可以等数据有表现之后根据逾期表现进行预估。下面介绍一下预估的方法:
列出当前所以客户的还款历史、当前期数,根据还款历史计算其发生M1逾期、M2逾期的次数。
计算出每一种还款历史的个数以及占比。
将还款历史的占比与还款历史对应的催收成本相乘并累加,即得到期望催收成本。
为了便于理解,列出下表会更为直观易懂:
实际情况中还款历史的类型会有很多种,上表中未全部列出,大致思路是如上。这样计算出来一个期望催收成本,可以理解为当前时点在每一个人身上花费的催收成本。除此之外,还需要计算一下当前的期望账龄,方法同上,比如一个12期的产品当前情况下的期望账龄是6.4,期望催收成本是3.2元,则其12期之后的期望成本是3.2/6.4*12=6元。再考虑到上面只计算的是M1-M2的催收成本,然后可根据每月催收成本中M3+以上的成本占比进行折算,比如M3+以上成本占20%,则期望催收成本应为6*(1+20%)=7.2元。
下面是上面实现过程的代码:
conn=pymysql.connect(host='',user='',password='',db='')
df=pd.read_sql('select app_id,\
repayment_history,length(repayment_history)as mob,length(repayment_history)-length(replace(repayment_history,1,"")) as M1, \
length(repayment_history)-length(replace(repayment_history,2,"")) as M2 \
from XX ',conn)
df['个数']=df.groupby(['repayment_history'])['app_id'].transform('count')
df['占比']=df['个数']/df.shape[0]
df['催收成本']=df['M1']*20+df['M2']*50
df['期望催收成本']=df['催收成本']*df['占比']
df_unique=df[['repayment_history','个数','占比','催收成本','期望催收成本']].drop_duplicates()
print(sum(df_unique['期望损失']))
三、各资产包催收成本分析
其实这和Vintage有点类似,只不过Vintage是反应每个资产包每一期的资产情况,而各资产包的催收成本则是将每个资产包的M1、M2个数进行累加,反映的是整个生命周期内该包资产的催收成本,可以借此预估资产包的损益情况。此外,还可以考虑收取的罚金,即每包资产对应的催收成本减去每包资产对应的罚金,步骤大致如下:
通过mob统计每包资产每一期的M1个数、M2个数。
通过还款计划表统计每包资产每一期的罚金收取情况。
将每个资产包的M1个数、M2个数、每期罚金进行累加计算,得到催收成本。
第一步的sql代码如下,将得到的文件输出为excel“催收成本”:
select a.*,b.cnt,b.principalsum from (
select date_format(open_date,'%Y-%m') as open_month,mob,
sum(case when 当期状态=1 then 1 else null end ) as 'm1',
sum(case when 当期状态=2 then 1 else null end ) as 'm2'
from mob表
group by date_format(open_date,'%Y-%m'),mob)a
inner join
(select date_format(open_date,'%Y-%m') as open_month,count(distinct app_id)as cnt,sum(principal) as principalsum
from 放款件表
group bydate_format(open_date,'%Y-%m'))b
on a.open_month=b.open_month
第二步的sql代码如下,将得到的文件输出为excel“罚金”:
select date_format(app_create_time,'%Y-%m') as open_month,period,sum(pay_punitive) from `还款计划表` a
group by date_format(app_create_time,'%Y-%m'),period
为了便于理解,选取某个月的资产包以及计算结果如下:
将催收成本占比绘制成图,就得到类似Vintage的一条曲线,但是这条曲线不会走平。如果M1的个数随着账期深入维持在相对稳定得水平,那么催收成本的vintage则会呈线性上升的趋势。
四、催收成本的影响因素
影响催收成本的因素有很多,大致列举如下:
1.客群风险。
前端风控坏账水平和催收成本指标是强相关的。风控做得好,进件质量好,逾期水平自然就低,相应的催收成本就低。这是影响催收成本最重要的因素。
2.贷后策略
由于一些件均较小的产品自然回收率较高且产品对催收成本较敏感,因此对部分客群进行延缓催收的策略,目的也是为了降低催收成本,这一块在之前的文章【贷后策略】中提到过。
3.催收管理
催收管理运营是一个比较复杂的过程,需要催收系统、语音系统、短信系统等联动起来,在良好的系统的支撑下最大化催收员的效率,达到降本增效的结果。
前端风控的好坏会直接影响到每月产生的逾期个数,因此不会影响上面催收成本的计算。
贷后缓催策略(主要是针对M1),意味着mob表中产生的逾期并不会全部入催,因此需要对逾期个数进行折算。这个问题最准确的处理办法是对mob表中每个订单每一期的状态打上标签—是否命中缓催策略且缓催期内是否回收。如果无法做到准确打标的话,则相对简单的方法是对单价打折,比如对20%的客户实施缓催策略,缓催期内回收率为50%,则催收成本变为原来的90%(1-20%*50%),即从20元变成18元。
催收管理的影响也可以变换到对单价的影响上,比如在没有语音系统的情况下,催收员一个月最多打300个M1案子,在有语音系统的情况下可以打600个M1的案子,因此折算成单价就会从20元变成10元。
下面以一个例子,考虑上述影响因素,简单介绍催收成本的计算方式:
上图中考虑了两种因素。一是4月份上线缓催策略,预估降低10%的催收成本;二是9月份调整单价,降为原来的一半。因此需要对各资产包在4月份以及9月份之后的资产表现采用新的单价进行计算,如上表中就会有3种单价。反映在催收成本的Vintage曲线上如下:
上述计算方式的实现过程代码如下,输入文件为第三部分中导出两个excel文件:
def pro_detail(df):
df.replace(np.nan,0,inplace=True)
#根据mob、放款月计算出表现月时间
df['表现月']=df.apply(lambda x:pd.to_datetime(x['放款月'])+relativedelta(months=x['mob']),axis=1)
df.sort_values(['产品线','放款月','mob'],inplace=True)
#累加求和
df['sum_m1']=df.groupby(['产品线','放款月'])['M1'].transform('cumsum')
df['sum_m2']=df.groupby(['产品线','放款月'])['M2'].transform('cumsum')
return df
def pro_punitive(df):
df.replace(np.nan,0,inplace=True)
df.sort_values(['产品线','放款月','mob'],inplace=True)
df['sum_punitive']=df.groupby(['产品线','放款月'])['罚金'].transform('cumsum')
return df
def merge(df1,df2):
df=pd.merge(df1,df2,on=['产品线','放款月','mob'])
df.loc[df['表现月']<'2020-03','催收成本']=(df['sum_m1']*20+df['sum_m2']*50)
for index,row in df.iterrows():
if row['表现月'].strftime('%Y-%m-%d')>='2020-03-01' and row['mob']>=2:#如果mob为1会直接使用上个月的资产包的结果再进行累加
df.ix[index,'催收成本']=df.ix[index-1,'催收成本']+row['M1']*18+row['M2']*45
if row['表现月'].strftime('%Y-%m-%d')>='2020-09-01':
df.ix[index,'催收成本']=(df.ix[index-1,'催收成本']+(row['M1']*9+row['M2']*22.5)
df['催收成本占比_剔除罚金']=(df['催收成本']-df['sum_punitive'])/df['放款本金']
df['催收成本占比_未剔除罚金']=(df['催收成本'])/df['放款本金']
return df
def main():
# 读取催收成本文件并进行累加计算
df_detail=pd.read_excel('催收成本.xlsx')
df1=pro_detail(df_detail)
#读取罚金文件并进行累加计算
df_punitive=pd.read_excel('罚金.xlsx')
df2=pro_punitive(df_punitive)
#将累加之后的催收成本和罚金进行合并并计算催收成本
df_last=merge(df1,df2)
#将结果输出成excel
df_last.to_excel('催收成本占比分析.xlsx')
if __name__=='__main__':
main()
五、总结
催收成本的分析更多地是财务方面计算的事情,上述计算方式从资产包的角度对催收成本进行分析,这是比较客观且正确的方式。但是上述计算方式中仍存在诸多不足,比如只考虑了M1和M2的成本、需要换算成计件制等,因此只是一个大致的预估,可以以此对业务有更准确的把控,实现对资产的精细化运营。
>【作者】:Labryant
>【原创公众号】:风控猎人
>【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
>【转载说明】:转载请说明出处,谢谢合作!~
标签:df,单体,催收,M1,M2,mob,成本 来源: https://blog.csdn.net/lc434699300/article/details/111462314