用Python分析房屋抵押貸款 —— 帶著Python玩金融(3)

你打算買房了痹届,可是你對抵押貸款卻是一頭霧水。每月該還多少呢打月?利息占多少队腐?房子幾成屬于自己呢?房價上漲或下跌時怎么估算房產(chǎn)價值奏篙?別擔(dān)心柴淘,本文將通過Python帶你一步步算清這其中的門道。

每月還款額

抵押貸款是指購房者將所購房屋作為抵押秘通,從銀行獲得貸款悠就,并且按照一定的利率分期還款給銀行。
假如你打算按揭貸款一套500萬的房子充易,首付三成梗脾,我們先來計算首付和貸款的金額。

import numpy as np

# 設(shè)置房屋總價值
home_value = 5000000
# 設(shè)置首付比例
down_payment_percent = 0.3

# 計算首付金額
down_payment = home_value * down_payment_percent
print("首付金額: " + str(down_payment))
# 計算貸款額度
mortgage_loan = home_value - down_payment
print("貸款金額: " + str(mortgage_loan))
首付金額: 1500000.0
貸款金額: 3500000.0

假設(shè)商業(yè)貸款的年利率是5.6%盹靴,那么在計算每月還款額之前炸茧,我們需要先將年利率換算成月利率。注意這里采用的是復(fù)利稿静,12個月累計的復(fù)利等價于1年的年利率梭冠,表述成數(shù)學(xué)公式如下:

(1 + R_{Month})^{12} = 1 + R_{Annual}

其中 R_{Month} 是月利率, R_{Annual} 是年利率改备。將上述等式變換一下控漠,我們就得到月利率的計算公式。

R_{Month} = (1 + R_{Annual})^\frac{1}{12} - 1

使用該公式悬钳,在python中計算貸款的月利率盐捷。

# 設(shè)置年利率
annual_rate = 0.056
# 計算月利率
month_rate = (1 + annual_rate) ** (1/12) -1
print("貸款的月利率:", round(month_rate,6))
貸款的月利率: 0.004551

假設(shè)貸款30年,那么貸款的總期數(shù)是:

# 計算貸款期數(shù)
payment_periods = 12 * 30
print("貸款總期數(shù):", payment_periods)
貸款總期數(shù): 360

接下來就可以計算每月的按揭還款額了默勾,這里采用等額本息的還款方式碉渡,即每月的還款額固定。我們可使用Numpy包中的.pmt() 函數(shù)來計算母剥,該函數(shù)說明如下:

numpy.pmt(rate, nper, pv)

  • rate:定期利率
  • nper:總的支付期數(shù)
  • pv:抵押貸款的總額度
# 計算每月還款額
periodic_payment = -np.pmt(rate=month_rate, nper=payment_periods, pv=mortgage_loan)
print("每月的按揭還款額: " + str(round(periodic_payment, 2)))
每月的按揭還款額: 19787.51

每期償還的本金和利息

我們采用等額本息還款滞诺,每月還款的額度固定,先支付剩余本金產(chǎn)生的利息环疼,然后才歸還本金习霹。由于貸款的額度很高,在貸款初期炫隶,主要支付的是利息部分淋叶;隨著時間的推移,利息在還款額中所占的比例將越來低等限,而本金部分的比例越來越高爸吮。為了說明這一點芬膝,接下來我們將具體計算利息和本金部分,并繪制其曲線圖形娇。

首先來看第一期還款的情況锰霜,先支付貸款利息。

initial_interest = mortgage_loan * month_rate
print("第一期支付的利息: " + str(round(initial_interest, 2)))
第一期支付的利息: 15928.52

每期的還款額減去利息桐早,剩下的才是對本金部分的還款癣缅。

initial_principal = periodic_payment - initial_interest
print("第一期支付的本金: " + str(round(initial_principal, 2)))
第一期支付的本金: 3858.99

第一期還款中利息部分占了大頭。下面我們將使用循環(huán)來計算每一期還款的利息和本金部分哄酝,并將這些數(shù)值存儲到NumPy數(shù)組中友存。

