首页 > Python教程 > Python NumPy库 阅读数:1

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。