現在価値と将来価値

現在価値と将来価値、という言葉を聞いたことはありますか?数年前に仲間内で話した時のスライドを記事に書き直しました。以前話した際には「another storry of r」という副題で話しました。

永年会員と年会費

私が若かった頃、米国物理学会(APS)の永年会員(permanent membership)が1,500ドルでした。当時年会費は100ドルだったので、かなり高かったのですが、少し考えて永年会員になりました。今でも、かなり薄くはなりましたが、physics todayを送ってきてくれます。数年前、60歳になった際に英国王立植物学会(RHS)のシニア永年会員にもなりました。こちらは永年会費£820で、当時年会費は£50位でした。こちらは寄付的意味合いで加入しました。

現在価値(PV)、将来価値(FV)と割引率(discount rate, r)

現在価値とn期間後の将来価値、割引率の間には以下の関係があります。

FV = PV \times (1 + r)^n

PV = FV \times (1 + r)^{-n}

ここで、rは 期間あたりの割引率で、nは期間(単位期間のn倍)です。将来価値を現在に焼き直したい場合、$(1+r)$の$-n$乗で割り引かないといけない、という意味です。

キャッシュフロー

経済学では、安定したお金の流れをキャッシュフローと言います。将来安定してキャッシュフローが予定されている場合に、その現在の価値はいくらでしょうか?ここでは期間の単位を年として、n年後のお金は$(1+r)^{-n}$で割り引かないといけないので、キャッシュフローの現在価値は

PV = 1 + (1 + r)^{-1} + (1 + r)^{-2} + (1 + r)^{-3} \dots

= {{1}\over{r}}

となります。これが、APSやRHSの永久会員が年会費の15~16倍である理由です。一般的にはrは0.04-0.05を使うのですが、会費の場合は徴収の手間等が大幅に削減されるので、お安めになるようです。他にも、株価情報の一つであるPER(price earning ratio)の元になるのもこれです。

理系の皆さんは(今の日本みたいに)r→0の時はどうなるの?という疑問が湧くと思います。n→∞まで足すことはないよ、というのと、rは大体0.04位だよ、というのが一般的な答えのようですが、納得しがたいところもあります。

有限年のキャッシュフロー

ということで、キャッシュフローがn年後で終わる場合を考えてみます。

PV_n = 1 + {1\over{1+r}} + {1\over{(1+r)^2}} + \dots + {1\over{(1+r)^{n-1}}}

両辺に$(1+r)$をかけて$1/(1+r)^{n-1}$を足して引きます。

(1+r)PV_n = (1+r) + 1 + {1\over{1+r}} + {1\over{(1+r)^2}} + \dots + {1\over{(1+r)^{n-2}}} + {1\over{(1+r)^{n-1}}} - {1\over{(1+r)^{n-1}}}

この式から上の式($PV_n$)を引きます。

rPV_n = (1+r)  - {1\over{(1+r)^{n-1}}}

PV_n = {{(1+r)^n-1}\over{r(1+r)^{n-1}}}\simeq n{{1+{{(n-1)}\over{2}}r}\over{1+(n-1)r}} \:{\rm for} \:(nr \ll 1)

最後の変形は補足で示します。(自分でやったので間違っているかもしれません)

rの関数としてのPV(n=30, 50, ∞)

解析的に求めても、求めなくてもpython(でも何でも)を使えば1~2行で求められます。

rとは

これまではrを割引率(discount rate)と言ってきましたが、同様の概念は色々な所で使われているようです。
  • 割引率
  • 利回り
  • 成長率(g)
  • リスクプレミアム
などです。組み合わせて使用される場合もあります。例えば、分子(キャッシュフロー)が$g$だけ成長する場合、

(1 + r) \rightarrow {{1 + g}\over{1 + r}}, {1\over r}\rightarrow {1\over{r - g}}

と書き換えることが出来ます。理系の皆さんは、$r\le g$の場合はどうするの?とツッコミを入れたくなりますが、成長率を考慮する場合は、$r$の方も、リスクプレミアムを5%程度加算するので、$r-g$は正、というのが一般的な解釈のようです。

投資と利回り

