TL;DR

  • 在做財務規畫時,使用財務函式會產生出具體數字作為參考,執行上才不會過度保守或激進。

由於利息和通貨澎脹的存在,錢這個東西在相同的時間下比較才公平, 只是我們有時候會忘了這一點,即使想到, 也會因為計算過程中有指數運算而乾脆不算了, 不管原因是什麼,沒能把錢算清楚通常意味著要付出超出合理範圍的錢。

財務函式都是複利計算,以前我們在國中學到如何使用複利公式算出錢的未來數額,其他的情況學校就沒有教了;

這裡列了幾個常用的財務函式,這些財務函式在 excel 或 google spreadsheet 裡都有, 因為我是唸Computer Science的,所以我自己是偏好使用 Python 計算而不是使用現成的軟體, 以下列子都是使用numpy_financial這個套件,可以用 pip 自行安裝。

pip install --user numpy_financial

不管是 Python 套件還是excel/google spreadsheet, 函式名字都一樣,只有在操作上不同, 例如,如果想知道怎麼在excel裡計算未來值的話, 上網查「excel fv」就可以了。

在使用函式時,會把流出的金錢用負數表入(例如付款、投資),流入的金錢用正數表示(例如利息、股利),這一點要先習慣。


Future Value 未來值

未來值就是複利的結果,fv的參數有

fv(利率, 期數, 每期投入金額, 期初金額)

這裡的意思是

  • 利率:通常是投資報酬率或者是通貨澎脹率
  • 期數:複利多少次
  • 每期投入金額:數值為0的話對應回標準的複利公式,若不為0對應到定期定額投資
  • 期初金額:初始投入

讓我們實驗一下

>>> import numpy_financial as npf

# (簡單測試用) 年利率7%, 投入10萬元,一年後變成是107000元
>>> npf.fv(0.07, 1, 0, -10_0000)  # 流出的錢用負數表示,故最後一個參數是負的
107000.0

# 年利率7%, 投入10萬元,10年後變成
>>> npf.fv(0.07, 10, 0, -10_0000)
196715.13572895664

# 投資報酬率7%, 每年定期定額投資10萬元,20年後變成
>>> npf.fv(0.07, 20, -10_0000, 0)
4099549.232123119  # 409萬元

# 承上,考慮投資報酬率為5%, 6%, 和7%三種不同情形
>>> npf.fv([0.05, 0.06, 0.07], 20, -10_0000, 0)
array([3306595.41028884, 3678559.12035475, 4099549.23212312])

# 年化投資報酬率7%, 每月定期定額5000元,20年後變成
>>> npf.fv(0.07/12, 20*12, -5000, 0)
2604633.299127588

>>> npf.fv(0.05, 1, -120000, 0)
120000.0000000001

在最後一個例子裡在問一期後是多少元,由於期初是0元,複利後還是0元,加上第一期期末投入12萬元,所以答案是12萬元。


Present Value 現值

和計算未來值相反,現在是用未來值反推初始投資是多少,函式:

pv(利率, 期數, 固定付款, 未來值)

例子:

# 年利率7%, 10年後要有196715元,現在要投入
>>> npf.pv(0.07, 10, 0, 196715)
-99999.93100228097  # 見未來值的例子

Rate 計算每期的實際利率

有時我們想要回推利率是多少,這樣才知道投資的績效或者貸款利率香不香。

用法是

rate(期數, 每期付款, 現值, 未來值)

計算過程使用牛頓法, 直到誤差小於1e-6為止

# 10年前用5萬元買了一檔股票,現在價值8萬元,年化報酬率是
>>> npf.rate(10, 0, -5_0000, 8_0000)
0.04812238947084562

# 貸款100萬、20年期,每月繳8000元,年利率是
>>> npf.rate(20*12, -8000, 100_0000, 0) * 12
0.0740837607346157  # 年利率7.4%

Payment 計算定期定額的數字是多少

在給定未來值的情況下,我們想要算出每期要存多少錢, 使用場景通常是有個想儲蓄的目標,反推回每月要存多少錢。

函式的名稱是pmt,使用方式是

pmt(利率, 期數, 現值, 未來值)

例子:

# 貸款100萬, 預計20年付完, 年利率7%, 每月要付
>>> npf.pmt(0.07/12, 12*20, 100_0000, 0)
-7752.989356188731
# 同上,但預計10年付完,每月要付
>>> npf.pmt(0.07/12, 12*10, 100_0000, 0)
-11610.847921862376

