跳到主要内容

金融数据分析(十二)房贷综合问题

· 6 分钟阅读
Allen Ma

项目一:

案例详情

王先生是一家高科技公司高级工程师,近期计划在广州购置一套总价为1000万元的住房,由于自有资金有限无法全额付款,拟向当地C银行申请住房按揭贷款。 假定你是C银行负责拓展住房按揭贷款业务的客户经理,在评估了王先生的还款能力后,制定了如下的贷款方案:贷款本金为600万元,贷款期限是30年,贷款利率是按照5年期以上贷款市场报价利率(LPR)上浮5个基点,即是贷款利率是4.9%。但是,针对该贷款有以下两种还款方式可供王先生选择: (1)等额本息还款,具体是指在贷款利率水平不变的情况下,王先生作为借款人每月还款的本金和利息之和保持不变; (2)等额本金还款,具体是指在贷款利率水平不变的情况下,王先生每月还款的本金固定不变,支付的利息则是逐月递减。 为了让王先生清楚了解这两种还款方式的差异性,并且借助图形展示贷款还款情况,你需要运用Python完成3项编程任务。

编程任务

(1)假定选择了等额本息还款,请计算王先生需要每月偿还的金额,以及每月偿还金额中的本金额和利息额,并且对相关数据可视化。 (2)为了能够让王先生知道在等额本息的规则下贷款利率变动对每月还款金额的影响,你采用了如下的敏感性分析:即是模拟出当贷款利率从2%/年增加至8%/年时,王先生每月偿还金额的变化情况,并且进行可视化展示。 (3)假定采用等额本金还款规则,贷款利率依然是4.9%/年,分别计算王先生每月偿还金额中的本金部分和利息部分,并且对结果进行可视化展示。

开始编程:

# -*- coding: utf-8 -*-
"""
Created on Tue Sept 22 8:47:37 2020

@author: mly
"""
import numpy as np
import matplotlib.pyplot as plt

# (1)
dp_rate = 0.049 # 贷款利率
loan_pv = 6000000 # 贷款本金 单位:元
loan_year = 30 # 贷款期限(年)
repay_mon = -round(np.pmt(dp_rate / 12, loan_year * 12, loan_pv)) # 每月还款额
interestList = [] # 每期利息的列表
capitalList = [] # 每期需还本金的列表
monthList = [x for x in range(loan_year * 12)] # 还款期数列表
rest = loan_pv #定义剩余代还本金
for i in range(loan_year * 12):
interest = round(rest * (dp_rate / 12)) # 每期的利息
interestList.append(interest) # 将每期的利息插入利息的列表
repay_capital = repay_mon - interest # 每期需还的本金
capitalList.append(repay_capital) # 将每期需还本金插入需还本金的列表
rest = round(rest - repay_capital) # 剩余待还本金
# 绘制堆积柱状图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False #显示中文
plt.bar(monthList, capitalList, align="center", color="#EE9A49", label='每月本金额')
plt.bar(monthList, interestList, align="center", bottom=capitalList, color="#000000", label='每月利息额')
plt.xlabel('还款期限(月)')
plt.ylabel('每月还款额(元)')
plt.title('等额本息还款图')
plt.legend()
plt.show()

#(2)
# 年利率2%~8%的敏感性分析
rates = [x / 100 for x in range(2, 9, 1)] # 贷款年利率
repaymentNL = []
for n in range(len(rates)):
repaymentN = -round(np.pmt(rates[n] / 12, loan_year * 12, loan_pv)) # 每月还款额
repaymentNL.append(repaymentN)
plt.plot(rates, repaymentNL, lw=6,color="#EE9A49", label="每月还款额")
plt.fill_between(rates, 0, repaymentNL, facecolor="#000000", alpha=1)
plt.xlabel('年利率')
plt.ylabel('每月还款额(元)')
plt.title('年利率在2%~8%变化时每月还款额变化趋势')
plt.legend()
plt.show()

# 等额本金
repay_capitalX = loan_pv / (loan_year * 12) # 等额本金每期还款的本金额
repay_capitalXL = [repay_capitalX for i in range(loan_year * 12)]
restX = loan_pv # 初始待还本金
interestXList = [] # 每期利息的列表
repaymentXL = [] # 每期需还本金的列表
for i in range(loan_year * 12):
interestX = round(restX * (dp_rate / 12)) # 每期的利息
interestXList.append(interestX) # 将每期的利息插入利息的列表
restX = round(restX - repay_capitalX) # 剩余待还本金
repaymentX = interestX + repay_capitalX # 每期还款额
repaymentXL.append(repaymentX)
# 绘制堆积柱状图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(monthList, repaymentXL)
plt.bar(monthList, repay_capitalXL, align="center", color="#000000", label='每期本金额')
plt.bar(monthList, interestXList, align="center", bottom=repay_capitalXL, color="#EE9A49", label='每期利息额')
plt.xlabel('还款期限(月)')
plt.ylabel('每期还款额(元)')
plt.title('等额本金还款图')
plt.legend()
plt.show()

结果展示

等额本息还款图 年利率在2%~8%变化时每月还款额变化趋势 等额本金还款图