# 初始化numpy數(shù)組,長度等于總支付期數(shù)陶衅,初始值設(shè)為0.0
principal_remaining = np.repeat(0., payment_periods)  # 剩余本金
interest_paid = np.repeat(0., payment_periods)        # 每期支付的利息部分
principal_paid = np.repeat(0., payment_periods)       # 每期支付的本金部分


# 計算每一期還款的利息和本金部分
for i in range(0, payment_periods):
    
    # 將上一期還款后剩余的本金存儲在變量previous_principal_remaining中
    # 如果是第一期屡立,previous_principal_remaining的值等于總的貸款額度
    if i == 0:
        previous_principal_remaining = mortgage_loan
    else:
        previous_principal_remaining = principal_remaining[i-1]
        
    # 根據(jù)前一次還款后剩余的本金,計算本次還款的利息和本金部分
    interest_payment = previous_principal_remaining * month_rate
    principal_payment = periodic_payment - interest_payment

    # 在最后一次還款時搀军,如果剩余本金小于上面計算的還款本金膨俐,
    # 則還款本金將等于剩余本金
    if previous_principal_remaining < principal_payment:
        principal_payment = previous_principal_remaining
        
    # 將本期還款的利息、本金和剩余本金存儲到數(shù)組中
    interest_paid[i] = interest_payment
    principal_paid[i] = principal_payment
    principal_remaining[i] = previous_principal_remaining - principal_payment

    # 輸出前5次還款的情況
    if i < 5 :
        print("第"+str(i+1)+"期--利息:" \
              + str(round(interest_payment,2)) + "  本金:" \
              + str(round(principal_payment,2)) + "  剩余本金" \
              + str(round(principal_remaining[i],2)))
第1期--利息:15928.52  本金:3858.99  剩余本金3496141.01
第2期--利息:15910.96  本金:3876.55  剩余本金3492264.46
第3期--利息:15893.32  本金:3894.19  剩余本金3488370.26
第4期--利息:15875.6  本金:3911.92  剩余本金3484458.35
第5期--利息:15857.79  本金:3929.72  剩余本金3480528.63

我們將用圖表更直觀的表現(xiàn)每期還款中利息和本金的變化罩句。

from matplotlib import pyplot as plt  # 使用matplotlib繪圖庫
%config InlineBackend.figure_format = 'retina' # 設(shè)置圖片清晰度
plt.rcParams['font.sans-serif']=['SimHei'] #設(shè)置中文字體

# 繪圖
plt.plot(interest_paid, color="red", label="利息")
plt.plot(principal_paid, color="blue", label="本金")
plt.legend(loc=2)
plt.xlabel("貸款期數(shù)")
plt.ylabel("金額")
plt.show()

從上圖中可以明顯看出焚刺,隨著時間的流逝,還款額中利息的比例越來越少门烂,而本金的比例越來越多乳愉,這兩者的總額不變,即每期支付的還款額屯远。這就是等額本息還款的特點蔓姚。

累計的本金和利息

隨著還款時間的推移,總共還了多少本金氓润,多少利息呢赂乐?我們可以使用numpy.cumsum()函數(shù)來進(jìn)行累積求和薯鳍,它返回的是一系列迭代的和咖气,而不是一個數(shù)字。

比如對數(shù)組[1,2,3,4,5]進(jìn)行累積求和挖滤,返回的是數(shù)組[1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5]崩溪。

np.cumsum(np.array([1,2,3,4,5]))
array([ 1,  3,  6, 10, 15])

下面就使用numpy.cumsum()計算累積的本金和利息,并繪制成圖表斩松。

# 計算累計的本金
cumulative_principle = np.cumsum(principal_paid)

# 計算累積的利息
cumulative_interest = np.cumsum(interest_paid)

# 繪圖
plt.plot(cumulative_interest, color='red', label="累計的利息")
plt.plot(cumulative_principle, color='blue', label="累計的本金")
plt.legend(loc=2)
plt.xlabel("貸款期數(shù)")
plt.ylabel("金額")
plt.show()

從圖中我們看出伶唯,支付的總利息甚至比貸款額度還高,這是由于貸款期限較長惧盹,金額較高乳幸,一開始都在還利息了瞪讼。

還款中累計的本金部分才對房屋所有權(quán)有貢獻(xiàn),你實際擁有的房產(chǎn)等于首付加上累計的本金粹断,計算如下:

