还在头疼每月房贷还款,这个房贷计算机让你一目了然
- 编辑:admin - 点击数:659还在头疼每月房贷还款,这个房贷计算机让你一目了然
本文分享自华为云社区《房贷计算器-从原理、计算到提前还款和可视化-云社区-华为云》,作者:蜉蝣与海。
前言最近各地楼市震荡不断,2022年12月份以来不少银行纷纷降息,随后更是引发了一波提前还款的大潮。不少地区楼市相关的微信小程序也自带了贷款计算器、提前还款计算器等工具,通过这些工具人们可以很容易的了解每期还款本金、等额本金/本息的利息差异、提前还款节省利息的问题。
了解这些计算工具的相关原理,可以做到心中有数,临危不慌。
注:
本文对应代码和脚本发布至华为云生态社区AIGallery:贷款计算器-从原理、公式到提前还款和可视化→AIGallery_Notebook详情_开发者_华为云,欢迎开发者前往体验,文中涉及所有代码可以直接通过页面进入ModelArtsCodeLab运行。使用该脚本稍加修改后即可尝试开发一个适合自身地区政策的贷款计算提前还款小程序。
本文只是研究贷款生成、提前还贷方面的相关计算原理,不构成任何投资理财方面的建议。
先来看个使用工具计算提前还款的效果先来看个使用工具计算提前还款的效果,再来探讨相关原理。
贷款87.5万,利率4.9%还20年,使用等额本息的方式,在第13个月提前还10万,使用月供不变年限缩短方式,在CodeLab中运行下述程序后可以计算提前还款节省利息,和微信上提前还款小程序计算结果一致:
a,b,c,d,e=extraPaidWithFixedPaid(12*20,875000,0.049,False,[(13,100000)])drawDiagramExtraPaid(12*20,a,b,d,e)drawTableExtraPaid(12*20,a,b,c,d,e)[10:20]



如图,缩短了40个月(3年4个月)账期,次月还款额以及节省利息等都与小程序计算一致。

了解过贷款的小伙伴都知道,贷款有等额本金和等额本息这两种方式,前者每月还款的本金相同,利息逐月递减;后者每月还款额相同,刚开始还款时利息还的多,后面本金还的逐渐增多。参考网上讨论利息计算的诸多文章,两个模型理论上,都有下列共同特点:
利息按月利率计算,一月一期
按期还款情况下当月应还利息只由未还完的本金决定
每月还款额除了未还本金产生的全部利息外,剩下的金额应该全部用于偿还本金
像最近部分银行提出的先息后本(先还利息若干年,最后一次性偿还本金)则不符合这个条件。
还款额的计算知乎文章为什么买房贷款,最好选择等额本金?中提到了一个例子:
通过描述可知,贷款87.5万,贷20年,等额本息每月还款5726.39元,等额本金首月还款7218.75元。假设文中的贷款未使用公积金,计算时利率为固定利率,根据网上的贷款计算器可知此时的贷款年利率为4.9%。
以这个例子为例,简单说明等额本金和等额本息的计算方法:
首先贷20年,按月分期,贷款为
20∗12=240期。
年利率4.9%,月利率为
0.049÷12=0.004983即0.4083%。

可以看到抽象出公共结构后,前后的计算结果并没有发生变化。
考虑年限不变提前还款的情况,这里将每次提前还款的时间和金额组成python的元组,若干个(账期,还款金额)元组组成一个list输入函数。函数首先计算正常情况下的还款信息,而后根据提前还款信息,修改提前还款日的剩余本金,并从各个提前还款日重新计算剩余还款。
defextraPaidWithFixedPeriod(months,principal,rate,capitalAveraged,extraPaidList:list):capitals,interests,total_payment=normalPaid(months,principal,rate,capitalAveraged)(key=lambdax:x[0])originCapital,originInterests,originTotal=(),(),total_()left_principal=[0]*monthsleft_principal[0]=principalforxinrange(0,months):ifxmonths-1:left_principal[x+1]=left_principal[x]-capitals[x]defnormalPaidOffset(left_months,principal,rate,capitalAveraged,offset):month_rate=rate/12monthly_capital=left_principal[offset]/left_monthsmonthly_payment=left_principal[offset]*month_rate*(1+month_rate)**left_months/((1+month_rate)**left_months-1)foriinrange(0,left_months):interests[offset+i]=left_principal[offset+i]*month_rateifcapitalAveraged:capitals[offset+i]=monthly_capitaltotal_payment[offset+i]=monthly_capital+interests[offset+i]else:total_payment[offset+i]=monthly_paymentcapitals[offset+i]=total_payment[offset+i]-interests[offset+i]ifi==0:print("次月还款%.2f"%total_payment[offset+i])ifoffset+i+1months:left_principal[offset+i+1]=left_principal[offset+i]-capitals[offset+i]returnforx,yinextraPaidList:capitals[x]=capitals[x]+yleft_principal[x+1]=left_principal[x]-capitals[x]total_payment[x]=capitals[x]+interests[x]print("当月需还%.f剩余本金%.f"%(total_payment[x],left_principal[x+1]))normalPaidOffset(months-x-1,left_principal[x+1],rate,capitalAveraged,x+1)printStatistics(originCapital,originInterests,originTotal,months)print("")printStatistics(capitals,interests,total_payment,months)print("节省利息%.2f"%((originInterests)-(interests)))returncapitals,interests,total_payment,originTotal,originInterests再定义几个函数对提前还款节省的利息进行可视化。
defdrawDiagramExtraPaid(months,capitals,interests,originalTotal,originalInterests,showOriginTotal=True):month_array=(1,months+1,1)capital_with_origin_interest=[0]*monthsheight=interestsforxinrange(1,months):capital_with_origin_interest[x]=capitals[x]+originalInterests[x]l1=(month_array,originalTotalifshowOriginTotalelsecapital_with_origin_interest,width=0.2,align='center',color='yellow')l2=(month_array,capitals,width=0.2,align='center',color='red')l3=(month_array,interests,width=0.2,align='center',color='blue',bottom=capitals)华为云开发者联盟#