-
案例详情
王先生是一家高科技公司高级工程师,近期计划在广州购置一套总价为1000万元的住房,由于自有资金有限无法全额付款,拟向当地C银行申请住房按揭贷款。
假定你是C银行负责拓展住房按揭贷款业务的客户经理,在评估了王先生的还款能力后,制定了如下的贷款方案:贷款本金为600万元,贷款期限是30年,贷款利率是按照5年期以上贷款市场报价利率(LPR)上浮5个基点,即是贷款利率是4.9%。但是,针对该贷款有以下两种还款方式可供王先生选择:
1. 等额本息还款,具体是指在贷款利率水平不变的情况下,王先生作为借款人每月还款的本金和利息之和保持不变。
2. 等额本金还款,具体是指在贷款利率水平不变的情况下,王先生每月还款的本金固定不变,支付的利息则是逐月递减。
为了让王先生清楚了解这两种还款方式的差异性,并且借助图形展示贷款还款情况,你需要运用Python完成3项编程任务。
-
编程任务
- 假定选择了等额本息还款,请计算王先生需要每月偿还的金额,以及每月偿还金额中的本金额和利息额,并且对相关数据可视化。
- 为了能够让王先生知道在等额本息的规则下贷款利率变动对每月还款金额的影响,你采用了如下的敏感性分析:即是模拟出当贷款利率从2%/年增加至8%/年时,王先生每月偿还金额的变化情况,并且进行可视化展示。
- 假定采用等额本金还款规则,贷款利率依然是4.9%/年,分别计算王先生每月偿还金额中的本金部分和利息部分,并且对结果进行可视化展示。
提示:等额本息还款规则下,可以运用Numpy包中的函数pmt计算按揭贷款每月固定还款金额,函数ipmt和ppmt分别计算每月还款金额中的利息部分与本金部分。
-
代码实现
import numpy as np
import matplotlib.pyplot as plt
import numpy_financial as npf
安装numpy-financial包:pip install numpy-financial
plt.rcParams['font.sans-serif'] = ['SimSun'] # 设置中文显示字体为宋体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
(1)假定选择了等额本息还款
计算王先生需要每月偿还的金额,以及每月偿还金额中的本金额和利息额。
# 贷款本金
loan_principal = 6000000 # 单位:元
# 贷款期限(月)
loan_term = 30 * 12
# 贷款利率(年)
annual_interest_rate = 0.049
# 计算每月偿还金额
monthly_interest_rate = annual_interest_rate / 12
monthly_payment = loan_principal * monthly_interest_rate * (1 + monthly_interest_rate) ** loan_term / ((1 + monthly_interest_rate) ** loan_term - 1)
print("每月偿还金额:", round(monthly_payment, 2))
# 计算每月本金和利息部分
interest_paid = []
principal_paid = []
total_payment = []
remaining_loan = loan_principal
for month in range(1, loan_term + 1):
interest = remaining_loan * monthly_interest_rate
principal = monthly_payment - interest
total = monthly_payment
interest_paid.append(interest)
principal_paid.append(principal)
total_payment.append(total)
remaining_loan -= principal
# 可视化
import matplotlib.pyplot as plt
months = list(range(1, loan_term + 1))
plt.figure(figsize=(10, 6))
plt.plot(months, interest_paid, label='利息')
plt.plot(months, principal_paid, label='本金')
plt.plot(months, total_payment, label='总金额', linestyle='--')
plt.xlabel('月份')
plt.ylabel('金额(元)')
plt.title('等额本息还款每月本金、利息和总金额')
plt.legend()
plt.grid(True)
plt.show()
(2) 敏感性分析
模拟出当贷款利率从2%/年增加至8%/年时,王先生每月偿还金额的变化情况。
# 贷款本金
loan_principal = 6000000 # 单位:元
# 贷款期限(月)
loan_term = 30 * 12
# 贷款利率范围(年)
interest_rates = np.linspace(0.02, 0.08, 100)
# 计算每月偿还金额
monthly_payments = []
for rate in interest_rates:
monthly_interest_rate = rate / 12
monthly_payment = npf.pmt(monthly_interest_rate, loan_term, -loan_principal)
monthly_payments.append(monthly_payment)
# 贷款利率为4.9%时的每月偿还金额
annual_interest_rate_4_9 = 0.049
monthly_interest_rate_4_9 = annual_interest_rate_4_9 / 12
monthly_payment_4_9 = npf.pmt(monthly_interest_rate_4_9, loan_term, -loan_principal)
# 可视化
plt.plot(interest_rates * 100, monthly_payments, color='red',label='贷款利率变动')
plt.scatter(4.9, monthly_payment_4_9, color='blue', label='4.9%利率', marker='o')
plt.xlabel('贷款利率(%)')
plt.ylabel('每月还款金额(元)')
plt.title('贷款利率变动对每月还款金额的影响')
plt.legend()
plt.grid(True)
plt.show()
(3)假定采用等额本金还款规则
贷款利率依然是4.9%/年,分别计算王先生每月偿还金额中的本金部分和利息部分。
# 贷款本金
loan_principal = 6000000 # 单位:元
# 贷款期限(月)
loan_term = 30 * 12
# 贷款利率(年)
annual_interest_rate = 0.049
# 计算每月偿还金额
monthly_interest_rate = annual_interest_rate / 12
# 每月偿还本金部分和利息部分
monthly_payment = loan_principal / loan_term
remaining_loan = loan_principal
principal_paid = []
interest_paid = []
total_payment = []
for month in range(1, loan_term + 1):
interest = remaining_loan * monthly_interest_rate
principal = monthly_payment
total = principal + interest
principal_paid.append(principal)
interest_paid.append(interest)
total_payment.append(total)
remaining_loan -= principal
# 可视化
months = list(range(1, loan_term + 1))
plt.figure(figsize=(10, 6))
plt.plot(months, interest_paid, label='利息')
plt.plot(months, principal_paid, label='本金')
plt.plot(months, total_payment, label='总金额', linestyle='--')
plt.xlabel('月份')
plt.ylabel('金额(元)')
plt.title('等额本金还款每月本金、利息和总金额')
plt.legend()
plt.grid(True)
plt.show()