还在头疼每月房贷还款?这个房贷计算机让你一目了然

时间:2023-02-23 11:09:32
摘要:通过楼市小程序上贷款计算器等工具人们可以很容易的了解每期还款本金、不同还款方式的利息差异、提前还款节省利息等问题。

本文分享自华为云社区《房贷计算器-从原理、计算到提前还款和可视化》,作者: 蜉蝣与海 。

前言

最近各地楼市震荡不断,2022年12月份以来不少银行纷纷降息,随后更是引发了一波提前还款的大潮。不少地区楼市相关的微信小程序也自带了贷款计算器、提前还款计算器等工具,通过这些工具人们可以很容易的了解每期还款本金、等额本金/本息的利息差异、提前还款节省利息的问题。

了解这些计算工具的相关原理,可以做到心中有数,临危不慌。

  1. 本文对应代码和脚本发布至华为云生态社区AI Gallery:贷款计算器-从原理、公式到提前还款和可视化欢迎开发者前往体验,文中涉及所有代码可以直接通过页面进入ModelArts Code Lab运行。使用该脚本稍加修改后即可尝试开发一个适合自身地区政策的贷款计算&提前还款小程序。
  2. 本文只是研究贷款生成、提前还贷方面的相关计算原理,不构成任何投资理财方面的建议。

如何计算利息

背景:等额本金和等额本息的共同点

了解过贷款的小伙伴都知道,贷款有等额本金和等额本息这两种方式,前者每月还款的本金相同,利息逐月递减;后者每月还款额相同,刚开始还款时利息还的多,后面本金还的逐渐增多。参考网上讨论利息计算的诸多文章,两个模型理论上,都有下列共同特点:

利息按月利率计算,一月一期

按期还款情况下当月应还利息只由未还完的本金决定

每月还款额除了未还本金产生的全部利息外,剩下的金额应该全部用于偿还本金

像最近部分银行提出的先息后本(先还利息若干年,最后一次性偿还本金)则不符合这个条件。

还款额的计算

前阵子,院长有位朋友在惠州买了套120平米的房,总价125万左右,大约贷了87.5万。 办房贷的时候,他听从销售的建议,选了等额本息的还款方式。每个月固定还5726.39元。这个还款额度在他的承受范围之内,因此就选了。 那假如选择等额本金呢?第一个月要还的金额为7218.75元,此后每个月少还14.89元,直至20年后还完。

知乎文章为什么买房贷款,最好选择等额本金?中提到了一个例子:

通过描述可知,贷款87.5万,贷20年,等额本息每月还款5726.39元,等额本金首月还款7218.75元。假设文中的贷款未使用公积金,计算时利率为固定利率,根据网上的贷款计算器可知此时的贷款年利率为4.9%。

以这个例子为例,简单说明等额本金和等额本息的计算方法:

首先贷20年,按月分期,贷款为 20 × 12 = 240期。 年利率4.9%,月利率为 0.049 ÷ 12 = 0.004983 即0.4083%。

等额本金 情况下:

  • 每月应还本金=总本金 ÷ 期数
  • 每月应还利息=剩余本金×月利率
  • 每月还款额=每月应还本金 + 每月应还利息

在这个例子中:

  • 每月应还本金为875000÷240=3645.83元
  • 首月应还利息为875000×0.4083%=3572.92元
  • 首月应还:3645.83 + 3572.92 = 7218.75元。
  • 第2月剩余本金为875000 - 3645.83 = 871354.17元。
  • 第2月应还利息为871354.17×0.4083%=3558.03元。
  • 第2月应还:3645.83 + 3558.03 = 7203.86元。

将这段逻辑抽象为代码有:

import matplotlib.pyplot as plt
import numpy as np
def averageCapital(months, principal, rate):
 month_rate = rate / 12
 monthly_capital = principal / months
    interests = [0] * months
    capitals = [0] * months
 left_principal = [0] * months
 left_principal[0] = principal
 total_payment = [0] * months
 for i in range(0, months):
        interests[i] = left_principal[i] * month_rate
        capitals[i] = monthly_capital
 total_payment[i] = monthly_capital + interests[i]
 if i + 1 < months:
 left_principal[i + 1] = left_principal[i] - monthly_capital
 return capitals, interests, total_payment