你真的认真想过了吗?

贷的款,迟早是要还的。 ------ 爱心觉罗 . 辑 . 虾扯


前言

昨天用Python简单的计算了装修贷和房贷的比较关系,我们的结论是装修贷会比同期房贷利率高,还得到了装修贷的年利率简单的估算关系。我们初步的结论是装修贷没有房贷划算。

高中同届唯一考上清华的同学看了说,装修贷如果提前还款,在2-3年还清其实也挺划算。所以,我们真的认真思考过我们的模型了吗?作为金融屌丝,我们就要跟银行的数据分析师死磕到底。
我们真的就不能薅羊毛了吗?能用装修贷来还房贷吗?


为了简化问题,我们的目标函数重新定义

一、重新建模目标函数

鉴于缺钱的事实,我们真的需要向银行贷款30万,用于日常的鬼混。一个是利率为5.39%的房贷,等额本息;一个是月利率0.28%的装修贷,本金分期偿还。两者都可以提前还款,没有额外费用,装修贷最长可贷5年。
为了便于两者的比较,我们假设房贷30万也是5年期的(因为我们的房贷肯定远大于30万,30万在深圳一个厕所都买不到),房贷每月还款金额13681.42,可能会比装修贷每月多一点钱,两者做比较时就不考虑额外的影响了。
所以,我们简单的想一下就能知道,假设我们只贷款了一个月就把贷款全部结清,那么,房贷需要还多少钱?装修贷又需要还多少钱呢?
假设我们只贷款了一个月就把贷款全部结清,房贷总计还款301347.5;装修贷总计还款金额300840,装修贷比房贷还款差额(ChaE):少还507.5元。
WHAT?不是说房贷利率低吗?怎么装修贷还能少还钱?也就是说如果我最开始就用装修贷还了房贷,1个月结清了贷款,银行就会少赚我507.5元的利润。
计算公式推导如下:
设还款总期数为m,房贷每月还款金额X元后,房贷剩余的本金的计算公式为:
在这里插入图片描述
房贷的月利率为β。
所以,m期后我们结清房贷,总计还款金额为:m×X + Am
每期装修贷还款金额T。
T = 贷款本金(B0)/还款期数(5×12) + 贷款本金(B0)×月利率
m期后装修贷的剩余本金为:
贷款剩余本金(Bm) = 贷款初始本金(B0) - 贷款初始本金(B0)/(5×12)×m
B0是30万。所以,m期后我们结清装修贷,总计还款金额为:m×T + Bm
所以,两者的差额函数为:
ChaE = (m×T + Bm) – (m×X + Am)

怎么回事呢?仔细想想就知道,装修贷因为算利息时用的初始本金B0来算,假设你还到最后一个月,你的本金其实都快没有了,然而你的利息还是用的最初贷款本金30万来计算,肯定吃亏啊。所以,装修贷是越往后,年化利率越高。具体变化趋势我画了图来展示。

二、绘制模型图

1.装修贷转化为同期房贷的利率变化图

我画了一个图来展示装修贷转化为同期房贷的利率变化图。(代码较长,最后附)
在这里插入图片描述
可以看到,49期之前装修贷利率都比房贷利率低。而49期后,装修贷便比房贷高了。
那么,我们是否需要持有装修贷到49期最划算呢?答案是NO,NO,NO。
第一期虽然装修贷利率低,相当于3.36%的房贷利率,但是因为贷款时间短,两者利息差仅为507.5元,第二期差额是995.38反而比第一期还高。所以最能薅羊毛的月份不是第一期,也不是49期。
继续分析我们的差额函数ChaE。

2.还款差额函数图

把期数m设为自变量,得到的差额函数为下图。差额函数ChaE和提前还款期数m的关系图如下:
在这里插入图片描述
蓝色柱状图是差额。可以看出50期之前,装修贷都比房贷优惠,50期后,装修贷比房贷贵。
我们最能省到钱的地方是在25个月,能够节约到6594.35元的利息。所以我清华高中同学说法是正确的。
而25个月,对应的装修贷转化的年利率是多少呢?这又是个非线性方程的求解,我们需要使用到scipy.optimize 中的fsolve,专门来解这些高维方程的。

3.最佳还款月的利率

使用到scipy.optimize 中的fsolve求解25个月时装修贷转化的年利率
在这里插入图片描述
装修贷转化的年利率是4.12%,比房贷5.39%能节约1.2个百分点。所以在25个月结清贷款,能防止银行薅走我们6K多的羊毛。


结论

装修贷真的可以用来还25个月房贷!!!
结果挺出乎预料的,所以当我们感叹钱太不禁花的时候,聪明的人总能在任何时候看到可操作的空间。
感谢我清华的高中同学,让我们再次认真审视了这个现实中的数学问题。我也顺手拿出了我的POS机,准备滴滴滴。。。

