PythonNote017---计算房贷还款

等额本息还款

  选择等额本息还款方式时,每个月还款金额是固定的,此时每个月还款的利息和本金都是变化的。介绍几个定义:

  • 年利率,银行约定的贷款年利率,如果商贷4.9%
  • 月利率= 年利率/12
  • 代还本金=总本金-已还本金
  • 当期应还利息 = 代还本金*月利率
  • 当期应还本金 = 固定额 - 当期应还利息

第一期时:

  • 1st应还利息 = 总本金*月利率
  • 1st应还本金 = 固定额 - 当期应还利息
    第二期时:
  • 2nd应还利息 = (总本金-第一期已还本金)*月利率
  • 2nd应还本金 = 固定额 - 第二期应还利息

所以,需要求这个固定额,直接看百度百科的证明:https://baike.baidu.com/item/%E7%AD%89%E9%A2%9D%E6%9C%AC%E6%81%AF%E8%BF%98%E6%AC%BE%E6%B3%95#3

在这里插入图片描述

等额本金

等额本金即每个月还款本金相同,如贷款360w,30年,那么每个月还款本金均为360w/30/12=1w,每个月应还利息和等额本息计算方式一致,不多说。

Python计算

写个简单的函数,输出每期还款数据

import pandas as pd
pd.set_option('display.max_rows', 500) # 打印最大行数
pd.set_option('display.max_columns', 500) # 打印最大列数
def RepaymentCalculator(Loans, Year, YearRate, Type="等额本息"):
    """
    Loans:贷款总额
    Year: 贷款期限,单位年
    YearRate:贷款年利率
    Type: 还款方式,"等额本金"or"等额本息"
    """
    Month = Year * 12  #贷款总月数
    MonthRate = YearRate / 12
    if (Type == "等额本息"):
        # 先求每个月固定还款额
        FixedPayment = (Loans * MonthRate * ((1 + MonthRate)**Month)) / (
            (1 + MonthRate)**Month - 1)
    elif (Type == "等额本金"):
        FixedPayment = Loans / Month

    repayMonthIndex = []
    repayMonthPrincipal = []
    repayMonthInterest = []
    unpayPrincipal = []
    #剩余本金
    UnpaidPrincipal = Loans
    if (Type == "等额本息"):
        for i in range(Month):
            # 本月代还本金
            unpayPrincipal.append(UnpaidPrincipal)
            repayMonthIndex.append(i + 1)
            # 先计算当月利息
            thisMonthInterest = UnpaidPrincipal * MonthRate
            repayMonthInterest.append(thisMonthInterest)
            # 再计算当月本金
            thisMonthPrincipal = FixedPayment - thisMonthInterest
            repayMonthPrincipal.append(thisMonthPrincipal)
            # 最后更新代还本金
            UnpaidPrincipal = UnpaidPrincipal - thisMonthPrincipal
    elif (Type == "等额本金"):
        for i in range(Month):
            # 本月代还本金
            unpayPrincipal.append(UnpaidPrincipal)
            repayMonthIndex.append(i + 1)
            # 先计算当月利息
            thisMonthInterest = UnpaidPrincipal * MonthRate
            repayMonthInterest.append(thisMonthInterest)
            # 再计算当月本金,等额本金不变哦
            thisMonthPrincipal = FixedPayment
            repayMonthPrincipal.append(thisMonthPrincipal)
            # 最后更新代还本金
            UnpaidPrincipal = UnpaidPrincipal - thisMonthPrincipal
    # 生成dataframe
    res = pd.DataFrame({
        "还款期数": repayMonthIndex,
        "未还本金": unpayPrincipal,
        "还款本金": repayMonthPrincipal,
        "还款利息": repayMonthInterest
    })
    res["还款总额"] = res["还款本金"]+res["还款利息"]
    # 调整小数位数
    res = res.round(2)
    return res

假设商贷100w,贷款30年,年利率4.9%,选择等额本息的还款方式,那么每个月需要还多少钱呢~

df = RepaymentCalculator(Loans=1000000, Year=30, YearRate=0.049, Type="等额本息")
df.head()
还款期数未还本金还款本金还款利息还款总额
011000000.001223.934083.335307.27
12998776.071228.934078.345307.27
23997547.131233.954073.325307.27
34996313.181238.994068.285307.27
45995074.201244.054063.225307.27

可以看到每个月固定还款5307.27,因为未还本金越来越少,每一期的还款利息也越来越少

def alreadyRepay(repayYear,df):
    """
    repayYear:已还年数
    """
    alreadyRepayMonths = repayYear *12
    # 先筛选子集  
    subDf = df.query("还款期数<=%s"%alreadyRepayMonths)
    # 计算对应指标  
    ## 剩余还款期数
    unRepayMonths = df.shape[0] - alreadyRepayMonths
    ## 未还本金  
    unRepayPrincipal = df.还款本金.sum() - subDf.还款本金.sum()
    ## 已还本金
    alreadyRepayPrincipal= subDf.还款本金.sum()
    ## 已还利息 
    alreadyRepayInterest= subDf.还款利息.sum()
    print("====================== 已还%s期======================"%alreadyRepayMonths)
    print("剩余还款期数: "+str(unRepayMonths)+"\n"+"剩余未还本金: "+str(unRepayPrincipal)+"\n"+"已还本金: "+str(alreadyRepayPrincipal
)+"\n"+"已还利息: "+str(alreadyRepayInterest)+"\n")
alreadyRepay(5,df)
====================== 已还60期======================
剩余还款期数: 300
剩余未还本金: 916977.14
已还本金: 83022.9
已还利息: 235413.12
alreadyRepay(10,df)
====================== 已还120期======================
剩余还款期数: 240
剩余未还本金: 810958.17
已还本金: 189041.87
已还利息: 447830.19

如果贷款100w,10年本金只还了18.9w。我擦,使劲儿搬砖吧~亚历山大的节奏!!!

                                2020-02-23 于南京市栖霞区

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于房贷提前还款计算,你可以使用Python编程语言来实现。下面是一个示例代码,可以帮助你计算房贷提前还款的情况。 ```python def calculate_repayment(principal, interest_rate, years): monthly_interest_rate = interest_rate / 12 / 100 months = years * 12 # 等额还款 monthly_repayment = (principal * monthly_interest_rate * pow(1 + monthly_interest_rate, months)) / (pow(1 + monthly_interest_rate, months) - 1) # 等额本金 monthly_principal = principal / months total_interest = 0 remaining_principal = principal repayment_schedule = [] for i in range(months): interest = remaining_principal * monthly_interest_rate total_interest += interest remaining_principal -= monthly_principal repayment_schedule.append((i+1, monthly_principal, interest, remaining_principal)) return monthly_repayment, repayment_schedule # 示例用法 principal = 1000000 interest_rate = 6 years = 20 monthly_repayment, repayment_schedule = calculate_repayment(principal, interest_rate, years) print("按等额还款方式,每月需要还款金额为:", monthly_repayment) print("按等额本金还款方式,每月还款额度如下:") for schedule in repayment_schedule: print(schedule) ``` 这段代码定义了一个`calculate_repayment`函数,接受贷款本金、年利率和还款年限作为参数。函数返回等额还款方式下每月需要还款的金额,以及等额本金还款方式下每月还款额度的详细信息。 运行这段代码,你将得到按照等额还款方式每月需要还款的金额以及按照等额本金还款方式每月还款额度的详细信息。你可以根据这些信息来计算房贷提前还款的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值