Python基础教程: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。
以上就是Python基础教程:NumPy在金融领域的应用相关内容,想了解更多python基础教程关注(猴子技术宅)。

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/pythons/589103.html

发表评论

邮箱地址不会被公开。 必填项已用*标注