催收成本在单体经济中的分析

       在信贷业务中,一个产品是否盈利取决于收益和成本。收益来源于产品的利率以及罚金,成本则包括获客、坏账、催收、人力等。这篇文章主要是讲催收成本在单体经济中的占比分析,这也是领导经常关心的问题,毕竟做业务赚不赚钱才是最重要的。关于催收成本及单体经济的分析,这块网上几乎没有资料,因此本人结合工作中的一点思考及实践发表一点想法,方法并不一定正确,望大家多多指正。

 

目录

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元,可以等数据有表现之后根据逾期表现进行预估。下面介绍一下预估的方法:

  1. 列出当前所以客户的还款历史、当前期数,根据还款历史计算其发生M1逾期、M2逾期的次数。

  2. 计算出每一种还款历史的个数以及占比。

  3. 将还款历史的占比与还款历史对应的催收成本相乘并累加,即得到期望催收成本。

为了便于理解,列出下表会更为直观易懂:

催收成本在单体经济中的分析

       实际情况中还款历史的类型会有很多种,上表中未全部列出,大致思路是如上。这样计算出来一个期望催收成本,可以理解为当前时点在每一个人身上花费的催收成本。除此之外,还需要计算一下当前的期望账龄,方法同上,比如一个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个数进行累加,反映的是整个生命周期内该包资产的催收成本,可以借此预估资产包的损益情况。此外,还可以考虑收取的罚金,即每包资产对应的催收成本减去每包资产对应的罚金,步骤大致如下:

  1. 通过mob统计每包资产每一期的M1个数、M2个数。

  2. 通过还款计划表统计每包资产每一期的罚金收取情况。

  3. 将每个资产包的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  
>【原创公众号】:风控猎人  
>【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。  
>【转载说明】:转载请说明出处,谢谢合作!~

 

 

 

 

 

 

 

上一篇:echarts


下一篇:成功解决raise ValueError(‘No model found in config file.‘) ValueError: No model found in config file.