Python实现等额本息

1.等额本息

等额本息下,每个月还款的本金+利息的总额是相等的,或者说,用户还款时只知道每个月还款额相等,并不关心还了多少本金和利息。这种还款方式同样适用于收入稳定的人群。

假设每期本金设为P1,P2,P3…Pn;每个分期的天数为D1,D2,D3…Dn;每期本息总额为A,本金总额为Psum,日利率为R。根据等额本息的规则,可以得到如下公式:

每一期次的本金和利息:
A = P1 + (Psum) * RD1;
A = P2 + (Psum – P1) * R
D2;
A = P3 + (Psum – P1 – P2) * R*D3;

A = Pn + (Psum – P1 – P2 - … - Pn-1) RDn;
总本金 = 每一期本金之和:
Psum = P1 + P2 + P3 + … + Pn;

综合以上等式,使用线性方程求解n+1元一次方程组。
设:变量矩阵为X[n+1],则变量矩阵如下:

计算每个等式中,变量的参数,得到变量的参数矩阵A[n+1][n+1]为:

计算每个等式中,等式的常量值,得到的常量矩阵B[n+1]为:

根据A[n+1][n+1] * X[n+1] = B[n+1],首先计算出A矩阵的逆矩阵 A-1 然后再左右两边同时左乘A-1 就得到X = A-1*B,这样我们就求到了所有变量A,P1,P2…Pn。那么我们每期的本金就计算出来了。

2.代码