# 貸款100萬, 預計20年付完, 在年利率分別為2%及7%時, 每月要付
>>> npf.pmt([0.02/12, 0.07/12], 12*20, 100_0000, 0)
array([-5058.83335045, -7752.98935619])

# 若要在20年後存到4099549元,投資報酬率7%,每年要投入
>>> npf.pmt(0.07, 20, 0, 4099549)
-99999.994337838  # 對應回之前在未來值的例子

nper 計算要付款幾期

nper 是 number of periodic payments, 有時我們每月就只能給付固定數額的錢,我們想知道的是要付幾期才付得完。

nper(利率, 每期付款, 現值, 未來值)

例子:

# 貸款100萬,每月只能還7752元,年利率7%,共要付多少個月才能付完
>>> npf.nper(0.07/12, -7752, 100_0000, 0)
array(240.0666904)  # 240月 / 12 = 20 年

由上可知,前五個財務函式可以彼此互補,在假定其他條件已知下,求剩下的一個未知項是多少。

未知項未來值現值利率定期定額的數額大小期數
要使用那個函式fvpvratepmtnper

ipmt 和 ppmt 計算本利攤提的數額

最常見的使用場景是計算每月房貸要付多少錢,由於這個太多有這個需求, 現在許多銀行都有提供試算,只要在google打入「房貸試算」就可以使用現成的Web介面。

  • ipmt: interest portion of a payment
  • ppmt: pricipal portion of a payment

函式用法是

ipmt(利率, 第幾期, 總期數, 現值, 未來值)
ppmt(利率, 第幾期, 總期數, 現值, 未來值)

付款金額是 ipmt + ppmt

例子: 房貸100萬元,年利率2%, 分20年本息攤還:

per = np.arange(20 * 12) + 1  # per = [1, 2, 3, ..., 240],查每一期的付款數額
ipmt = npf.ipmt(0.02/12, per, 12*20, 100_0000, 0)  # [-1666.66666667, ...]
ppmt = npf.ppmt(0.02/12, per, 12*20, 100_0000, 0)  # [-3392.16668378, ...]
# 印出每期付款明細
>>> for i in range(12*20):
...     payment = ipmt[i] + ppmt[i]
...     print(f"{per[i]:3d} {ipmt[i]:.1f} {ppmt[i]:.1f} {payment:.1f}")
...
1 -1666.7 -3392.2 -5058.8
2 -1661.0 -3397.8 -5058.8
...
239 -16.8 -5042.0 -5058.8
240 -8.4 -5050.4 -5058.8

從上面的例子可看出,在當前的低利率下,每100萬元房貸對應的月付額大約是5000元, 貸款1000萬的話,每月大約還5萬元,貸600萬元則是每月還3萬元, 我自己常常用這個方式去心算自己能不能付擔得起房貸。


IRR 內部權益報酬率

有時候我們每期的現金流入流出不是固定數值,此時可以用 IRR (Internal Rate of Return) 計算報酬率, IRR在解的是下面這個公式裡的 $r$, 其中 $m$ 是總期數, $v_t$ 是每期金額。

$$ \sum_{t=0}^m{\frac{v_t}{(1+r)^{t}}} = 0 $$

使用方式是

irr(values)

values 是每期的現金流, 第一項通常為負數, 表示初始投資。

讓我們看幾個例子:

# 投資100元, 其後每期分別提取39, 59, 55, 20 (共173)元出來, 報酬率以IRR算的話是28%
>>> npf.irr([-100, 39, 59, 55, 20])
0.28094842115996066

# 投資100元, 追加投資7元, 觀望1期,最後認賠拿回90元,報酬率是-5.7%
>>> npf.irr([-100, -7, 0, 90])
-0.05728912381305917

# 投資100元,  觀望2期後投降,最後拿回74元,報酬率是-9.5%
>>> npf.irr([-100, 0, 0, 74])
-0.0954958303489728

Net Present Value for a cash flow series 淨現值

淨現值用來評估一項投資是否划算,淨現值愈大表示賺越多,通常來說, 淨現值 $> 0$ 表示能獲利,值得投資,反之,淨現值 $\leq 0$ 表示不值得投資。

函式名稱是npv,用法是

npv(利率, values)

其中利率部分是投資者希望的報酬率,values表示現金流。

假設有筆投資提案:初始投入 4 萬元, 接著三年得到利息 5000, 8000, 12000元, 然後拿回本金4萬元。 我們心中預期報酬率為7%, 用這些條件可算出此項投資的淨現值是 11971 元,值得衝。

>>> npf.npv(0.07, [-40000, 5000, 8000, 12000, 40000])
11971.790027038594