「割引」の代わりに、投資とその成長を考える事が出来ます。投資したお金が毎年(1+r)倍になる、ということです。嬉しいですね。ある会社の株式を購入したとして、株価が毎年上昇すれば、「成長」している、ということです。黙っていても成長しないので、その会社の人が頑張って以下のような事が起こっているという事です。
  • 効率的になる
  • マーケットシェアが拡大する。新しいマーケットを開拓する
  • 人気が上がる
この辺りの詳細は本記事には関係ないので省略します。以下のグラフは毎年3, 5, 7%成長したとしたらどうなるか、です。単に$(1+r)^n$をプロットしています。
なお、もし、その会社が「配当」という形で成長(利益)を還元してくれているのなら、配当を再投資しないと上記リターンは得られません。

積立投資

さて、毎年一定の金額を投資して行くとします。n年後にはどうなっているでしょうか?最初に投資したお金は$(1+r)^n$倍に、次の年に投資したお金は$(1+r)^{n-1}$倍になっているので、

(1+r)^n + (1+r)^{n-1} + (1+r)^{n-2} + \dots

= {{(1+r)^{n+1} - 1}\over r}

3, 5, 7%の場合、
となります。もし、毎年100万円ずつ投資できて、40年後、r=3%なら、8000万円に、r=5%なら1億3000万円に、r=7%なら2億2000万円になるという事です。

なお、これはあくまでn年後の価値(=将来価値)です。現在価値に焼きなおしてみると、$(1+r)^n$で割らないといけないので、現在価値は$1/r$になります。

補足:$PV_n$の導出

以下、自分で導出してみたので、合っているかは分かりません。使っているツールも数年前に確認したものなので、今も最適のツールかどうかは分かりません。

まず、$(1+r)^{-n}$をテイラー展開します。
(1+r)^{-n} = \sum\limits_{k=0}^\infty
 (-1)^k\;_{n+k-1}C_k\;r^k

これは帰納法で証明できるようです。次に$PV_n$を展開します。
((1+r)^n-1)r^{-1}(1+r)^{-n+1} =(\sum\limits_{i=0}^n\:_nC_i\: r^i-1)\: r^{-1} \sum\limits_{k=0}^\infty
 (-1)^k\;_{n+k-2}C_k\;r^k

これをrとnのべきで整理します。
PV_n = {{(1+r)^n-1}\over{r(1+r)^{n-1}}}
PV_n(r) = n + {{1}\over{2}}(n-n^2)r + {{1}\over{6}}(-n+n^3)r^2
+ {{1}\over{24}}(2n+n^2-2n^3- n^4)r^3
+ {{1}\over{120}}(-6n-5n^2+5n^3 + 5n^4 + n^5)r^4
+ \dots

simpyで多項式の積を多項式に展開

いくつかやり方はあると思うのですが、simpyでやってみます。


n, i, k = symbols('n i k', integer=True, positive=True)
r = Symbol('r', positive=True)
p1 = summation(binomial(n, i) * r**(i-1), (i, 1, 10))
p2 = summation(binomial(n + k - 2, k) * (-r)**k, (k, 0, 10)) 
collect(expand(combsimp(p1 * p2)), r)
順番が逆になってしまうのですが、、、以下の様に表示されるはずです

$\dots$


for j in range(8):
    display(factor(pp.coeff(r, n = j)))
とすると

となります。

numpy.polynomial

numpyでもできます。
import numpy as np
from numpy.polynomial import Polynomial
import math
from scipy.special import comb
def binomial(k, r = 1, n = 30):
    if k >= 0:
        return [ np.power(r, i) * fact(k, i) for i in range(k+1)]
    else:
        return [ np.power(-r, i) * comb(-k + i - 1, i) for i in range(n)]
# Subtract 1 and divide by r
b = binomial(31)[1:]
bb = binomial(-30)
p = Polynomial(b)
pp = Polynomial(bb)
# print(np.poly1d(p))
# print(np.poly1d(pp))
# multiply two polinomials
ppp = p * pp
print(ppp(0.05))
print(ppp)

以上です。お疲れ様でした。

コメント

このブログの人気の投稿

建築士さんと家を建てよう

資産の記録を自動化してみた

米国の年金の受給申請をした