来源:https://zhuanlan.zhihu.com/p/349547282本文首发于公众号《大数据建模笔记》。

Vintage是资产质量分析的重要工具,因为Vintage损失率是静态的,所以可以方便分析同一产品不同时间放款的质量变化。但是,不同产品或不同机构的Vintage是无法直接进行比较,比较的前提是必须知道两个必要的条件:产品期数和产品还款方式,然后将Vintage损失率转为年化损失率再进行比较。特别要注意的是:在不知期数和还款方式的情况下,无法准确比较不同产品的Vintage!

Vintage损失率转为年化损失率是测算损失和风险定损的重要方法,那么,如何将Vintage损失率转为年化损失率呢?先从名义利率、内部收益率、年化利率等概念说起。

一、计算方法

已知放款金额A,产品期数T,每期还款本金 【5】*Vintage损失率转为年化损失率 - 图1,每期还款利息 【5】*Vintage损失率转为年化损失率 - 图2 ,Vintage损失率vtg。
1、名义利率APR
名义利率是利息之和与放款本金的比值得到的,一般比真实利率小很多:
【5】*Vintage损失率转为年化损失率 - 图3
2、内部收益率IRR
内部收益率是使净现值NPV为0的折现率IRR:

NPV(Net Present Value)净现值是一项投资所产生的未来现金流的折现值与项目投资成本之间的差值。
净现值=未来现金净流量现值 - 原始投资额现值
净:现金总流入现值和现金总流出现值的差额。
现值:考虑了资金的时间价值,将未来的一笔钱按照某种利率折为现值。

【5】*Vintage损失率转为年化损失率 - 图4 【5】*Vintage损失率转为年化损失率 - 图5
3、年化利率AnnR和年化损失率AnnLoss
本文的年化利率和内部收益率是相同概念,因为计算方法不同才对名称作了区分。年化利率从平均占用本金的角度进行计算;同样的,Vintage损失率转为年化损失率也从平均占用本金的角度进行计算,具体有下面3种方法:
(1)借款期限内的年均占用本金方法
计算借款期限T内的年月均占用本金为:
【5】*Vintage损失率转为年化损失率 - 图6
一年的周转次数:
【5】*Vintage损失率转为年化损失率 - 图7
年化利率:
【5】*Vintage损失率转为年化损失率 - 图8
年化损失率:
【5】*Vintage损失率转为年化损失率 - 图9
(2)一年内的年均占用本金方法
计算一年内的年月均占用本金为:
【5】*Vintage损失率转为年化损失率 - 图10
一年的周转次数:
【5】*Vintage损失率转为年化损失率 - 图11
年化利率:
【5】*Vintage损失率转为年化损失率 - 图12
年化损失率:
【5】*Vintage损失率转为年化损失率 - 图13
(3)本金满额占用时间方法
如果每期有本金偿还,那么放款金额A并不是满额占用T期的(先息后本产品最后一期才偿还本金,所以其本金是满额占用T期的)。
计算本金满额占用时间:
【5】*Vintage损失率转为年化损失率 - 图14
满额占用时间内的年月均占用本金就是放款金额A:
【5】*Vintage损失率转为年化损失率 - 图15
一年的周转次数:
【5】*Vintage损失率转为年化损失率 - 图16
年化利率:
【5】*Vintage损失率转为年化损失率 - 图17
年化损失率:
【5】*Vintage损失率转为年化损失率 - 图18
4、不同还款方式的年化损失率
上面年化利率和年化损失率计算中,关键是求得不同还款方式的现金流,也就是每月的还款本金和还款利息,下面根据不同还款方式的现金流计算年化损失率。
(1)等额本金
假设R为产品年利率(实际上R就是产品的年化利率,用于计算产品的现金流,然后可以验证根据现金流计算的内部收益率和年化利率与R是一样的),则现金流为:
各期还款本金: 【5】*Vintage损失率转为年化损失率 - 图19
各期还款利息: 【5】*Vintage损失率转为年化损失率 - 图20
利用上面平均占用的方法可以得到等额本金年化损失率的计算公式为:
【5】*Vintage损失率转为年化损失率 - 图21
此公式是最常用的,很多人都会直接套用该公式,但可能有些人说不清楚公式的来源。需要记住的是该公式是等额本金下的转换公式,不要忽略还款方式而盲目套用。
(2)等额本息
等额本息是最常见的还款方式之一,对用户来说简单好记,每月还款金额相同(每月还款金额=每月还款本金+每月还款利息),但是该方式的现金流计算却是最复杂的。在这里直接给出现金流公式,有兴趣的可以自己推导试试。仍然假设R为产品年利率(即年化利率),现金流为:
各期还款金额: 【5】*Vintage损失率转为年化损失率 - 图22
各期还款利息: 【5】*Vintage损失率转为年化损失率 - 图23
各期还款本金: 【5】*Vintage损失率转为年化损失率 - 图24
由于等额本息的现金流较复杂,所以无法得到年化损失率的简单公式,在Vintage损失率和产品期数相同的情况下,等额本息年化损失率比等额本金年化损失率略小一些,所以可以使用该公式 【5】*Vintage损失率转为年化损失率 - 图25 进行大致的估算,更准算的计算可以通过编码得到。
(3)先息后本
年息后本是指,每期偿还利息,最后一期偿还本金,仍然假设R为产品年利率(即年化利率),现金流为:
各期还款本金:
【5】*Vintage损失率转为年化损失率 - 图26
【5】*Vintage损失率转为年化损失率 - 图27
各期还款利息:
【5】*Vintage损失率转为年化损失率 - 图28
先息后本的现金流比较简单,可以很容易推导得到先息后本年化损失率的计算公式为:
【5】*Vintage损失率转为年化损失率 - 图29
(4)等本等息
等本等息,即每期还相同的本金和利息。根据“本生息”,等本等息的每期真实利率是不同的,且是逐渐增大的,因为每期剩余本金逐渐减少而每期利息相同。所以等本等息的年化利率不能从年均占用的角度去计算,只能通过内部收益率的方式计算
这里假设R为产品年利率(该利率是名义利率,非年化利率),现金流为:
各期还款本金: 【5】*Vintage损失率转为年化损失率 - 图30
各期还款利息: 【5】*Vintage损失率转为年化损失率 - 图31
因为每期还款本金相同,所以本金占用情况和等额本金是相同的,所以等本等息的年化损失率为: 【5】*Vintage损失率转为年化损失率 - 图32