# 計算所占房屋產(chǎn)權(quán)的比例
house_owned = down_payment_percent + (cumulative_principle/home_value)
print("10年后占有的房產(chǎn):", round(house_owned[10*12],4))
print("20年后占有的房產(chǎn):", round(house_owned[20*12],4))

# 繪圖
plt.plot(house_owned)
plt.xlabel("期數(shù)")
plt.ylabel("擁有房屋產(chǎn)權(quán)的比例")
plt.show()
10年后占有的房產(chǎn): 0.4242
20年后占有的房產(chǎn): 0.637

首付后符欠,你擁有房產(chǎn)的30%;10年后才占有42.42%瓶埋;20年后占有63.7%希柿;直到30年后還完房貸才對房屋有100%的所有權(quán)。

房價變化的影響

我們知道养筒,房價是會隨著時間變化的曾撤。如果房價上升,那你擁有的房產(chǎn)也會升值≡畏啵現(xiàn)在假設(shè)房價以每月0.25%的速度穩(wěn)步上升挤悉,讓我們來繪制你所擁有的房產(chǎn)隨時間的變化曲線。

首先來計算增長的房價巫湘,這里需要使用 numpy.cumprod() 函數(shù)來進(jìn)行累積求乘積纹安,類似于上節(jié)中使用的累積求和函數(shù)几睛。比如對數(shù)組[1,2,3,4,5]進(jìn)行累積求乘積,返回的是數(shù)組[1, 1x2, 1x2x3, 1x2x3x4, 1x2x3x4x5]。

np.cumprod(np.array([1,2,3,4,5]))
array([  1,   2,   6,  24, 120])

使用 numpy.cumprod() 函數(shù)計算累積的增長率安吁,然后乘上原先的房價,就能預(yù)測房價隨時間的變化了昌腰。

# 計算累積的增長率
growth_array = np.repeat(0.0025, payment_periods)
cumulative_growth = np.cumprod(1 + growth_array)

# 預(yù)測房價
home_value_forecast = home_value * cumulative_growth

將預(yù)測的房價乘上你對房屋所有權(quán)擁有的比例闸婴,就得到你實際擁有的房產(chǎn)價值。

# 預(yù)測你擁有的房產(chǎn)
home_value_owned = home_value_forecast * house_owned

# 繪圖
plt.plot(home_value_forecast, color='red', label="房價")
plt.plot(home_value_owned, color='blue', label="擁有的房屋產(chǎn)權(quán)價值")
plt.legend(loc=2)
plt.xlabel("期數(shù)")
plt.ylabel("金額")
plt.show()

從圖中看出奈懒,由于不斷增長的房價奠涌,即使沒有完成還款,大概在還款18年后磷杏,你擁有的房屋價值也超過了當(dāng)初的500萬房價溜畅。這將是一項成功的投資。

先不要太過樂觀极祸,房價并不是永遠(yuǎn)上升的慈格,你也需要警惕房價下跌。假設(shè)房價以每月0.45%的速度持續(xù)下跌遥金,我們使用上述類似的方法來分析未來的房價和你所擁有房產(chǎn)的價值浴捆。

# 計算累積的增長率,負(fù)數(shù)表示下跌
decline_array = np.repeat(-0.0045, payment_periods)
cumulative_decline = np.cumprod(1+decline_array)

# 預(yù)測房價
home_value_forecast = home_value * cumulative_decline

# 預(yù)測你擁有的房產(chǎn)
home_value_owned = home_value_forecast * house_owned

# 繪圖
plt.plot(home_value_forecast, color='red', label="房價")
plt.plot(home_value_owned, color='blue', label="擁有的房屋產(chǎn)權(quán)價值")
plt.legend(loc=1)
plt.xlabel("期數(shù)")
plt.ylabel("金額")
plt.show()

可見即使按期還款稿械,你所擁有的房產(chǎn)價值也是在不斷下跌的选泻,這是一項失敗的投資。
這時賣掉房子也許是更好的選擇,但更差的情況是页眯,即便你賣了房子還是還不了貸款梯捕。為了更直觀的看清這一點,我們來繪制房價和剩余應(yīng)還本金的曲線圖窝撵。

