Mímisbrunnr知恵の泉

← 金融工学 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:高校数学(指数・等比数列) | 関連:金利と複利(複利と連続複利を深掘り)・確率変数(離散・連続)と期待値・分散(統計・期待値の土台)

要点(BLUF)

1. なぜお金に時間価値があるのか

「いま100万円もらう」のと「1年後に100万円もらう」のは、同じ100万円でも価値が違います。いまもらえば1年間運用して増やせるからです。逆にいうと、将来のお金は、いまの価値に直すと目減りする。金融工学の価格づけは、ほぼすべてこの一点——「将来のキャッシュフローを、いまの価値に引き戻す」——から出発します。

時間価値が生まれる理由は3つあります。

これらをまとめて1つの数字に押し込んだのが割引率 rr です。

2. 将来価値と現在価値

いまの金額(現在価値)PVPV を年利 rrnn 年運用すると、将来価値 FVFV

FV=PV(1+r)nFV = PV\,(1+r)^n

になります。これを逆に解けば、nn 年後に受け取る FVFV現在価値が求まります。

PV=FV(1+r)n=FV(1+r)nPV = \frac{FV}{(1+r)^n} = FV\,(1+r)^{-n}

将来の金額に掛ける (1+r)n(1+r)^{-n} を**割引係数(discount factor)**と呼びます。「将来を割り引いていまに直す」操作そのものです。まず数字を1つ動かしてみます。

import numpy as np

PV = 10000      # いまの金額(円)
r = 0.03        # 年利 3%
n = 5           # 5年

# 将来価値:いまの1万円を5年運用すると
FV = PV * (1 + r)**n
print(f"将来価値 FV = {FV:,.2f} 円")

# 現在価値:5年後に1万円受け取る権利は、いまいくらか
FV_target = 10000
PV_back = FV_target / (1 + r)**n
print(f"5年後の1万円の現在価値 PV = {PV_back:,.2f} 円")

出力:

将来価値 FV = 11,592.74 円
5年後の1万円の現在価値 PV = 8,626.09 円

出力の意味:年3%なら、いまの1万円は5年後に約 11,593 円に育ちます。逆に、5年後の1万円はいまの価値に直すと約 8,626 円しかありません。同じ「1万円」でも、受け取る時点が違えば価値が違う——これが時間価値の正体です。FVFVPVPV は同じ式を行き来しているだけで、掛けるか割るかの違いだけです。

3. 割引率と割引係数

割引係数 1/(1+r)n1/(1+r)^n は、割引率 rr が高いほど、また将来 nn が遠いほど小さくなります。「遠い未来の・高い割引率のお金ほど、いまの価値は小さい」。この逓減のカーブを描いてみます。

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib  # 日本語ラベル用

years = np.arange(0, 31)
plt.figure(figsize=(7, 4))
for r in [0.01, 0.03, 0.05, 0.08]:
    discount_factor = 1 / (1 + r)**years   # 割引係数
    plt.plot(years, discount_factor, marker=".", label=f"r = {r:.0%}")

plt.xlabel("年数 n"); plt.ylabel("割引係数 1/(1+r)^n")
plt.title("将来の1円の現在価値(割引係数)の逓減")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

出力の意味:どの曲線も右下がりで、将来になるほど割引係数は 0 に近づきます。割引率 rr が高いほど傾きは急——r=8%r=8\% なら30年後の1円はいまの約0.1円ですが、r=1%r=1\% なら約0.74円も残ります。割引率は「将来をどれだけ強く割り引くか」のダイヤルで、ここを少し動かすだけで遠い将来の価値が大きく変わります。これが第7章の債券価格や第5章のオプション評価で効いてくる感覚です。

4. キャッシュフロー列:NPV と IRR

現実の投資は「いま投資して、その後何年かにわたって回収する」キャッシュフローの列です。各期の金額 CFtCF_t をそれぞれ現在価値に割り引いて合計したものが**正味現在価値(NPV: Net Present Value)**です。

NPV=t=0TCFt(1+r)tNPV = \sum_{t=0}^{T} \frac{CF_t}{(1+r)^t}

NPV がプラスなら「割引率 rr で評価しても得」、マイナスなら「損」。投資判断のもっとも基本的なものさしです。例として「いま100投資し、その後5年間30ずつ回収する」案件を、割引率5%で評価します。

import numpy as np

# 初期投資 -100、その後5年間 +30 ずつ回収する案件
cash_flows = np.array([-100, 30, 30, 30, 30, 30])
r = 0.05