# -*- coding: utf-8 -*-from datetime import datetime
from dateutil.relativedelta import relativedelta
import numpy as np
from decimal import *def benqidate(date, k):"""算每一期时间:param date: 贷款时间,字符串类型:param k: 第几期:return: 返回本期的还款日期"""date_daikuan = datetime.strptime(date,'%Y-%m-%d')if 1 <= k + date_daikuan.month <= 12:date_benqi = date_daikuan + relativedelta(month=k + date_daikuan.month)elif 13 <= k + date_daikuan.month <= 24:date_benqi = date_daikuan + relativedelta(year=date_daikuan.year + 1, month=k + date_daikuan.month - 12)elif 25 <= k + date_daikuan.month <= 36:date_benqi = date_daikuan + relativedelta(year=date_daikuan.year + 2, month=k + date_daikuan.month - 24)else:date_benqi = date_daikuan + relativedelta(year=date_daikuan.year + 4, month=k + date_daikuan.month - 48)return date_benqidef calD(date, n=36):"""算本期的天数,用列表表示出来,精确到天:param date: 贷款日期:param n: 期数:return: 每期天数的列表"""result_D = []for i in range(1, n+1):date_daikuan = datetime.strptime(date, '%Y-%m-%d')if i == 1:benqitianshu = (benqidate(date, i) - date_daikuan).daysresult_D.append(benqitianshu)else:benqitianshu = (benqidate(date, i) - benqidate(date, i - 1)).daysresult_D.append(benqitianshu)return result_Ddef calmonthpay(date, rent_sum, n=36, r=0.153/360):"""计算每期的租金总额:param date: 贷款时间:param rent_sum: 贷款总额:param n: 期数:param r: 日利率:return: 每期的租金总额"""D = calD(date)M = np.eye(n)for i in np.arange(1, n):for j in range(i):M[i, j] = -r * D[i]c1 = np.ones(n) * -1c1.shape = (n, 1)r1 = np.ones(n + 1).Tr1[0] = 0r1.shape = (1, n + 1)M = np.hstack((c1, M))M = np.vstack((M, r1))B = -r * rent_sum * np.array(D)B = np.append(B, [rent_sum])X = np.mat(M).I * np.mat(B).Treturn X[0, 0]def calzujin(date, rent_sum,  n=36, rate=0.153):"""计算各个所需的参数:param rate: 年利率:param date: 贷款日期,输入为字符串形式:param rent_sum:本金总额:param n: 期数:return:返回每期的利息,当期本金和期末本金"""month_pay = calmonthpay(date, rent_sum)print(month_pay)month_pay = Decimal(str(month_pay)).quantize(Decimal('.01'), rounding=ROUND_DOWN)month_pay = np.float(month_pay)result_lixi = []result_dangqi = []result_qimou = []lixi_sum_list = []sum = 0lixi_sum = 0for i in range(1, n+1):date_daikuan = datetime.strptime(date, '%Y-%m-%d')if i == 1:benqitianshu = (benqidate(date, i) - date_daikuan).daysdangqi_lixi = (rent_sum * rate) / 360 * benqitianshuresult_lixi.append(dangqi_lixi)rent_dangqi = month_pay - dangqi_lixisum += round(rent_dangqi, 2)result_dangqi.append(rent_dangqi)rent_sum_qimou = rent_sum - rent_dangqiresult_qimou.append(rent_sum_qimou)lixi_sum += dangqi_lixilixi_sum_list.append(lixi_sum)elif 2 <= i <= 47:benqitianshu = (benqidate(date, i) - benqidate(date, i-1)).daysrent_sum_qichu = rent_sum_qimoudangqi_lixi = (rent_sum_qichu * rate) / 360 * benqitianshuresult_lixi.append(dangqi_lixi)rent_dangqi = month_pay - dangqi_lixisum += round(rent_dangqi, 2)result_dangqi.append(rent_dangqi)rent_sum_qimou = rent_sum_qichu - rent_dangqiresult_qimou.append(rent_sum_qimou)lixi_sum += dangqi_lixilixi_sum_list.append(lixi_sum)else:benqitianshu = (benqidate(date, i) - benqidate(date, i - 1)).daysrent_sum_qichu = rent_sum - sumdangqi_lixi = (rent_sum_qichu * rate) / 360 * benqitianshuresult_lixi.append(dangqi_lixi)rent_dangqi = rent_sum - sumresult_dangqi.append(rent_dangqi)rent_sum_qimou = rent_sum_qichu - rent_dangqiresult_qimou.append(rent_sum_qimou)lixi_sum += dangqi_lixilixi_sum_list.append(lixi_sum)month_pay = Decimal(str(month_pay)).quantize(Decimal('.01'), rounding=ROUND_DOWN)lixi_qimou = [lixi_sum-i for i in lixi_sum_list]return month_pay, result_lixi, result_dangqi, result_qimou, lixi_qimoudef calrent_sum(month_pay, date, n=36, r=0.153/360):D = calD(date=date)M = np.eye(n)for i in np.arange(1, n):for j in range(i):M[i, j] = -r * D[i]# 然后进行矩阵的拼接c1 = np.ones(n)for i in range(n):c1[i] = r * D[i]# 将c1拼接到矩阵中c1.shape = (n,1)M = np.hstack((c1, M))c2 = np.ones(n+1)c2[0] = -1c2.shape = (1, n+1)M = np.vstack((M, c2))# 构造月供矩阵A = np.ones(n+1).Tfor i in range(n):A[i] = month_payA[36] = 0A.shape = (n+1, 1)X = np.mat(M).I * np.mat(A)return X[0,0]if __name__ == '__main__':d, a, b, c, e = calzujin("2018-07-01", 100877)sum = 0for i in range(36):print("第 %d 期利息为:%.2f" % (i+1, round(a[i], 2)))sum += round(a[i], 2)print(sum)print("\n")for j in range(36):print("第 %d 期本金为:%.2f" % (j+1, round(b[j], 2)))print("\n")for k in range(36):print("第 %d 期末本金为:%.2f" % (k+1,round(c[k], 2)))print("每期月供: %s" % (d))for m in range(36):print("第 %d 期末剩余利息为:%.2f" % ( m+ 1, round(e[m], 2)))

结果如下

