利率小學堂:常見觀念、數學推導與 python 工程實踐
--
天下沒有白吃的午餐。在跟別人借了錢之後,通常都會多還一些些利息給對方;而「利率」就是在一段期間內,利息與本金的比率。
本文將用小宏的故事-5 個議題與 1 個生活案例,帶你認識關於利率常見的小學問、國中程度的數學推導與簡單的 python 程式實作。
準備好了就繼續看下去吧!
Story 1
今年 8 歲的小宏拿到了過年紅包。媽媽問小宏,你是要現在就拿 100 元,還是明年媽媽給你 103 元呢?(好啦我媽才不會這樣問XD 我倒是聽過同學媽媽把小孩紅包錢拿去賭博輸光的悲傷故事。)
Q: 在年利率 5% 與媽媽信用滿點的情況下,今年的 100 元和明年的 103 元,哪個比較多?
利率使金錢具有時間價值。因此,假設現在的錢與未來的錢要進行「比大小」,我們必須把它放在相同的時間點才公平。
現值(PV):未來的 $$ 於現在的價值
未來值(FV):現在的 $$ 於未來的價值
透過簡單的利率運算,我們可以找出「1 年後 100 元的價值」與「未來 103 元的價值」來協助小宏比較。
$100 的未來值(FV):
$103 的現值(PV):
現在:$100 > $98.095
一年後:$105 > $103
因此,現在的 100 元大於 1 年後的 103 元,小宏決定「把 100 元的紅包拿去銀行定存」。
後續的發展~小宏忘了 8 歲還不能到銀行開戶,最後還是放在媽媽那了,2 元就當作給媽媽的孝親費吧!
[ 小補充-貼現率 ]
現在的 100 元乘以「利率」相當於未來的 105 元;而未來的 103 元乘以「貼現率」則會變成現在的 98.095 元。
貼現率(v):把未來的錢折算到現在的比率
v = 1 / ( 1 + i )
python 實作:把灰色框框的程式碼複製到 python 中即可立即使用喔
# Story 1:PV, FV, i, vi = 0.05
v = (1/ (1+i))
PV1 = 100
FV2 = 103#1 when PV1 = 100
FV1 = PV1 * (1 + i)# when FV2 = 103
PV2 = FV2 * v
Story 2
今年 10 歲的小宏又再度拿到過年紅包,不過這次記取了教訓,早已拜託媽媽協助到銀行開戶了。小宏決定把錢存放在銀行,直接給他存個 10 年(因為小宏住家裡啦,個人支出交給爸媽扛XD)。但是小宏想要知道,10 年之後,他放在銀行裡的 100 元會變成多少錢呢?
Q: 年利率 10% 的情況下,100 元於 10 年後會變成多少錢?
「複利」計息:正常情況下,銀行會把每年的利息合併在本金裡,繼續累積下一年的利息,來達到錢滾錢的效果。
透過計算第 1 年的利率、第 2 年的利率,巧妙的發現了一個「複利計息」的公式。因此 10 年後的價值為 259.37 元,一共產生了 159.37 元的利息!
「單利」計息:每年產生的利息都是期初金額的固定利息。
單利的計算較為容易,每年的利息都是期初 100 元的 10%,也就是 10 元,因此這 10 年總共產生了 100 元的利息。
觀察前 3 年單利與複利的結果,左圖為複利、右圖為單利,可以發現,由於複利的利息也會滾利息,因此複利的效果會使每一年所累積的錢加倍增長。
只要不把利息與本金領出來,銀行存款看到的利率都是用複利計息ㄛ!
python 實作:
# Story 2:單利、複利i = 0.1
t = 10
PV = 100#1 單利
FV = PV + (PV * i) * t#2 複利
FV = PV * (1 + i)**t
[ 小補充-連續複利 ]
上述例子都是每年計一次利息。假設每年支付 2 次利息,每次複利的利率就要除以 2,得到每一複利期間的利率;若改成每個月支付 1 次利息,則每次複利的利率就要除以 12。
當複利的期間逐漸縮短,每年複利的次數變成無限大時,稱作「連續複利」。意思就是每一分、每一秒銀行都在計息給你。
將 2 次計息、4 次計息…逐漸推導到無窮大時,即可找出連續複利的公式。學術上為了方便數學計算,都會使用連續複利,而實務上則是採用離散複利居多。
[ 小補充-有效年利率 ]
若不同年利率的投資機會複利次數亦不同,則不能直接用年利率比較誰好誰壞,而是要轉成「有效年利率(EAR)」,才能知道誰的「實質利率」比較優秀ㄛ!
看起來差不多的兩個投資機會,經過計算得知,乙銀行的「有效年利率」比甲銀行還要高,因此要選擇乙銀行的存款方案。
Story 3 關於「存錢」
18 歲的小宏開始了時薪 160 的打工人生,決定不再依靠家裡,生活開銷自己賺。沒有意料到的是,上大學的小宏生活花費也跟著高了起來。由於交了女朋友,談過幾場轟轟烈烈的青春校園戀情,時常為了展現男生的紳士風度,像吃豆花這種小錢絕對不給女生出。1 年下來,小宏發現他只存了 100 元… 那好吧,小宏仍相信複利累積能量的效果,假設 1 年就存 100 元,10 年後能夠在銀行帳本看到多少錢呢?
Q: 利率 5% 的情況下,每年存 100 元,10 年後會累積到多少錢?
計算方法:(1)把 $$ 畫在數線上 (2)算出每年現金流的「未來值」,加總在一起即為正解
數學挺好的小宏,經過計算後驚覺 10 年後存款只有 1321 元實在太誇張!不能買房就算了,連誠品的模型屋都買不起QQ 因此他下定決心訂出理財目標,10 年後要有 10000 元的存款,至少得買得起一輛二手機車啊……
Q: 利率 5% 的情況下,每年需存多少錢,10 年後才能累積到 10000 元?
計算方法:(1)把 $$ 畫在數線上 (2)每年現金流的「未來值」,加總在一起相當於 10000 元
python 實作:
# Story 3:存錢案例i = 0.05
t = 10#1 總共存了多少錢
X = 100
k = ((1+i)**(t+1) - (1+i))/i
FV = X * k#2 每期需存多少錢
FV = 10000
k = ((1+i)**(t+1) - (1+i))/i
X = FV/k
Story 4 關於「領錢」
時光扎眼即逝啊,小宏已經 60 歲了。這些年他身為新創公司的創辦人,雖然經歷過不少風雨,卻也是積了不少的財富,至少退休金是不需要擔心了。體貼的小宏怕我們嚇到,只拿出他名下財富的千分之一給我們做試算。
Q: 1000 萬元分成 20 年領,在 5% 的年化報酬率下,每年能夠領多少錢?
為了方便計算,先將 5% 的年利率轉換成貼現率。
計算方法:(1)計算貼現率 (2)把 $$ 畫在數線上 (3)算出每年現金流的「現值」,加總在一起相當於 1000 萬元
Q: 如果改成每年領 100 萬,要先掏出多少錢才夠呢?
計算方法:(1)計算貼現率 (2)把 $$ 畫在數線上 (3)算出每年現金流的「現值」,加總在一起即為正解
python 實作:
# Story 4:領錢案例i = 0.05
v = 1 / (1+i)
t = 20#1 每期可領多少錢
PV = 10000000
k = (v - v**(t+1)) / (1 - v)
X = PV / k
X#2 總共需存多少錢
X = 1000000
k = (v - v**(t+1)) / (1 - v)
PV = X * k
Story 5 關於「借錢」
小宏回想起剛創業的他,背負政府的新創優惠貸款 2400 萬元的那些年… 每天都在苦腦錢要怎麼還、要還多少,以及還要還多久。因此他上網查詢,才發現借錢還錢,有兩種做法:「本金平均攤還」與「本息平均攤還」。為了不在資訊不對等的情況下詢問貸款專員,小宏決定自行研究兩種方法每年要還的錢有多少。
Q: 還款利率 3% 的情況下,2400 萬的貸款分 20 年還,每年要還多少錢?
本金平均攤還
每年還的本金都一樣,利息依照本金的餘額做計算
本息平均攤還
將本金及利息平均攤在每一年,即每年還一樣多的錢
也可以這樣想:借款的 2400 萬元滾 20 年的本利和,相當於每年還的錢於第 20 年「未來值」的總和。
由於「本金平均攤還」前期需還較多的金額,因此隨時間累積到的利息會比較少,整體要還的錢會少於「本息平均攤還」。可以透過執行以下程式碼,比較兩者的差別。
python 實作:
# Story 5:借錢案例import pandas as pd
i = 0.03
t = 20
loan = 24000000#1 本金平均攤還
df = pd.DataFrame([], index=['期數', '每期應還本金', '每期應還利息', '每期應還本息']).transpose()
df.set_index('期數', inplace=True)for j in range(1, t+1):
idx = '第'+str(j)+'期'
x1 = loan / t
x2 = (loan - x1*(j-1)) * i
x3 = x1 + x2
df.loc[idx] = x1, x2, x3
df.loc['Sum'] = df.iloc[:20].sum()
df.loc['Mean'] = df.iloc[:20].mean()
print(df)#2 本息平均攤還
k = ((1+i)**t - 1)/i
X = loan * (1+i)**t * (1/k)
print(X*t)
print(X)
Life Case 退休金規劃
回顧小宏的一生,雖然年輕時過的辛苦,但看到他日後的成就,不免會認為他是一個很成功的人。然而,成功靠得不只是運氣,還需要腦袋,尤其在財務規劃的部分。之所以 60 歲後有充足的錢可以過好生活,是因為小宏早在年輕時就做好了退休金規劃,從一點一滴的錢開始累積,透過「複利的力量」與「漫長時間的醞釀」,才終於存到這麼龐大的目標退休金。
我們也可以做得到,來設定的退休金的目標吧!
- 開始存退休金的年齡
- 期望的退休年齡
- 預期的投資報酬率
- 希望退休後「每個月」可以領多少錢;或是可以「一次性」領多少錢
透過畫現金流數線、現值與未來值的計算,你將知道要怎麼存款才能達到期望的目標。由於方法與前面故事雷同,就留下伏筆自行做練習了。這裡提供一份 python 程式的試算,可以根據自己的條件設定,看到專屬每個人的理財目標。不仿下載 python,從理財試算作為起點,開始學習程式語言吧!
註:有考慮通貨膨脹;存滿退休金就放在銀行不再投資(保守作法)
# 退休金規劃(假設存滿後即不計利息)def deposit(sex='boy', start_year=30, end_year=60,
receive_way='monthly' ,money=50000 ,interest_rate=0.03,
inflaction=True, inflaction_rate=0.01):
# 設定性別參數
if sex == 'boy':
c = 78
if sex == 'girl':
c = 84
# 設定時間參數
a = start_year
b = end_year
# 設定通膨參數
if inflaction==False:
g = 0
if inflaction==True:
g = inflaction_rate
# 設定其他參數
x, i, j, k, v = money, 1 + interest_rate, 1 + (interest_rate/12), 1 - (g/12), 1/(1-g)
# r 實際倍率(每年存)
r = 0
m = 0
while m <= b-a-1:
r += i**m
m += 1
# s 實際倍率(每月存)
s2 = 0
for num in range(0, 12):
s1 = j**num
s2 += s1
s = r*s2
# t 實際折現值(一次領)
t = x
# u 實際折現值(每月領)
mon = 0
for num2 in range(0, 12):
u1 = k**num2
mon += u1year = 0
u2 = 1
while u2 <= c-b:
year += v**u2
u2 += 1
u = x*mon*year
# 所求[每個月需存金額(一次領), 每一年需存金額(一次領), 每個月需存金額(每月領), 每一年需存金額(每月領)]
ans = [round(t/s), round(t/r), round(u/s), round(u/r)]
if receive_way == 'monthly':
conclusion = print('Receive $', x,'monthly for pension,', 'then you should save', ans[2],'dollars every month.','\n','or save' , ans[3],'dollars every year before retirment.')
if receive_way == 'once':
conclusion = print('Receive $', x,'once for pension,', 'then you should save', ans[0],'dollars every month.','\n','or save' , ans[1],'dollars every year before retirment.')
return conclusiondeposit(sex='boy',
start_year=40,
end_year=60,
receive_way='monthly',
money=80000,
interest_rate=0.18,
inflaction=True,
inflaction_rate=0.01)
複利的影響力
愛因斯坦說過:「宇宙間最大的能量是複利,世界的第八大奇蹟是複利。」究竟複利的力量有多大呢?我們試著用剛剛的故事 3~5 來比較比較。
# 存錢
def save(i):
t = 10
X = 100
if i != 0:
k = ((1+i)**(t+1) - (1+i))/i
else:
k = t
FV = X * k
return FVsave(i=0) ## $1000
save(i=0.03) ## $1181
save(i=0.05) ## $1321
save(i=0.1) ## $1753# 領錢
def withdraw(i):
v = 1 / (1+i)
t = 20
PV = 10000000
if v != 1:
k = (v - v**(t+1)) / (1 - v)
else:
k = t
X = PV / k
return Xwithdraw(i=0) ## $500000
withdraw(i=0.03) ## $672157
withdraw(i=0.05) ## $802426
withdraw(i=0.1) ## $1174596# 借錢
def borrow(i):
t = 20
loan = 24000000
if i != 0:
k = ((1+i)**t - 1)/i
else:
k = t
X = loan * (1+i)**t * (1/k)
return Xborrow(i=0) ## $1200000
borrow(i=0.03) ## $1613177
borrow(i=0.05) ## $1925822
borrow(i=0.1) ## $2819031
隨著「時間的長度」、「利率的大小」與「本金的多寡」,將會使結果大大不同。從借錢的案例中,我們發現同是借款 2400 萬元,在 0 利率與 10% 利率的情況下,每年要還的錢竟然超過 2 倍!而存錢更是相同的道理。
利率(報酬率)多寡其實是一個很大的影響力,因此,希望看完這篇文章的你,能夠開始學習制定理財目標,不再把錢單單存在銀行;而是開始學習投資、學習累積資產,並努力去追求「更高的投資報酬率」。長期來看,這才是讓人生致富的關鍵因素!