NumPy在金融领域的应用
我们知道 NumPy 有强大的数值计算功能,在生活中,经常会用到的一个计算就是贷款计算。
例如如果贷款 200 万,在 15 年内还清,每个月需要还多少钱?其中支付的利息是多少?再例如,如果购买了一份医疗保险,要求每个月存钱 2000 元,一直存 20 年,20 年内每年最多可以报销医疗费用 5000 元,20 年后可以全额返还本金,这样是否划算?
由于一年期固定存/贷款利率是由央行规定的,所以这个利率在一定时间内基本是固定的。在本节中会经常用到这个概念。
首先来看看存款利息的问题,假定一年期存款利率是 5%,那么每个月存入 100 元,10 年后账户余额是多少?可以使用函数 np.fv() 来处理这类问题,该函数定义如下:
np.fv(利率,年限,每月存款,当前存款)
在上面的问题中,可以这么来求解,月利率是 0.05/12;年限是 12*10 个月;每月存款是 -100,负数表示支出;当前存款是 0。计算方法如下:
>>> np.fv(0.05/12, 10*12, -100, 0)
15528.227944566719
其中本金部分是 12000,由此得出利息收入是 3528.22。
下面来看一个贷款的问题。如果我们的还款能力是每个月 13000 元,贷款 300 万,那么应该贷款多长时间呢?可以使用函数 np.nper() 来完成该任务,该函数定义如下:
numpy.nper(利率, 还款能力, 贷款数目, 剩余贷款数目=0)
对于我们的场景,可以使用下面的方法来计算:
>>> np.nper(0.05/12, -13000, 3000000, 0) array(783.57108846)
结果是需要 783 个月才能还清。这里有一个问题,如果每个月还款的数目小于贷款每月产生的利息,那么就永远也还不清,而且欠款还会随着时间而增加。例如上面的例子,300 万每个月的利息是 12500,如果还款低于这个值就永远也还不完了。
如果希望查看每个月还的利息是多少,可以使用利息的计算函数 np.ipmt(),该函数定义如下:
np.ipmt(利率, 时间段列表, 还款年限, 贷款数目, 未来剩余贷款数目=0)
还是以上面的买房贷款为例,可以看到下面的情况:
>>> per = np.arange(10*12) + 1 # 前10年还的利息 >>> ipmt = np.ipmt(0.05/12, per, 783, 3000000) >>> ipmt # 每个月支付的利息,负数表示支付 array([-12500. , -12497.91151511, -12495.81432821, -12493.70840303, -12491.59370315, -12489.47019203, -12487.33783295, -12485.19658903, … # 省略中间数据 -12202.70446367, -12199.37724738, -12196.0361677 , -12192.68116684, -12189.31218682, -12185.92916938, -12182.53205603, -12179.12078805])
可以很容易发现每个月还的利息数目都在减少,因为每个月都还了一部分本金,随着本金的减少,利息的基数也在减少,所以利息也在减少。
如果希望得到全部利息的数目,也就是贷款所支付的利息总和,可以对利息列表求和,方法如下:
>>> per = np.arange(783) + 1 # 总计783个月 >>> ipmt = np.ipmt(0.05/12, per, 783, 3000000) >>> ipmt.sum() # 总计利息为717万 -7179968.0796168335
可以看到利息数目比较大,为了解决这个问题,可以提高每个组的还款金额或者减少还款周期,例如调整为 25 年还完,那么利息总额为:
>>> per = np.arange(12*25) + 1 >>> ipmt = np.ipmt(0.05/12, per, 12*25, 3000000) >>> ipmt.sum() # 利息总额是226万 -2261310.3735718103
所以说在 5% 的年化利率情况下,等额还款方式,贷款 25 年,利息约是本金的 75%。这是比较常见的情况,如果将年限降低为 15 年,那么可以得到如下的利息总额:
>>> per = np.arange(12*10) + 1 >>> ipmt = np.ipmt(0.05/12, per, 12*10, 3000000) >>> ipmt.sum() # 利息总额是81万 -818358.548606708
可以看到利息数目大幅下降,但每月的还款金额却上升的很大,每月需要支付的还款金额为:
>>> np.pmt(0.05/12, 12*15, 3000000) -23723.808802246393 # 每月支付的金额
本金还款计划和利息的计算方法类似,不过需要将 ipmt() 函数改为 ppmt() 函数。下面是贷款 300万,等额还款 783 个月的情况:
>>> per = np.arange(10*12) + 1 # 头10年还的利息 >>> ppmt = np.ppmt(0.05/12, per, 783, 3000000) >>> ppmt array([-501.23637244, -503.32485732, -505.42204423, -507.52796941, -509.64266928, -511.7661804 , -513.89853949, -516.0397834 , -518.18994917, -520.34907396, -522.5171951 , -524.69435008, -526.88057654, -529.07591227, -531.28039524, -533.49406355, -535.71695548, -537.94910947, -540.19056409, -542.44135811, -544.70153043, -546.97112014, -549.25016648, -551.53870884, -553.83678679, -556.14444007, -558.46170857, -560.78863235, -563.12525165, -565.47160687, -567.82773857, -570.19368748, -572.56949451, -574.95520073, -577.3508474 , -579.75647593, -582.17212792, -584.59784512, -587.03366947, -589.4796431 , -591.93580827, -594.40220748, -596.87888334, -599.36587869, -601.86323652, -604.371 , -606.8892125 , -609.41791755, -611.95715888, -614.50698037, -617.06742612, -619.6385404 , -622.22036765, -624.81295252, -627.41633982, -630.03057457, -632.65570196, -635.29176739, -637.93881642, -640.59689482, -643.26604855, -645.94632375, -648.63776676, -651.34042413, -654.05434256, -656.77956899, -659.51615052, -662.26413449, -665.02356838, -667.79449991, -670.576977 , -673.37104773, -676.17676043, -678.9941636 , -681.82330595, -684.66423639, -687.51700404, -690.38165823, -693.25824847, -696.1468245 , -699.04743627, -701.96013392, -704.88496782, -707.82198851, -710.7712468 , -713.73279366, -716.7066803 , -719.69295814, -722.6916788 , -725.70289412, -728.72665618, -731.76301725, -734.81202982, -737.87374661, -740.94822056, -744.03550481, -747.13565275, -750.24871797, -753.37475429, -756.51381577, -759.66595667, -762.83123149, -766.00969495, -769.20140201, -772.40640785, -775.62476789, -778.85653775, -782.10177333, -785.36053072, -788.63286626, -791.91883654, -795.21849836, -798.53190877, -801.85912505, -805.20020474, -808.55520559, -811.92418562, -815.30720306, -818.7043164 , -822.11558439])
可以看到最开始时还的本金特别少,而且本金在逐月增加。
总的来说,每个月还给银行的钱分为两部分,一部分是利息,一部分是本金,可以使用的公式表示:
本金+利息=每月还款额
因此,如果本金等于 0,那么就永远也还不完;如果本金小于 0,那么不仅还不完,而且背负的债务还会随时间而增加;只有当本金大于 0 时才是正常的还款情况。
利息=剩余本金*利率
剩余本金=上次剩余本金–最近一次归还本金
归还贷款的最终目的就是将剩余本金降低为 0。当剩余本金降低为 0 时,利息也降低为 0。
本文链接:http://so.lmcjl.com/news/1171/