知识图谱

对于Python知识,本文用到了:
1、 同一个坐标X,左右两边Y轴分别画两个图的twinx;
2、 Y轴显示为%号的设置,通过set_yticklabels设置格式
3、 在图示中添加箭头和备注,揭示重要的信息

三、代码

1.装修贷转化为同期房贷的利率变化图代码

画了一个图来展示装修贷转化为同期房贷的利率变化图。
代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
from scipy.optimize import fsolve
#定义基本参数
benJin=300000     #本金30万
nianXian=5      #贷款年限
zongYueShu=nianXian*12  #贷款总月份数
FangDaiNianXian=5      #贷款年限
FangDaiZongYueShu=FangDaiNianXian*12  #贷款总月份数

#房贷计算公式,输入年利率,输出每月还款额
def fangDaiJiSuan(fangDaiLiLv,tiQianHuanKuanYue):
    yueLiLv = fangDaiLiLv / 12  # 月利率
    meiYueHuanKuan = (benJin * yueLiLv * (1 + yueLiLv) ** FangDaiZongYueShu) / ((1 + yueLiLv) ** FangDaiZongYueShu - 1) #每月还款额
    print('每月房贷还款额度为:', meiYueHuanKuan)
    shiJiGuiHuanE = meiYueHuanKuan*tiQianHuanKuanYue   #实际归还额
    shengYuBenJin = benJin * ((1 + yueLiLv) ** tiQianHuanKuanYue) - meiYueHuanKuan * (
                (1 + yueLiLv) ** tiQianHuanKuanYue - 1) / yueLiLv    #剩余本金
    print('房贷剩余本金:', shengYuBenJin)
    fangDaiZongHuan = shiJiGuiHuanE + shengYuBenJin  # 房贷总还款金额
    print('房贷总计还款额为:', fangDaiZongHuan)

    return fangDaiZongHuan

#信用卡利息计算公式,输入月利率,输出每月还款额
def xinYongKaJiSuan(yueLiXi,tiQianHuanKuanYue):
    meiYueliXi = benJin * yueLiXi  # 信用卡月利息
    meiYueHuanBenJin = benJin / zongYueShu  # 信用卡每月归还本金
    meiYueHuanKuanZongE = meiYueliXi + meiYueHuanBenJin  # 信用卡每月归还额
    xinYongKaShiJiGuiHuan = meiYueHuanKuanZongE * tiQianHuanKuanYue   #信用卡实际还款
    xinYongKaShengYuBenJin = benJin - meiYueHuanBenJin * tiQianHuanKuanYue    #剩余本金的
    print('信用卡每月还款额:', meiYueHuanKuanZongE)
    print('信用卡剩余本金:', xinYongKaShengYuBenJin)
    huanKuanZongE = meiYueHuanKuanZongE * tiQianHuanKuanYue + xinYongKaShengYuBenJin  #信用卡总计还款金额
    print('信用卡总计还款额为:', huanKuanZongE)

    return huanKuanZongE

#定义差额函数,也就是求非线性方程的解,输入房贷年利率,输出房贷和信用卡的还款差额
def chaE(x):
    ##信用卡利息参数
    yueLiXi = 0.0028  # 信用卡月利率
    return fangDaiJiSuan(x,tiQianHuanKuanYue)-xinYongKaJiSuan(yueLiXi,tiQianHuanKuanYue)

#主函数
n = 60      #贷款总月份数
tiQianHuanKuanYueList = np.arange(1,n+1,1)   #提前还款月份
solveList = []     #求解得到的利率列表
for i in np.arange(1,n+1,1):
    tiQianHuanKuanYue = tiQianHuanKuanYueList[i-1]
    solve = fsolve(chaE,[0.5])  #求解房贷年利率
    solveList.append(solve.tolist())
    #打印求解结果
    print(solve)
    #验证结果是否真的是方程的解
    print(np.isclose(chaE(solve), [0.0],atol=1e-3))  #检验解是否是符合方程组的近似解
print(solveList)

plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False
#ax = plt.figure(111)
solveList2 = np.array(solveList).reshape((60,1)).tolist()
print('solveList2) 为')
print(solveList2)
df = pd.DataFrame(solveList2,index=tiQianHuanKuanYueList)
print(df)
# you get ax from here
ax = df.plot()
type(ax)  # matplotlib.axes._subplots.AxesSubplot