times = np.arange(len(cash_flows))
discount_factors = 1 / (1 + r)**times      # 各期の割引係数
present_values = cash_flows * discount_factors
npv = present_values.sum()

print("期 t      :", times)
print("割引係数  :", np.round(discount_factors, 4))
print("各期の現在価値:", np.round(present_values, 2))
print(f"NPV = {npv:.2f}")

出力:

期 t      : [0 1 2 3 4 5]
割引係数  : [1.     0.9524 0.907  0.8638 0.8227 0.7835]
各期の現在価値: [-100.     28.57   27.21   25.92   24.68   23.51]
NPV = 29.88

出力の意味:回収する 30 は、5年後になるほど割引係数が小さく(0.78)、現在価値も小さく(23.51)なります。割り引いた回収額の合計は約 129.88 で、初期投資 100 を引いて NPV ≈ +29.88。割引率5%で評価してもプラスなので、この投資は「やる価値がある」と判断できます。

では、この案件は「実質何%で回るのか」。NPV をちょうど 0 にする割引率を**内部収益率(IRR: Internal Rate of Return)**と呼びます。

t=0TCFt(1+r)t=0r=IRR\sum_{t=0}^{T} \frac{CF_t}{(1+r^\ast)^t} = 0 \quad\Longrightarrow\quad r^\ast = \text{IRR}

IRR は手では解けない(高次方程式になる)ので、数値的に根を求めます。NPV は rr の単調減少関数なので、scipy.optimize.brentq で確実に1つの根が得られます。

import numpy as np
from scipy.optimize import brentq

cash_flows = np.array([-100, 30, 30, 30, 30, 30])

def npv(rate, cash_flows):
    times = np.arange(len(cash_flows))
    return np.sum(cash_flows / (1 + rate)**times)

# NPV(r) = 0 を満たす r を区間 [-0.9, 1.0] から探す
irr = brentq(lambda rate: npv(rate, cash_flows), -0.9, 1.0)
print(f"IRR = {irr:.4f}  ({irr:.2%})")

出力:

IRR = 0.1524  (15.24%)

出力の意味:この案件は実質 約 15.24% で回ります。資金調達コスト(割引率)が 15.24% より低ければ NPV はプラス、高ければマイナス。さきほど r=5%r=5\% で NPV がプラスだったのは、IRR 15.24% がそれを十分上回っていたからです。NPV は「絶対額の儲け」、IRR は「率としての利回り」——同じ割引の枠組みを別の角度から見た2つの指標です。

5. 連続割引:離散から連続へ

ここまでは「年1回」の割引でした。複利の頻度を年 mm 回に増やし、mm\to\infty の極限をとると、**連続複利(連続割引)**になります。

limm(1+rm)mt=ertFV=PVert,PV=FVert\lim_{m\to\infty}\left(1+\frac{r}{m}\right)^{mt} = e^{rt} \qquad\Longrightarrow\qquad FV = PV\,e^{rt},\quad PV = FV\,e^{-rt}

金融工学では、この erte^{-rt} による連続割引が標準形です。対数をとると線形になり、確率過程やブラック–ショールズの計算が一気に扱いやすくなるからです(金利と複利 で複利頻度と連続複利の関係を詳しく扱います)。極限に近づく様子を確かめます。

import numpy as np

PV = 10000
r = 0.03
t = 5

# 複利の頻度 m を増やしていくと、連続複利 e^{rt} に近づく
for m in [1, 2, 4, 12, 365]:
    fv = PV * (1 + r/m)**(m*t)
    print(f"年{m:>3}回複利: FV = {fv:,.4f}")

fv_continuous = PV * np.exp(r*t)
print(f"連続複利:    FV = {fv_continuous:,.4f}")

出力:

年  1回複利: FV = 11,592.7407
年  2回複利: FV = 11,605.4083
年  4回複利: FV = 11,611.8414
年 12回複利: FV = 11,616.1678
年365回複利: FV = 11,618.2708
連続複利:    FV = 11,618.3424

出力の意味:複利の頻度 mm を上げるほど将来価値は増えますが、その増え方は急速に頭打ちになり、連続複利 PVert=11,618.34PV\,e^{rt} = 11{,}618.34 に収束します。年1回(11,592.74)と連続(11,618.34)の差はわずか約26円——頻度を無限に上げても得は限られます。実務では計算の都合で連続複利を使うことが多く、以降のノートでも割引はおおむね erte^{-rt} で書きます。

⚠️ よくある誤解

関連ノート