额度模型(一)

时间:2022-07-22
本文章向大家介绍额度模型(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在实际的工作中,我们会发现额度分配没有固定的标准,不同的人做出来的结果都有一定的差异,甚至根据感觉或经验拍拍脑袋就把额度分配了。根据经验指定额度未尝不可,甚至有时根据经验指定的额度往往也比较有效,但是做风险管理都希望有数据的量化支撑,或当别人问的时候,可以拿出强有力的证据说明自己是经过量化测算而得出的结果。

本文所讨论的问题是这样的一个场景:在知道额度区间和平均额度的条件下如何分配额度。

原理介绍

已知条件:

  • Amin:最小额度
  • Amax:最大额度
  • Aave:平均额度
  • LD:违约损失率
  • 风险评分模型(为了风险排序和违约率预测)
  • 风险定价(即不同风险水平的利率已制定)

1、如果根据已排序好的人数均匀分配额度,得到的平均额度等于0.5*(Amin+Amax),即下图中梯形的面积,当Aave恰好等于0.5*(Amin+Amax)时,这么分配没多大问题,否则很难进行调整以使平均额度等于Aave。

2、如果将上述额度曲线调整成两段的形式,如下图,选择适当的q0和a0就能使图中阴影部分的两个梯形面积之和(即平均额度)等于Aave,并且这样的q0和a0有很多。

3、那么如何选择q0和a0呢?

(1)如果假设q0为某一确定值,然后根据两梯形面积之和等Aave,就能求得a0,即解下面方程

求得a0,这里要注意的是a0的范围在区间(Amin, Amax)内,此时就能得到两段额度曲线了;

(2)根据风险评分排序,将人群按照等频或等距或其他认为合理的方式切分成n段,每段的人数占比为

,然后将每段的分位数中心值带入额度曲线计算每段的基础额度

。比如假设n=10,且等频切分,则每段的人数占比为0.1,然后将每段的中心值即[0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95]带入额度曲线计算每段的基础额度。假设每段的违约率为

,每段的利率为

。此时可以计算预期利润:

(3)通过枚举法,找到使预期利润最大的q0和a0;

4、根据最优的q0和a0,得到最优额度曲线,然后求得最优的每段基础额度。如果有收入评分(或其他类型的评分),那么可以利用二维矩阵,在基础额度的基础上,根据收入评分,对每段人群的额度再进行进一步细致的分配,如分配不同的系数、等差分配等。

Python实现

这里以等频切分成10段为例,违约损失率LD、每段的利率R、每段的违约率PD已做了设定:

def fa(Amin, Amax, Aave):
    # Amin: 最小额度
    # Amax:最大额度
    # Aave:平均额度
    # return:返回最优的每段基础额度
    
    ## 枚举法计算不同的q0对应的a0
    q0 = np.arange(0.01, 1, 0.01)
    a0 = []
    for i in q0:
        a = sp.symbols('a') # 定义方程变量符号
        d = sp.solve([Aave-(Amin+a)*i*0.5-(a+Amax)*(1-i)*0.5], [a]) # 求解方程
        a0.append(np.float(d[a]))
        
    a0 = np.array(a0)
    q0 = q0[(a0>Amin) & (a0<Amax)]
    a0 = a0[(a0>Amin) & (a0<Amax)]
    
    ## 计算每个q0值对应的Profit
    # 等频切分成10段, 违约损失率LD,每段利率R,每段违约率PD
    LD = 0.8
    R = np.array([0.24, 0.24, 0.24, 0.18, 0.18, 0.18, 0.18, 0.12, 0.12, 0.12])
    PD = np.array([0.2, 0.18, 0.15, 0.13, 0.11, 0.10, 0.09, 0.08, 0.06, 0.04])
        
    As = [] # 每段基础额度
    Profit = [] # 预期利润
    
    for qi, ai in zip(q0, a0):

        def g(x): 
            if x < qi:
                A = (ai-Amin)/qi*x + Amin
            else:
                A = (Amax-ai)/(1-qi)*(x-qi) + ai
            return A
        
        As_t = np.array([[x, g(x)] for x in np.arange(0.05, 1, 0.1)])
        As.append(As_t)
        Profit_t = sum(0.1*(As_t[:,1]*(1-PD)*R-As_t[:,1]*PD*LD))
        Profit.append(Profit_t) 
        
    Profit = np.array(Profit)
    As = np.array(As)
            
    idx = Profit.argmax()
    Profit_opt = Profit[idx]    
    q0_opt = q0[idx]
    a0_opt = a0[idx]
    As_opt = As[idx]
    
    # 绘图
    plt.figure(figsize=(8, 10))
    plt.rcParams['font.sans-serif'] = ['Simhei']
    # 预期利润曲线
    plt.subplot(211)        
    plt.plot(q0, Profit, color='b')    
    plt.hlines(Profit_opt, 0, q0_opt, color='gray', linestyle='--')
    plt.vlines(q0_opt, 0, Profit_opt, color='gray', linestyle='--')
    plt.xlim([min(q0), max(q0)])
    plt.ylim([min(Profit)*0.995, max(Profit)*1.005])
    plt.xlabel('分位数')
    plt.ylabel('期望利润')
    plt.title('预期利润曲线 MaxProfit occurs at q0=%s' % (round(q0_opt, 2)))    
    # 最优额度曲线
    plt.subplot(212)
    plt.plot([0, q0_opt], [Amin, a0_opt], color='b')
    plt.plot([q0_opt, 1], [a0_opt, Amax], color='b')
    plt.hlines(a0_opt, 0, q0_opt, color='gray', linestyle='--')
    plt.vlines(q0_opt, 0, a0_opt, color='gray', linestyle='--')
    plt.xlim([0, 1])
    plt.ylim([0, Amax])
    plt.xlabel('分位数')
    plt.ylabel('额度')
    plt.title('最优额度曲线 q0:%s a0:%s'% (round(q0_opt,2), int(a0_opt)))
           
    return As_opt

1、假设Amin=1000,Amax=50000,Aave=30000:

Amin = 1000
Amax = 50000
Aave = 30000        
As_opt = fa(Amin, Amax, Aave)    

(1)预期利润曲线和最优额度曲线为:

(2)最优的每段基础额度如下,可以计算此时的平均额度为30049:

2、假设Amin=1000,Amax=50000,Aave=10000:

Amin = 1000
Amax = 50000
Aave = 10000        
As_opt = fa(Amin, Amax, Aave)

(1)预期利润曲线和最优额度曲线为:

(2)最优的每段基础额度如下,可以计算此时的平均额度为10000:

(3)如果有收入评分,我们用二维矩阵对额度进行进一步分配,假设根据收入评分等级,进行等差分配,得到最终额度,然后在此基础上可以根据需要进行人工调整。

总结

1、本文所使用的的额度模型是两段额度曲线,操作比较方便,当然还有其他类型的函数可以使用,可以多尝试。

2、正如前面所述,假定条件是风险评分模型要有一定的排序能力以及知道预测的违约概率,排序能力和预测精度越好,额度分配越精确。有些时候,比如某业务刚开始展业,没有历史数据的积累,只能采购外部评分,这时需要根据业务的实际情况对违约概率进行估计(可参考模型预测概率的修正)。这种情况下,排序能力和预测精度都很难保证,这时可以先进行简化处理,不使用最优方法,如下图所示,直接指定折点处的额度(比如平均额度Aave),然后计算出q0,从而得到额度曲线。