二、代码实现

将上述名义利率、内部收益率、年化利率、年化损失率的计算过程用代码实现如下:
import pandas as pd import numpy as np from scipy.optimize import root def calcAnnual(mode, A, T, R, vtg): # mode: 还款方式,等额本金/等额本息/先息后本/等本等息 # A: 本金 # T: 产品期数 # R: 产品年利率: # 等额本金/等额本息/先息后本: 年化利率 # 等本等息:名义利率,非年化利率 # vtg: vintage损失率 r = R/12 # 月利率 if mode == ‘等额本金’: ## 计算每月现金流 # 每月还款本金 Principal = [A/T]*T # 每月还款利息 Interest = [(A-A/T*i)*r for i in range(T)] # 每月还款金额 b = [ints+princ for ints, princ in zip(Interest, Principal)] # 每月剩余本金 Rest = [A-princ for princ in np.cumsum(Principal)] elif mode == ‘等额本息’: ## 计算每月现金流 # 每月还款金额 b = [A*r*(1+r)**T/((1+r)**T-1)]*T # 每月还款利息 Interest = [(A*r-b[0])*(1+r)**(t-1)+b[0] for t in range(1, T+1)] # 每月还款本金 Principal = [bi-ints for bi, ints in zip(b, Interest)] # 每月剩余本金 Rest = [A-princ for princ in np.cumsum(Principal)] elif mode == ‘先息后本’: ## 计算每月现金流 # 每月还款利息 Interest = [A*r]*T # 每月还款本金 Principal = [0]*(T-1) + [A] # 每月还款金额 b = [ints+princ for ints, princ in zip(Interest, Principal)] # 每月剩余本金 Rest = [A-princ for princ in np.cumsum(Principal)] elif mode == ‘等本等息’: ## 计算每月现金流 # 每月还款利息 Interest = [A*r]*T # 每月还款本金 Principal = [A/T]*T # 每月还款金额 b = [ints+princ for ints, princ in zip(Interest, Principal)] # 每月剩余本金 Rest = [A-princ for princ in np.cumsum(Principal)] # 现金流 CashFlow = pd.DataFrame({‘Period’: range(1, T+1), ‘Total’: b, ‘Interest’: Interest, ‘Principal’: Principal, ‘Rest’: Rest}) # 名义利率APR APR = sum(Interest)/A*(12/T) # 内部收益率 d = root(lambda x: A-sum([bi/(1+x)**(i+1) for i, bi in enumerate(b)]), 0.01) IRR = 12*d[‘x’][0] ##### method1: 借款期限内的年均占用本金法 # 平均资金占用(年月均余额) AveAmt = sum([princ*(i+1) for i, princ in enumerate(Principal)])/T # 年周转次数 TurnOvers = 12 / T # 年化利率 AnnR = sum(Interest)/AveAmt*TurnOvers # 年化损失率 AnnLoss = A*vtg/AveAmt*TurnOvers ##### method2: 一年内的年均占用本金法 # 平均资金占用(年月均余额) AveAmt2 = sum([princ*(i+1) for i, princ in enumerate(Principal)])/12 # 年周转次数 TurnOvers2 = 1.0 # 年化利率 AnnR2 = sum(Interest)/AveAmt2*TurnOvers2 # 年化损失率 AnnLoss2 = A*vtg/AveAmt2*TurnOvers2 ##### method3: 本金满额占用时间法 # 本金满额占用时间 EntireTerm = sum([princ*(i+1) for i, princ in enumerate(Principal)])/A # 年周转次数 TurnOvers3 = 12 / EntireTerm # 年化利率 AnnR3 = sum(Interest)/A*TurnOvers3 # 年化损失率 AnnLoss3 = A*vtg/A*TurnOvers3 print(‘-‘*50) print(‘APR(名义利率): {}’.format(round(APR, 4))) print(‘IRR(内部收益率): {}’.format(round(IRR, 4))) print(‘-‘*50) print(‘method1: 借款期限内的年均占用本金法’) print(‘AveAmt(年均占用金额): {}’.format(round(AveAmt, 4))) print(‘TurnOvers(年周转次数): {}’.format(round(TurnOvers, 4))) print(‘AnnR(年化利率): {}’.format(round(AnnR, 4))) print(‘AnnLoss(年化损失率): {}’.format(round(AnnLoss, 4))) print(‘-‘*50) print(‘method2: 一年内的年均占用本金法’) print(‘AveAmt(年均占用金额): {}’.format(round(AveAmt2, 4))) print(‘TurnOvers(年周转次数): {}’.format(round(TurnOvers2, 4))) print(‘AnnR(年化利率): {}’.format(round(AnnR2, 4))) print(‘AnnLoss(年化损失率): {}’.format(round(AnnLoss2, 4))) print(‘-‘*50) print(‘method3: 本金满额占用时间法’) print(‘EntireTerm(满额占用时间): {}’.format(round(EntireTerm, 4))) print(‘TurnOvers(年周转次数): {}’.format(round(TurnOvers3, 4))) print(‘AnnR(年化利率): {}’.format(round(AnnR3, 4))) print(‘AnnLoss(年化损失率): {}’.format(round(AnnLoss3, 4))) print(‘-‘*50) return CashFlow
(1)等额本金的年化损失率:
calcAnnual(mode=’等额本金’, A=10000, T=9, R=0.24, vtg=0.06)
image.png
(2)等额本息的年化损失率:
calcAnnual(mode=’等额本息’, A=10000, T=9, R=0.24, vtg=0.06)
image.png
(3)先息后本的年化损失率:
因为先息后本的本金一直是满额占用的,所以在Vintage损失率和期数相同的情况下,其年化损失率是最小的,还可以看到,其名义利率和真实利率是相同的。
calcAnnual(mode=’先息后本’, A=10000, T=9, R=0.24, vtg=0.06)
image.png
(4)等本等息的年化损失率:
等本等息中,按照年均占用方法计算的AnnR并不等于IRR,因此这里计算的AnnR并不是年化利率,年化利率是IRR.
image.png

三、总结

年化损失率的计算主要受还款方式和产品期数影响。如果产品有不同期数和不同还款方式,应该对不同期数和不同还款方式的资产分别计算年化损失率,再根据相应的资产规模进行加权平均,从而得到加权平均年化损失率。年化损失的推导是对实际值的近似,实际中的现金流是复杂的,提前还款、损失金额等因素均会影响现金流。