/Users/xudong/opt/anaconda3/python.app/Contents/MacOS/python /Users/xudong/PycharmProjects/滚动率计算/网商租金计算.py
3523.984043776458
第 1 期利息为:1329.05
第 2 期利息为:1300.14
第 3 期利息为:1229.84
第 4 期利息为:1240.61
第 5 期利息为:1171.48
第 6 期利息为:1179.53
第 7 期利息为:1148.65
第 8 期利息为:1009.22
第 9 期利息为:1084.22
第 10 期利息为:1018.14
第 11 期利息为:1019.06
第 12 期利息为:954.25
第 13 期利息为:952.20
第 14 期利息为:918.32
第 15 期利息为:855.47
第 16 期利息为:848.83
第 17 期利息为:787.34
第 18 期利息为:777.53
第 19 期利息为:741.35
第 20 期利息为:659.22
第 21 期利息为:666.94
第 22 期利息为:609.00
第 23 期利息为:590.90
第 24 期利息为:534.44
第 25 期利息为:512.87
第 26 期利息为:473.19
第 27 期利息为:419.03
第 28 期利息为:392.09
第 29 期利息为:339.51
第 30 期利息为:308.88
第 31 期利息为:266.52
第 32 期利息为:201.96
第 33 期利息为:179.83
第 34 期利息为:131.39
第 35 期利息为:91.07
第 36 期利息为:44.37
25986.43999999999第 1 期本金为:2194.93
第 2 期本金为:2223.84
第 3 期本金为:2294.14
第 4 期本金为:2283.37
第 5 期本金为:2352.50
第 6 期本金为:2344.45
第 7 期本金为:2375.33
第 8 期本金为:2514.76
第 9 期本金为:2439.76
第 10 期本金为:2505.84
第 11 期本金为:2504.92
第 12 期本金为:2569.73
第 13 期本金为:2571.78
第 14 期本金为:2605.66
第 15 期本金为:2668.51
第 16 期本金为:2675.15
第 17 期本金为:2736.64
第 18 期本金为:2746.45
第 19 期本金为:2782.63
第 20 期本金为:2864.76
第 21 期本金为:2857.04
第 22 期本金为:2914.98
第 23 期本金为:2933.08
第 24 期本金为:2989.54
第 25 期本金为:3011.11
第 26 期本金为:3050.79
第 27 期本金为:3104.95
第 28 期本金为:3131.89
第 29 期本金为:3184.47
第 30 期本金为:3215.10
第 31 期本金为:3257.46
第 32 期本金为:3322.02
第 33 期本金为:3344.15
第 34 期本金为:3392.59
第 35 期本金为:3432.91
第 36 期本金为:3479.61第 1 期末本金为:98682.07
第 2 期末本金为:96458.23
第 3 期末本金为:94164.09
第 4 期末本金为:91880.73
第 5 期末本金为:89528.22
第 6 期末本金为:87183.78
第 7 期末本金为:84808.45
第 8 期末本金为:82293.69
第 9 期末本金为:79853.92
第 10 期末本金为:77348.08
第 11 期末本金为:74843.16
第 12 期末本金为:72273.43
第 13 期末本金为:69701.66
第 14 期末本金为:67096.00
第 15 期末本金为:64427.49
第 16 期末本金为:61752.34
第 17 期末本金为:59015.70
第 18 期末本金为:56269.26
第 19 期末本金为:53486.62
第 20 期末本金为:50621.87
第 21 期末本金为:47764.83
第 22 期末本金为:44849.85
第 23 期末本金为:41916.77
第 24 期末本金为:38927.23
第 25 期末本金为:35916.11
第 26 期末本金为:32865.33
第 27 期末本金为:29760.38
第 28 期末本金为:26628.49
第 29 期末本金为:23444.03
第 30 期末本金为:20228.92
第 31 期末本金为:16971.46
第 32 期末本金为:13649.44
第 33 期末本金为:10305.29
第 34 期末本金为:6912.70
第 35 期末本金为:3479.80
第 36 期末本金为:0.18
每期月供: 3523.98
第 1 期末剩余利息为:24657.41
第 2 期末剩余利息为:23357.27
第 3 期末剩余利息为:22127.43
第 4 期末剩余利息为:20886.82
第 5 期末剩余利息为:19715.34
第 6 期末剩余利息为:18535.81
第 7 期末剩余利息为:17387.16
第 8 期末剩余利息为:16377.94
第 9 期末剩余利息为:15293.72
第 10 期末剩余利息为:14275.58
第 11 期末剩余利息为:13256.52
第 12 期末剩余利息为:12302.27
第 13 期末剩余利息为:11350.07
第 14 期末剩余利息为:10431.75
第 15 期末剩余利息为:9576.27
第 16 期末剩余利息为:8727.44
第 17 期末剩余利息为:7940.10
第 18 期末剩余利息为:7162.57
第 19 期末剩余利息为:6421.22
第 20 期末剩余利息为:5762.00
第 21 期末剩余利息为:5095.05
第 22 期末剩余利息为:4486.05
第 23 期末剩余利息为:3895.16
第 24 期末剩余利息为:3360.72
第 25 期末剩余利息为:2847.85
第 26 期末剩余利息为:2374.66
第 27 期末剩余利息为:1955.62
第 28 期末剩余利息为:1563.53
第 29 期末剩余利息为:1224.02
第 30 期末剩余利息为:915.14
第 31 期末剩余利息为:648.63
第 32 期末剩余利息为:446.67
第 33 期末剩余利息为:266.83
第 34 期末剩余利息为:135.44
第 35 期末剩余利息为:44.37
第 36 期末剩余利息为:0.00Process finished with exit code 0

