🎓 レベル:基礎 | 重要度:A(必須)
📎 前提:高校数学(指数・等比数列) | 関連:金利と複利(複利と連続複利を深掘り)・確率変数(離散・連続)と期待値・分散(統計・期待値の土台)
要点(BLUF)
- お金には時間価値があります。いま手元にある1万円は、1年後に受け取る1万円より価値が高い。運用すれば増えるし、将来の受け取りには不確実性とインフレがあるからです。
- 将来価値は 、現在価値(割引)は 。割引率 で将来の金額を「いまの価値」に引き戻します。
- 複数期にわたるキャッシュフローは、各期を現在価値に割り引いて合計します。これが**正味現在価値(NPV)で、投資判断の土台。NPV を 0 にする割引率が内部収益率(IRR)**です。
1. なぜお金に時間価値があるのか
「いま100万円もらう」のと「1年後に100万円もらう」のは、同じ100万円でも価値が違います。いまもらえば1年間運用して増やせるからです。逆にいうと、将来のお金は、いまの価値に直すと目減りする。金融工学の価格づけは、ほぼすべてこの一点——「将来のキャッシュフローを、いまの価値に引き戻す」——から出発します。
時間価値が生まれる理由は3つあります。
- 運用機会:いまのお金は利子を生む。1年後の100万円より、いまの100万円のほうが「運用したぶん」だけ得。
- インフレ:物価が上がれば、同じ100万円で買えるものは将来のほうが少ない。
- 不確実性:将来の受け取りには「本当にもらえるのか」というリスクがある(このリスク分の上乗せは第2章以降で扱います)。
これらをまとめて1つの数字に押し込んだのが割引率 です。
2. 将来価値と現在価値
いまの金額(現在価値) を年利 で 年運用すると、将来価値 は
になります。これを逆に解けば、 年後に受け取る の現在価値が求まります。
将来の金額に掛ける を**割引係数(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万円」でも、受け取る時点が違えば価値が違う——これが時間価値の正体です。 と は同じ式を行き来しているだけで、掛けるか割るかの違いだけです。
3. 割引率と割引係数
割引係数 は、割引率 が高いほど、また将来 が遠いほど小さくなります。「遠い未来の・高い割引率のお金ほど、いまの価値は小さい」。この逓減のカーブを描いてみます。
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 に近づきます。割引率 が高いほど傾きは急—— なら30年後の1円はいまの約0.1円ですが、 なら約0.74円も残ります。割引率は「将来をどれだけ強く割り引くか」のダイヤルで、ここを少し動かすだけで遠い将来の価値が大きく変わります。これが第7章の債券価格や第5章のオプション評価で効いてくる感覚です。
4. キャッシュフロー列:NPV と IRR
現実の投資は「いま投資して、その後何年かにわたって回収する」キャッシュフローの列です。各期の金額 をそれぞれ現在価値に割り引いて合計したものが**正味現在価値(NPV: Net Present Value)**です。
NPV がプラスなら「割引率 で評価しても得」、マイナスなら「損」。投資判断のもっとも基本的なものさしです。例として「いま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)**と呼びます。
IRR は手では解けない(高次方程式になる)ので、数値的に根を求めます。NPV は の単調減少関数なので、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 はプラス、高ければマイナス。さきほど で NPV がプラスだったのは、IRR 15.24% がそれを十分上回っていたからです。NPV は「絶対額の儲け」、IRR は「率としての利回り」——同じ割引の枠組みを別の角度から見た2つの指標です。
5. 連続割引:離散から連続へ
ここまでは「年1回」の割引でした。複利の頻度を年 回に増やし、 の極限をとると、**連続複利(連続割引)**になります。
金融工学では、この による連続割引が標準形です。対数をとると線形になり、確率過程やブラック–ショールズの計算が一気に扱いやすくなるからです(金利と複利 で複利頻度と連続複利の関係を詳しく扱います)。極限に近づく様子を確かめます。
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
出力の意味:複利の頻度 を上げるほど将来価値は増えますが、その増え方は急速に頭打ちになり、連続複利 に収束します。年1回(11,592.74)と連続(11,618.34)の差はわずか約26円——頻度を無限に上げても得は限られます。実務では計算の都合で連続複利を使うことが多く、以降のノートでも割引はおおむね で書きます。
⚠️ よくある誤解
- 「割引率=銀行の金利」ではない:割引率は「そのお金を別の使い道に回したときに得られる利回り(機会費用)」で、リスクの上乗せ(リスクプレミアム)も含みます。安全な国債なら低く、リスクの高い投資なら高くなります。第2章の CAPM で「リスクに応じた割引率」を数理的に決めます。
- 「IRR が高ければ常に良い投資」ではない:IRR は規模を無視します。IRR 30% でも投資額が小さければ儲けの絶対額は小さい。規模を含めて判断するなら NPV を見ます。また、キャッシュフローの符号が複数回変わると IRR が複数存在する(または存在しない)ことがあり、その場合は NPV が安全です。
- 割引係数の足し算で済ませない: は について非線形に減ります。「2年後だから1年後の2倍割り引く」ではなく、 で割ります。各期ごとに正しい割引係数を掛けて合計するのが NPV です。
関連ノート
- 第1章 金融数学の基礎 目次
- 金利と複利 — 次のトピック:単利・複利・連続複利と実効年率を深掘り
- リターンの測り方 — 割引の逆操作にあたる「増え方」の測り方
- 確率変数(離散・連続)と期待値・分散(統計)— 将来キャッシュフローが不確実なとき、期待値で割り引く土台
- 金融工学テキスト 全体目次