貸的款,遲早是要還的。 ------ 愛(ài)心覺(jué)羅 . 輯 . 蝦扯
文章目錄
- 前言
- 一、重新建模目標(biāo)函數(shù)
- 二、繪制模型圖
- 1.裝修貸轉(zhuǎn)化為同期房貸的利率變化圖
- 2.還款差額函數(shù)圖
- 3.最佳還款月的利率
- 結(jié)論
- 知識(shí)圖譜
- 三、代碼
- 1.裝修貸轉(zhuǎn)化為同期房貸的利率變化圖代碼
- 2.差額函數(shù)的生成圖示代碼
前言
昨天用Python簡(jiǎn)單的計(jì)算了裝修貸和房貸的比較關(guān)系,我們的結(jié)論是裝修貸會(huì)比同期房貸利率高,還得到了裝修貸的年利率簡(jiǎn)單的估算關(guān)系。我們初步的結(jié)論是裝修貸沒(méi)有房貸劃算。
高中同屆唯一考上清華的同學(xué)看了說(shuō),裝修貸如果提前還款,在2-3年還清其實(shí)也挺劃算。所以,我們真的認(rèn)真思考過(guò)我們的模型了嗎?作為金融屌絲,我們就要跟銀行的數(shù)據(jù)分析師死磕到底。
我們真的就不能薅羊毛了嗎?能用裝修貸來(lái)還房貸嗎?
為了簡(jiǎn)化問(wèn)題,我們的目標(biāo)函數(shù)重新定義
一、重新建模目標(biāo)函數(shù)
鑒于缺錢(qián)的事實(shí),我們真的需要向銀行貸款30萬(wàn),用于日常的鬼混。一個(gè)是利率為5.39%的房貸,等額本息;一個(gè)是月利率0.28%的裝修貸,本金分期償還。兩者都可以提前還款,沒(méi)有額外費(fèi)用,裝修貸最長(zhǎng)可貸5年。
為了便于兩者的比較,我們假設(shè)房貸30萬(wàn)也是5年期的(因?yàn)槲覀兊姆抠J肯定遠(yuǎn)大于30萬(wàn),30萬(wàn)在深圳一個(gè)廁所都買(mǎi)不到),房貸每月還款金額13681.42,可能會(huì)比裝修貸每月多一點(diǎn)錢(qián),兩者做比較時(shí)就不考慮額外的影響了。
所以,我們簡(jiǎn)單的想一下就能知道,假設(shè)我們只貸款了一個(gè)月就把貸款全部結(jié)清,那么,房貸需要還多少錢(qián)?裝修貸又需要還多少錢(qián)呢?
假設(shè)我們只貸款了一個(gè)月就把貸款全部結(jié)清,房貸總計(jì)還款301347.5;裝修貸總計(jì)還款金額300840,裝修貸比房貸還款差額(ChaE):少還507.5元。
WHAT?不是說(shuō)房貸利率低嗎?怎么裝修貸還能少還錢(qián)?也就是說(shuō)如果我最開(kāi)始就用裝修貸還了房貸,1個(gè)月結(jié)清了貸款,銀行就會(huì)少賺我507.5元的利潤(rùn)。
計(jì)算公式推導(dǎo)如下:
設(shè)還款總期數(shù)為m,房貸每月還款金額X元后,房貸剩余的本金的計(jì)算公式為:
房貸的月利率為β。
所以,m期后我們結(jié)清房貸,總計(jì)還款金額為:m×X + Am
每期裝修貸還款金額T。
T = 貸款本金(B0)/還款期數(shù)(5×12) + 貸款本金(B0)×月利率
m期后裝修貸的剩余本金為:
貸款剩余本金(Bm) = 貸款初始本金(B0) - 貸款初始本金(B0)/(5×12)×m
B0是30萬(wàn)。所以,m期后我們結(jié)清裝修貸,總計(jì)還款金額為:m×T + Bm
所以,兩者的差額函數(shù)為:
ChaE = (m×T + Bm) – (m×X + Am)
怎么回事呢?仔細(xì)想想就知道,裝修貸因?yàn)樗憷r(shí)用的初始本金B(yǎng)0來(lái)算,假設(shè)你還到最后一個(gè)月,你的本金其實(shí)都快沒(méi)有了,然而你的利息還是用的最初貸款本金30萬(wàn)來(lái)計(jì)算,肯定吃虧啊。所以,裝修貸是越往后,年化利率越高。具體變化趨勢(shì)我畫(huà)了圖來(lái)展示。
二、繪制模型圖
1.裝修貸轉(zhuǎn)化為同期房貸的利率變化圖
我畫(huà)了一個(gè)圖來(lái)展示裝修貸轉(zhuǎn)化為同期房貸的利率變化圖。(代碼較長(zhǎng),最后附)
可以看到,49期之前裝修貸利率都比房貸利率低。而49期后,裝修貸便比房貸高了。
那么,我們是否需要持有裝修貸到49期最劃算呢?答案是NO,NO,NO。
第一期雖然裝修貸利率低,相當(dāng)于3.36%的房貸利率,但是因?yàn)橘J款時(shí)間短,兩者利息差僅為507.5元,第二期差額是995.38反而比第一期還高。所以最能薅羊毛的月份不是第一期,也不是49期。
繼續(xù)分析我們的差額函數(shù)ChaE。
2.還款差額函數(shù)圖
把期數(shù)m設(shè)為自變量,得到的差額函數(shù)為下圖。差額函數(shù)ChaE和提前還款期數(shù)m的關(guān)系圖如下:
藍(lán)色柱狀圖是差額。可以看出50期之前,裝修貸都比房貸優(yōu)惠,50期后,裝修貸比房貸貴。
我們最能省到錢(qián)的地方是在25個(gè)月,能夠節(jié)約到6594.35元的利息。所以我清華高中同學(xué)說(shuō)法是正確的。
而25個(gè)月,對(duì)應(yīng)的裝修貸轉(zhuǎn)化的年利率是多少呢?這又是個(gè)非線性方程的求解,我們需要使用到scipy.optimize 中的fsolve,專(zhuān)門(mén)來(lái)解這些高維方程的。
3.最佳還款月的利率
使用到scipy.optimize 中的fsolve求解25個(gè)月時(shí)裝修貸轉(zhuǎn)化的年利率
裝修貸轉(zhuǎn)化的年利率是4.12%,比房貸5.39%能節(jié)約1.2個(gè)百分點(diǎn)。所以在25個(gè)月結(jié)清貸款,能防止銀行薅走我們6K多的羊毛。
結(jié)論
裝修貸真的可以用來(lái)還25個(gè)月房貸!!!
結(jié)果挺出乎預(yù)料的,所以當(dāng)我們感嘆錢(qián)太不禁花的時(shí)候,聰明的人總能在任何時(shí)候看到可操作的空間。
感謝我清華的高中同學(xué),讓我們?cè)俅握J(rèn)真審視了這個(gè)現(xiàn)實(shí)中的數(shù)學(xué)問(wèn)題。我也順手拿出了我的POS機(jī),準(zhǔn)備滴滴滴。。。
知識(shí)圖譜
對(duì)于Python知識(shí),本文用到了:
1、 同一個(gè)坐標(biāo)X,左右兩邊Y軸分別畫(huà)兩個(gè)圖的twinx;
2、 Y軸顯示為%號(hào)的設(shè)置,通過(guò)set_yticklabels設(shè)置格式
3、 在圖示中添加箭頭和備注,揭示重要的信息
三、代碼
1.裝修貸轉(zhuǎn)化為同期房貸的利率變化圖代碼
畫(huà)了一個(gè)圖來(lái)展示裝修貸轉(zhuǎn)化為同期房貸的利率變化圖。
代碼如下:
import numpy as np
import pandas as pd
import matplotlib
.pyplot as plt
import matplotlib
.ticker as mtick
from scipy
.optimize import fsolve
#定義基本參數(shù)
benJin
=300000 #本金
30萬(wàn)
nianXian
=5 #貸款年限
zongYueShu
=nianXian
*12 #貸款總月份數(shù)
FangDaiNianXian
=5 #貸款年限
FangDaiZongYueShu
=FangDaiNianXian
*12 #貸款總月份數(shù)#房貸計(jì)算公式,輸入年利率,輸出每月還款額
def
fangDaiJiSuan(fangDaiLiLv
,tiQianHuanKuanYue
):yueLiLv
= fangDaiLiLv
/ 12 # 月利率meiYueHuanKuan
= (benJin
* yueLiLv
* (1 + yueLiLv
) ** FangDaiZongYueShu
) / ((1 + yueLiLv
) ** FangDaiZongYueShu
- 1) #每月還款額
print('每月房貸還款額度為:', meiYueHuanKuan
)shiJiGuiHuanE
= meiYueHuanKuan
*tiQianHuanKuanYue #實(shí)際歸還額shengYuBenJin
= benJin
* ((1 + yueLiLv
) ** tiQianHuanKuanYue
) - meiYueHuanKuan
* ((1 + yueLiLv
) ** tiQianHuanKuanYue
- 1) / yueLiLv #剩余本金
print('房貸剩余本金:', shengYuBenJin
)fangDaiZongHuan
= shiJiGuiHuanE
+ shengYuBenJin # 房貸總還款金額
print('房貸總計(jì)還款額為:', fangDaiZongHuan
)return fangDaiZongHuan#信用卡利息計(jì)算公式
,輸入月利率,輸出每月還款額
def
xinYongKaJiSuan(yueLiXi
,tiQianHuanKuanYue
):meiYueliXi
= benJin
* yueLiXi # 信用卡月利息meiYueHuanBenJin
= benJin
/ zongYueShu # 信用卡每月歸還本金meiYueHuanKuanZongE
= meiYueliXi
+ meiYueHuanBenJin # 信用卡每月歸還額xinYongKaShiJiGuiHuan
= meiYueHuanKuanZongE
* tiQianHuanKuanYue #信用卡實(shí)際還款xinYongKaShengYuBenJin
= benJin
- meiYueHuanBenJin
* tiQianHuanKuanYue #剩余本金的
print('信用卡每月還款額:', meiYueHuanKuanZongE
)print('信用卡剩余本金:', xinYongKaShengYuBenJin
)huanKuanZongE
= meiYueHuanKuanZongE
* tiQianHuanKuanYue
+ xinYongKaShengYuBenJin #信用卡總計(jì)還款金額
print('信用卡總計(jì)還款額為:', huanKuanZongE
)return huanKuanZongE#定義差額函數(shù),也就是求非線性方程的解,輸入房貸年利率,輸出房貸和信用卡的還款差額
def
chaE(x
):##信用卡利息參數(shù)yueLiXi
= 0.0028 # 信用卡月利率
return fangDaiJiSuan(x
,tiQianHuanKuanYue
)-xinYongKaJiSuan(yueLiXi
,tiQianHuanKuanYue
)#主函數(shù)
n
= 60 #貸款總月份數(shù)
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())#打印求解結(jié)果
print(solve
)#驗(yàn)證結(jié)果是否真的是方程的解
print(np
.isclose(chaE(solve
), [0.0],atol
=1e-3)) #檢驗(yàn)解是否是符合方程組的近似解
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軸顯示為百分?jǐn)?shù)
vals
= ax
.get_yticks()
ax
.set_yticklabels(['{:,.2%}'.format(x
) for x in vals
])
plt
.xlabel('5年期貸款提前歸還月份')
plt
.ylabel('轉(zhuǎn)換成同期房貸利率')
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() #設(shè)置Y軸的格式
ax
.set_yticklabels(['{:,.2%}'.format(x
) for x in vals
])
plt
.legend(('裝修貸轉(zhuǎn)換利率','房貸利率'))
plt
.grid()
tem
= solveList2
[24][0] #取最佳的還款年限的利率
tem
=round(tem
,4)*100
print('tem')
print(tem
)
string
= '最佳還款月在25月,轉(zhuǎn)換利率為:' + str(tem
)+'%' #圖示標(biāo)注信息
print(string
)
#添加箭頭說(shuō)明
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()
對(duì)于Python知識(shí),本文用到了:
1、 Y軸顯示為%號(hào)的設(shè)置,通過(guò)set_yticklabels設(shè)置格式
2、 在圖示中添加箭頭和備注,揭示重要的信息
2.差額函數(shù)的生成圖示代碼
畫(huà)了一個(gè)差額函數(shù)的生成圖。
代碼如下:
import numpy as np
import pandas as pd
import matplotlib
.pyplot as plt
#定義基本參數(shù)
benJin
=300000 #本金
30萬(wàn)
FangDaiNianXian
=5 #貸款年限
tiQianHuanKuanYue
= np
.arange(1,60,1) #提前還款月份
FangDaiZongYueShu
=FangDaiNianXian
*12 #貸款總月份數(shù)
##房貸計(jì)算參數(shù)
fangDaiLiLv
=0.0539 #房貸利率
yueLiLv
=fangDaiLiLv
/12 #月利率
##房貸計(jì)算公式
meiYueHuanKuan
=(benJin
*yueLiLv
*(1+yueLiLv
)**FangDaiZongYueShu
)/((1+yueLiLv
)**FangDaiZongYueShu
-1)
print('每月房貸還款額度為:',meiYueHuanKuan
)
shiJiGuiHuanE
= meiYueHuanKuan
*tiQianHuanKuanYue #實(shí)際歸還額
shengYuBenJin
= benJin
*((1+yueLiLv
)**tiQianHuanKuanYue
) - meiYueHuanKuan
*((1+yueLiLv
)**tiQianHuanKuanYue
-1)/yueLiLv
print('房貸剩余本金:',shengYuBenJin
)
fangDaiZongHuan
=meiYueHuanKuan
*tiQianHuanKuanYue
+ shengYuBenJin #房貸總還款金額
print('房貸總計(jì)還款額為:',fangDaiZongHuan
)XinYongKaNianXian
= 5
zongYueShu
=XinYongKaNianXian
*12 #貸款總月份數(shù)
##信用卡利息計(jì)算參數(shù)
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 #信用卡總計(jì)還款金額
print('信用卡總計(jì)還款額為:',huanKuanZongE
)#兩種貸款歸還金額差額
chaE
= huanKuanZongE
-fangDaiZongHuan #信用卡比房貸多還款的金額
print('信用卡比房貸多還款金額:',chaE
)
print('差額最大出現(xiàn)在:',np
.argmin(chaE
))
#畫(huà)圖參數(shù)
fig
= plt
.figure()
ax1
= fig
.add_subplot(111)
ax1
.bar(tiQianHuanKuanYue
,chaE
,color
='deepskyblue',label
='left')
ax1
.set_ylabel('裝修貸與房貸差額(元)')
plt
.xlabel('5年期貸款提前歸還月份')
string
= '最大的差額出現(xiàn)在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('裝修貸和房貸對(duì)比圖')
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()
對(duì)于Python知識(shí),本文用到了:
1、 同一個(gè)坐標(biāo)X,左右兩邊Y軸分別畫(huà)兩個(gè)圖的twinx;
總結(jié)
以上是生活随笔為你收集整理的你真的认真想过了吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。