# 为了让Y轴显示为百分数
vals = ax.get_yticks()
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])
plt.xlabel('5年期贷款提前归还月份')
plt.ylabel('转换成同期房贷利率')
fangdaililv = [0.0537]*n
print(fangdaililv)
plt.plot(tiQianHuanKuanYueList,fangdaililv)    #房贷利率
fmt = '%.0f%%' # Format you want the ticks, e.g. '40%'
yticks = mtick.FormatStrFormatter(fmt)
vals = ax.get_yticks()   #设置Y轴的格式
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])
plt.legend(('装修贷转换利率','房贷利率'))
plt.grid()
tem = solveList2[24][0]   #取最佳的还款年限的利率
tem=round(tem,4)*100
print('tem')
print(tem)
string = '最佳还款月在25月,转换利率为:' + str(tem)+'%'  #图示标注信息
print(string)
#添加箭头说明
plt.annotate(string,xy=(25,solveList2[24][0]),xytext=(25*0.7,solveList2[24][0]*1.1), arrowprops=dict(arrowstyle="->",connectionstyle = "arc3,rad=.1"))
#寻找最佳还款月份的利率
a=[25]*20
b=np.arange(0,0.06,0.003)
b=b.reshape((20,1))
plt.plot(a,b)
plt.ylim(0.02,0.065)
plt.show()

对于Python知识,本文用到了:
1、 Y轴显示为%号的设置,通过set_yticklabels设置格式
2、 在图示中添加箭头和备注,揭示重要的信息

2.差额函数的生成图示代码

画了一个差额函数的生成图。
代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#定义基本参数
benJin=300000     #本金30万
FangDaiNianXian=5      #贷款年限
tiQianHuanKuanYue = np.arange(1,60,1)   #提前还款月份
FangDaiZongYueShu=FangDaiNianXian*12  #贷款总月份数
##房贷计算参数
fangDaiLiLv=0.0539    #房贷利率
yueLiLv=fangDaiLiLv/12   #月利率
##房贷计算公式
meiYueHuanKuan=(benJin*yueLiLv*(1+yueLiLv)**FangDaiZongYueShu)/((1+yueLiLv)**FangDaiZongYueShu-1)
print('每月房贷还款额度为:',meiYueHuanKuan)
shiJiGuiHuanE = meiYueHuanKuan*tiQianHuanKuanYue   #实际归还额
shengYuBenJin = benJin*((1+yueLiLv)**tiQianHuanKuanYue) - meiYueHuanKuan*((1+yueLiLv)**tiQianHuanKuanYue-1)/yueLiLv
print('房贷剩余本金:',shengYuBenJin)
fangDaiZongHuan=meiYueHuanKuan*tiQianHuanKuanYue + shengYuBenJin    #房贷总还款金额
print('房贷总计还款额为:',fangDaiZongHuan)

XinYongKaNianXian = 5
zongYueShu=XinYongKaNianXian*12  #贷款总月份数
##信用卡利息计算参数
yueLiXi = 0.0028      #信用卡月利率
meiYueliXi=benJin*yueLiXi    #信用卡月利息
meiYueHuanBenJin = benJin/zongYueShu     #信用卡每月归还本金
meiYueHuanKuanZongE = meiYueliXi+meiYueHuanBenJin   #信用卡每月归还额
xinYongKaShiJiGuiHuan = meiYueHuanKuanZongE*tiQianHuanKuanYue
xinYongKaShengYuBenJin = benJin - meiYueHuanBenJin*tiQianHuanKuanYue
print('信用卡每月还款额:',meiYueHuanKuanZongE)
print('信用卡剩余本金:',xinYongKaShengYuBenJin)
huanKuanZongE = meiYueHuanKuanZongE*tiQianHuanKuanYue + xinYongKaShengYuBenJin   #信用卡总计还款金额
print('信用卡总计还款额为:',huanKuanZongE)

#两种贷款归还金额差额
chaE= huanKuanZongE-fangDaiZongHuan   #信用卡比房贷多还款的金额
print('信用卡比房贷多还款金额:',chaE)
print('差额最大出现在:',np.argmin(chaE))
#画图参数
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.bar(tiQianHuanKuanYue,chaE,color='deepskyblue',label='left')
ax1.set_ylabel('装修贷与房贷差额(元)')
plt.xlabel('5年期贷款提前归还月份')
string = '最大的差额出现在25月,金额为:' + str(round(chaE[24],2))
plt.annotate(string,xy=(25,chaE[24]),xytext=(25*0.7,chaE[24]*1.1), arrowprops=dict(arrowstyle="->",connectionstyle = "arc3,rad=.1"))

plt.grid()
ax2 = ax1.twinx()
ax2.scatter(tiQianHuanKuanYue,fangDaiZongHuan,c='blue')
ax2.scatter(tiQianHuanKuanYue,huanKuanZongE,c='red',marker='*')

ax2.set_title('装修贷和房贷对比图')
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False
plt.legend(('房贷','装修贷'))
plt.ylabel('还款总额(元)')
plt.grid()
#plt.subplots_adjust(left=0.01)
plt.show()

对于Python知识,本文用到了:
1、 同一个坐标X,左右两边Y轴分别画两个图的twinx;

猜你喜欢

转载自blog.csdn.net/weixin_43290383/article/details/112050945
今日推荐