用python实现等额本息相关推荐

  1. Python计算等额本息贷款和等额本金贷款

    题目: 编写函数loanCalculator,根据参数返回每个月贷款详细信息和利息总额,具体要求如下: 1.参数包括:贷款额度.贷款期限.年利率(默认4.35%)和还款方式(1表示等额本金贷款,2表示 ...

  2. 房贷利率有无套路?Python解读“等额本金与等额本息”的差异所在

    作者 | xiaoyu 来源 | Python数据科学 很多朋友留言说不知道房贷利率的不同归还方式是不是有套路,内心深表疑虑.我的第一反应是因为房贷很高,大家看到消费分期的套路自然而然就想到了房贷,很 ...

  3. python等额本息和等额本金_用Python解读房贷利率,要不要看随你

    可能很多买过房.贷过款的朋友大概都知道怎么回事,但是我相信大部分人也没细研究过,而绝大部分人买房时更是任由房屋中介摆布,因为给了中介费相信他们可以算的明明白白,自己也就不过多深究了.但我觉得买房不是小 ...

  4. [Python]等额本息房贷计算器

    等额本息还款法: 每月月供额=[贷款本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1] 每月应还利息=贷款本金×月利率×[(1+月利率)^还款月数-(1+月利率)^(还款月序号 ...

  5. 如何使用python进行等额本金-等额本息贷款计算

    #贷款额为a,月利率为i,年利率为I,还款月数为n a = 500000.00 I = 0.11495 i = I/12 n = 60 print("-----等额本息计算,以5个月为例-- ...

  6. python 计算银行带宽等额本金和等额本息的方法

    在房屋贷款中,还款是按月进行的,利息也是按月计算的(月利率为年利率除以12),每月还款优先还本月利息,剩下的还本金,未还款的本金会影响下月利息的计算,在还款期数达到时,所有贷款都会还完,还款选项中有等 ...

  7. python计算本息总和_[Python]等额本息房贷计算器

    等额本息还款法: 每月月供额=[贷款本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1] 每月应还利息=贷款本金×月利率×[(1+月利率)^还款月数-(1+月利率)^(还款月序号 ...

  8. java 等额本金等额本息工具类

    2019独角兽企业重金招聘Python工程师标准>>> 等额本息: /*** Description:等额本息工具类* Copyright: Copyright (corporati ...

  9. 财商训练(01)————等额本息和等额本金房贷的区别

    文章目录 01 等额本息 每月还款数额计算公式 案例分析: 02 等额本金 每月还款额度计算公式 案例分析 03 计算工具 04 Python实现 01 等额本息 每月还款数额计算公式 M=P×R×( ...

最新文章

  1. 神器与经典--sp_helpIndex
  2. 阿里官方Redis开发规范!
  3. 极客新闻——06、刘润:给年轻人的10条工作建议
  4. SAP SD如何将销售订单其它ITEM加入到一个已创建好的交货单里
  5. 我的webpack配置文件
  6. RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
  7. GDB 调试 Mysql 实战(一)源码编译安装
  8. MongoDB(三):创建、更新和删除文档
  9. Linux IP别名,接口绑定,多网卡绑定
  10. 远程服务器格式化,怎么远程服务器做ghost备份图解
  11. ios保存录制好的视频 图片 到相簿
  12. 【bzoj5001】搞事情 暴力
  13. 一行 Python 代码能实现有趣功能
  14. 自留-Python:线性拟合(直线+曲线)
  15. 《FLUENT 14流场分析自学手册》——1.2 流体运动的基本概念
  16. maven 实战 (许晓斌)
  17. 【教程篇】手机卡刷Rom详细教程
  18. kafka多线程消费
  19. 搭建校园电视台和录播教室+在线教育实施方案
  20. 《高效能人士的七个习惯》读书摘记

热门文章

  1. 傻妞对接TG/监控变量国内国外机视频教程 6.16
  2. 关于印发《建造师执业资格制度暂行规定》的通知
  3. 借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能
  4. Henri Bergson and the Perception of Time
  5. Dreamweaver cs3快捷键一览
  6. C++| 匠心之作 从0到1入门学编程【视频+课件+笔记+源码】
  7. 玩转华为数据中心交换机系列 | 配置手工负载分担模式链路聚合示例
  8. oracle rman crosscheck,rman的crosscheck命令
  9. win怎么在计算机里按日期搜索文件,Windows下怎么按时间查找文件
  10. 软件测试,软件测试练习题