plt.plot(home_value_forecast, color='red', label="房價")
plt.plot(principal_remaining, color='blue', label="剩余本金")
plt.legend(loc=1)
plt.xlabel("期數(shù)")
plt.ylabel("金額")
plt.show()

上圖中有一段時間剩余的貸款金額(藍(lán)線)高于房屋的實際價值(紅線)科阎,出現(xiàn)了資不抵債的情況,也就是說即使賣了房子你也還不起貸款忿族。這也是2008年美國金融危機(jī)時發(fā)生的情況锣笨。

小結(jié)

本文對抵押貸款進(jìn)行了剖析,計算了房貸每期的還款額道批、每期還款中本金和利息部分错英,以及累計還款的本金和利息,并且分析了房價上漲和下跌時的房產(chǎn)投資情況隆豹。

另外還學(xué)習(xí)了三個 NumPy 函數(shù):

# 計算按揭還款額
numpy.pmt(rate, nper,pv) 

# 累計求和
numpy.cumsum(array)

# 累計求乘積
numpy.cumprod(array)

注:本文是DataCamp課程Intro to Financial Concepts using Python的學(xué)習(xí)筆記椭岩。
更多該課程的筆記:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市璃赡,隨后出現(xiàn)的幾起案子判哥,更是在濱河造成了極大的恐慌,老刑警劉巖碉考,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塌计,死亡現(xiàn)場離奇詭異,居然都是意外死亡侯谁,警方通過查閱死者的電腦和手機(jī)锌仅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墙贱,“玉大人热芹,你說我怎么就攤上這事〔移玻” “怎么了伊脓?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魁衙。 經(jīng)常有香客問我报腔,道長,這世上最難降的妖魔是什么纺棺? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任榄笙,我火速辦了婚禮,結(jié)果婚禮上祷蝌,老公的妹妹穿的比我還像新娘。我一直安慰自己帆卓,他們只是感情好巨朦,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布米丘。 她就那樣靜靜地躺著,像睡著了一般糊啡。 火紅的嫁衣襯著肌膚如雪拄查。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天棚蓄,我揣著相機(jī)與錄音堕扶,去河邊找鬼。 笑死梭依,一個胖子當(dāng)著我的面吹牛稍算,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播役拴,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼糊探,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了河闰?” 一聲冷哼從身側(cè)響起科平,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姜性,沒想到半個月后瞪慧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡部念,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年汞贸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片印机。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡矢腻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出射赛,到底是詐尸還是另有隱情多柑,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布楣责,位于F島的核電站竣灌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秆麸。R本人自食惡果不足惜初嘹,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沮趣。 院中可真熱鬧屯烦,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翁狐,卻和暖如春类溢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背露懒。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工闯冷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懈词。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓蛇耀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钦睡。 傳聞我的和親對象是個殘疾皇子蒂窒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 時間成本可能是我們?nèi)粘I钪薪?jīng)常被忽略的,有時我們會為了省下一點小錢而浪費大量的時間荞怒,這樣做是非常不值得的洒琢。 首先...
    EvaZeng閱讀 2,665評論 0 28
  • 讀經(jīng): 《歷代志下》第25章 經(jīng)文: 因此,耶和華的怒氣向亞瑪謝發(fā)作褐桌,就差一個先知去見他衰抑,說:“這些神不能救他的民...
    君自爾出閱讀 13,496評論 0 1
  • 今天和二姐聊天,聊了很多荧嵌。她說她病的這幾年呛踊,已經(jīng)和外界斷了聯(lián)系了。 她在外地一直就只有老公這么一個親人啦撮,她們就是在...
    艷云閱讀 541評論 1 1
  • 開始堅持碼字后赃春,曾給自己設(shè)了一個小目標(biāo)——兩年出現(xiàn)成效愉择。如今兩年時間快滿,沒有間斷的碼字歷程有了一定量的累積织中,跟牛...
    補拙莫如勤LV閱讀 387評論 17 9
  • 第四章:數(shù)位“晨間日記” 一锥涕,為何選擇用電腦寫數(shù)位“晨間日記” ? 1.用電腦寫數(shù)位“晨間日記”可以回憶過去狭吼,吸取...
    墨染元兆旭閱讀 255評論 0 1