貸的款,遲早是要還的。 ------ 愛心覺羅 . 輯 . 蝦扯
文章目錄
- 前言
- 一、重新建模目標函數
- 二、繪制模型圖
- 1.裝修貸轉化為同期房貸的利率變化圖
- 2.還款差額函數圖
- 3.最佳還款月的利率
- 結論
- 知識圖譜
- 三、代碼
- 1.裝修貸轉化為同期房貸的利率變化圖代碼
- 2.差額函數的生成圖示代碼
前言
昨天用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;
總結
以上是生活随笔為你收集整理的你真的认真想过了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。