UPDATE: 2022-12-11 12:56:13

はじめに

このノートではRを使ってファイナンスに関する基礎的な理論をまとめておく。ビジネスでデータ分析をする際に、ファイナンスの企業価値はユーザー価値とも考えることができそうだし、お金の時間価値はLTVに限らずユーザー価値を計算する際に、ユーザーが生み出すお金を、どのように考え、どのように扱うべきなのか、これらはファイナンスの分野の知識が役立てれそうと考えたので、ノートをいくつかに分けて、ファイナンスの基本知識をまとめておく。下記の文献を参考にしている。

お金の時間価値

お金には時間価値というものがある。つまり、明日の100万円よりも今日の100万円のほうが価値があるということ。同じ100万円だと思うかもしれないが、よくある例の「今もらえる100万円」と「1年後の100万円」のどちらを選ぶべきかという問題で考えてみる。

例えば、今100万円をもらって運用すれば、100万円は利回り10%で運用できれば、1年後には110万に増える。つまり、今の100万円は時間が経過するとともに利回りの分だけ価値が増えることになる。つまり、お金は時間的な価値という性質を持っている。このように1年後の110万円は現在の100万円と同じ価値と考えることができるが、仮に1年後でも100万円のまま変わっていないのであれば、現在の100万円とは価値がないとも言える。

いや、100万は1年後でも100万なんで、同じでしょう?と考えるかもしれないが、お金は運用すれば110万になると考えると、今の100万と1年後の110万であれば同じだが、1年後でも100ならば、価値としては下がっている。額面ではなく、時間価値という性質の話。お金の価値は時間とともに減っていってしまう。額面であって、今年は100円で買えていた卵が、1年後では物価が上昇し、100円では購入できないのであれば、額面は100円と変わらないが、100円の価値としては、卵を購入できなくなっている分、価値が下がっている。

元本100万円で利回り5%であれば、1年間で105万円になる。単利計算であれば、2年で110万円、3年で115万ということになるが、ファイナンスの世界では複利計算が一般的とのこと。福利計算であれば、

  • 1年後:100.00万円×(1 + 0.05)=105.00万円
  • 2年後:105.00万円×(1 + 0.05)=110.25万円
  • 3年後:110.25万円×(1 + 0.05)=115.76万円
  • 4年後:115.76万円×(1 + 0.05)=121.55万円
  • 5年後:121.55万円×(1 + 0.05)=127.63万円

となる。この計算は漸化式なので、下記のようにも書ける。

  • 5年後:100.00万円×(1 + 0.05)×(1 + 0.05)×(1 + 0.05)×(1 + 0.05)×(1 + 0.05)= 100.00万円×(1 + 0.05)^5 =127.63万円

CFは元本、\(r\)は利率、\(n\)は年数として、一般化すると

\[ FV = PV × (1 + r)^{n} \]

以降、小数点部分は説明簡略化のため省略する。このとき、3年後の115万は、現在の100万円の3年後の「将来価値(Future Value)」と呼ばれる。現在から見て、未来の価値を表しているので将来価値ということ。この将来価値と対比して重要な概念として、「現在価値(Present Value)」というものがある。将来のお金の価値を現在価値基準に修正したもののこと。

\[ PV= \frac{FV}{(1 + r)^{n}} \]

となる。

元本100万円で利回り5%であれば、3年後に115万円になっていた。では、利回り5%で3年後に115万円もらいたければ、現在時点ではいくら必要なのか。これは反対に計算すれば良いので、100万あればよい。つまり、115万円という価値は現在価値で100万円ということ。

現在価値から将来価値を計算する場合は、下記のとおり現在価値に\((1 + 0.05)^{3}\)をかければよく、

\[ \begin{eqnarray} 100 \overbrace{ \Rightarrow }^{ 100 × (1 + 0.05)^{3} } 115 \end{eqnarray} \]

将来価値を現在価値に割り戻す場合、下記のとおり将来価値に\(1/(1 + 0.05)^{3}\)をかければよい。これを将来価値を割り引くとい表現され、この際に利用されている5%のことを「割引率」という。つまり、下記では、将来価値を割引率5%で割り引いている。割引率は期待(要求)収益率とも呼ばれる。

\[ \begin{eqnarray} 100 \underbrace{ \Leftarrow }_{ 115 × \frac{1}{(1 + 0.05)^{3}}} 115 \end{eqnarray} \]

リスクと割引率

ファイナンスの世界での「リスク」という言葉は世間の感覚とは異なる。ファイナンスの世界のリスクは「不確実の大小」を表す。つまり、自分の保有している株が明日にでも下落することがわかっているとする(普通はわからないが)。これはファイナンスではリスクとはいわない。なぜなら、不確実性がなく確実に明日、下落するのであれば、対処することでリスクは小さくできる。一方で、明日どうなるかわからない状態は不確実性が高いため、リスクが大きいという。リスクを理解する例として、友達にお金を貸す問題がある。(いろんなファイナンスの入門本に出てきたので、本当にわかりやすい例なんだろう。)

仲もよく、家柄もよく、大企業に勤務しているAさんに100万円を1年間貸す場合と、全く知らないBさんにも100万円を1年間貸す必要があるとする。このとき、AさんとBさんの利率はどのように設定するか、という問題。Aさんはおそらく返済してくれる確率が高そうなので、利率は1%としたとする。Bさんは全く知らない人なので、返済されるかすらわからず、不確実性が非常に高い。ここでは50%の利率をBさんには貸すとする。この背景にはリスク=不確実性の大小が反映されていることになる。つまり、リスクが高い場合、収益を少しでも高くしようとする。これがハイリスクハイリターン法則。ここまでの話を整理すると、下記のようになる。

  • Aさん:現在価値100万円×(1 + 0.01)=将来価値101万円
  • Bさん:現在価値100万円×(1 + 0.50)=将来価値150万円

これを将来価値の視点から見ることで割引率の性質がわかる。

  • Aさん:将来価値101万円×1/(1 + 0.01)=現在価値100万円
  • Bさん:将来価値150万円×1/(1 + 0.50)=現在価値100万円

ここまででは何をやりたいのかわからないかもしれないが、1年後の返済額を100万円に固定させて現在価値を考えると、

  • Aさん:100万円×1/(1 + 0.01)=現在価値99万円
  • Bさん:100万円×1/(1 + 0.50)=現在価値66万円

となり、同じ1年後の100万円でもAさんに貸しているお金のほうが現在価値が高く、Bさんは不確実性が高く、リスクが高いため現在価値が低くなる。つまり、Bさんのほうがリスクへの認識が大きいので、かせるお金の額は小さくなる。まとめると、割引率が大きくなると現在価値は小さくなり、割引率が小さくなると現在価値は小さくなる。

現在価値から将来価値を求めるときには、要求収益率と呼ばれることもある。呼び方が違うだけで同じものと考えても問題ない。将来価値を計算する際には要求収益率と呼ばれ、現在価値を計算する際には割引率が使われる。いずれにせよ、リスクの大きさを割引率に反映させている。現時点からみた長期的な将来は不確実性が高くリスクが高いとも考えられるため割引率にその度合いを反映させる必要がある。

企業価値

企業価値は現在のキャッシュフローの現在価値の大きさで計算される。この企業価値を使って投資判断を行うことになる。企業価値とは、大きく2つの観点に分けることができる。

  • どうやって生み出されるのか
    • 非事業価値:会社の事業とは関係ないものから生まれるもの(今保有しているキャッシュ)
    • 事業価値:会社の事業から生まれるもので、例えばDCF(Dicounted Cash Flow)法で将来のキャッシュフローを現在価値の割り戻して算出される(将来のキャッシュ)
  • 誰のものなのか
    • 債権者価値:
    • 株主価値:

DCF法(割引現在価値法)は、予想FCF(フリーキャッシュフロー)を計算し、WACCで現在価値に割り戻して、ターミナルバリューを計算することで事業価値は計算できる。フリーキャッシュフローは、会社が生み出したキャッシュの中で、費用や税金などを払い終えた後の債権者と株主に帰属するキャッシュのこと。下記の指標を用いて計算する。

  • FCF = 税引き後営業利益 + 減価償却費 - 設備投資費 - 運転資金増加額
    • 税引き後営業利益:営業利益から営業利益にかかる税金を引いたもの
    • 減価償却費:キャシュアウトしないのでこれは足す指標
    • 設備投資費:キャッシュが減るため引く
    • 運転資金増加額:キャッシュが減るため引く

予想FCFが計算できたら、WACCを用いて、現在価値を計算する。WACC(Weighted Average Cost of Capital)は「加重平均資本コスト」とも呼ばれる。WACCを理解するためには企業のBSから始めるとわかりやすい。企業は有利子負債と株主資本から資金を調達する。調達するための調達コストを負担していることになる。また、有利子負債(Dept)は、下記の性質を持っている。 - 元本の返済が約束されている - 元金・利息の支払日が約束されている - 変換の優先順位は株主資本よりも高い

株主資本(Equity)は、下記の性質を持っている。 - 元金の返済は約束されていない - 配当の支払いも約束されていない - 返還は有利子負債の支払い後 - 残ったものは全て株主のもの

そこで、調達コストと資本比率を元に加重平均を計算することで割引率を計算する。CAPMという理論を用いて計算された株主資本コスト(rE)に株主資本比率をかける。そして、有利子負債資本コスト(rD)に、有利子負債比率と(1-税率)をかけて、双方を足し合わせる。

\[ WACC = \left[rE × \frac{E}{D+E} \right] + \left[rD × (1 - TaxRate) ×\frac{D}{D+E} \right] \]

FCFとWACCが計算できたので、あとはターミナルバリューを計算する。DCF法企業が永遠存在するという仮定(Going Concern)を持っているので、一定の年数以上の予測は困難なので、一定の年数以降の予測値をターミナルバリューと呼び、一定の仮定のもとで計算する。ターミナルバリューは永久成長モデルを採用することが多く、永久成長モデルは一定の年数以降は一定の成長率で計算し続けるというもの。これで事業価値が計算できたので、これに非事業価値を加えると企業価値が算出される。ここから、債権者価値を引くと、株主価値が計算できる。やっと、企業価値が計算できたので、ここからは投資判断のために企業価値を利用する方法をまとめていく。ここでは、基礎的なNPV法(現在正味価値法)、IRR法(内部収益率法)、単純回収期間法をまとめる。

NVP法は、将来の全てのキャッシュフローの現在価値を合計したものから、初期投資額がプラスなのであれば投資する意味があると判断できる。キャッシュインするであろうお金を現在価値に戻す必要があるので、注意が必要。例えば、下記のような投資判断プロジェクトがあった場合に、NPVは53となって、プラスのキャッシュが生み出されると判断できる。割引率は5%とする。

library(tidyverse)
df_pv <- tibble(
  time = 0:5,
  v = c(-1000, 100,200,250,300,400)
)
df_npv <- df_pv %>% 
  mutate(
    pv = v * 1/(1 + 0.05)^time
  )
list(df_npv, npv = sum(df_npv$pv))
## [[1]]
## # A tibble: 6 × 3
##    time     v      pv
##   <int> <dbl>   <dbl>
## 1     0 -1000 -1000  
## 2     1   100    95.2
## 3     2   200   181. 
## 4     3   250   216. 
## 5     4   300   247. 
## 6     5   400   313. 
## 
## $npv
## [1] 52.8246

IRR法は、内部収益率を利用する方法で、ファイナンスの世界では期待利回りとも呼ばれる。実際にはIRRはNPVを0にする割引率と定義されおり、先程のプロジェクトでは割引率は5%だったが、NPVを0にする割引率を考えるのがIRR法。この例の場合、6.57%がIRRとなるので、この割引率だとNPVが0になる。つまり、このIRRよりも低い割引率であれば、NPVはプラスになり、投資判断的にはOKということになる。このとき、プラスマイナスの境目としてのハードルの機能を果たすことから、ハードルレートと呼ばれる。ただIRR法はキャッシュフローの大きさが反映されないため、注意が必要。

df_irr <- df_pv %>% 
  mutate(
    pv = v * 1/(1 + 0.0657)^time
  )
list(df_irr, npv = sum(df_irr$pv))
## [[1]]
## # A tibble: 6 × 3
##    time     v      pv
##   <int> <dbl>   <dbl>
## 1     0 -1000 -1000  
## 2     1   100    93.8
## 3     2   200   176. 
## 4     3   250   207. 
## 5     4   300   233. 
## 6     5   400   291. 
## 
## $npv
## [1] 0.06962868

最後は単純回収期間法。単純回収期間法は初期投資がいつ回収できるかを基準とする。先程のプロジェクトでは初期投資が1000なので、いつになれば1000を回収できるかを考える。4と5時点の間でNPVがプラスに転じることがわかるので、この場合、正確に計算すると4.3年ということになる。端数は\(400/12=33.33\)で3ヶ月で回収できる。

df_simple <- df_pv %>% 
  mutate(
    pv = cumsum(v)
  )
list(df_simple, npv = sum(df_simple$pv))
## [[1]]
## # A tibble: 6 × 3
##    time     v    pv
##   <int> <dbl> <dbl>
## 1     0 -1000 -1000
## 2     1   100  -900
## 3     2   200  -700
## 4     3   250  -450
## 5     4   300  -150
## 6     5   400   250
## 
## $npv
## [1] -2950

ただ、単純回収期間法は現在価値を利用しない、現在価値を利用しない=割引率にリスクを反映させていない、回収期間以降のキャッシュフローは考慮していなどの問題がある。

まだまだ、ファイナンスの基礎としてカバーする部分は多いが今回はここまで。

おまけ

お金の価値がビジネスのデータ分析とどのような関係にあるのかというと、サブスクリプションビジネスでユーザーのLTVを計算する際に、KM曲線から生存率を計算して利用することがある。

月額5万円のサービスであれば毎月5万円が売上になる。ただ、ファイナンスの文脈で考えれば、将来の5万円は現在基準で考えるのであれば現在価値に割り引く必要がある。つまり、将来も払われるであろう5万円を現在価値に換算する、そのためには割引率が必要で、この割引率を生存確率を利用することで代替することができる。

例えば、1ヶ月目の生存確率が95%(解約率が5%)であれば、1ヶ月目の5万を現在価値に割り戻すと、

50000 * 0.95
## [1] 47500

となる。割り戻す場合は割引率を分母に持ってきて、計算するのでは?あれ、数字が合わない…?割引率と生存確率(解約確率)は関係ないのか?という疑問もあるが、

50000 * 1/(1 + 0.05)^1
## [1] 47619.05

何らかの割引率を計算して出てきた数字(生存確率)0.95を利用しようと考えればよいと思われる。つまり無理くり計算すると、割引率を0.05263として計算した感じ。

50000 * 1/(1 + 0.05263)^1
## [1] 47500.07

このように将来価値を現在価値の計算式に無理くり当てはめなくても、将来生存しているユーザーの確率でお金を重みづけて、お金の価値を現在価値に割り戻そうと考えれば少しは理解が進むかも。いくつか実際の計算例を残しておく。生存確率をかけたものと、割引率を解約確率で表し、時点によって割引率の大きさが変えているパターン、最後は各時点での解約率をかけ合わせて利用して割引率を計算しているパターンの3つ。どちらが正しいのかはわからないが、真ん中は結構シビやであるが、LTVはそもそも不確実性が高いものなので、低めに見積もるほうが良いかも。

value <- 50000
t <- 0:11
surv_p <- c(1, 0.8, 0.7, 0.6, 0.51, 0.43, 0.37, 0.31, 0.27, 0.23, 0.19, 0.16)
churn_p <- 1 - surv_p

d1 <- data.frame(t, value, surv_p, churn_p) %>% 
  mutate(
    m1 = value*surv_p,
    m2 = floor(value*1/(1+churn_p)^t),
    t1 = cumprod(1 + churn_p),
    t2 = 1 / cumprod(1 + churn_p),
    m3 = floor(value * 1 / cumprod(1 + churn_p))
  ) 

d1_sum <- d1 %>% 
  summarise(
    sum_m1 = sum(m1),
    sum_m2 = sum(m2),
    sum_m3 = sum(m3)
  )
list(d1, d1_sum)
## [[1]]
##     t value surv_p churn_p    m1    m2         t1         t2    m3
## 1   0 50000   1.00    0.00 50000 50000   1.000000 1.00000000 50000
## 2   1 50000   0.80    0.20 40000 41666   1.200000 0.83333333 41666
## 3   2 50000   0.70    0.30 35000 29585   1.560000 0.64102564 32051
## 4   3 50000   0.60    0.40 30000 18221   2.184000 0.45787546 22893
## 5   4 50000   0.51    0.49 25500 10144   3.254160 0.30729897 15364
## 6   5 50000   0.43    0.57 21500  5241   5.109031 0.19573182  9786
## 7   6 50000   0.37    0.63 18500  2665   8.327721 0.12008087  6004
## 8   7 50000   0.31    0.69 15500  1269  14.073848 0.07105377  3552
## 9   8 50000   0.27    0.73 13500   623  24.347757 0.04107154  2053
## 10  9 50000   0.23    0.77 11500   293  43.095531 0.02320426  1160
## 11 10 50000   0.19    0.81  9500   132  78.002911 0.01282003   641
## 12 11 50000   0.16    0.84  8000    61 143.525355 0.00696741   348
## 
## [[2]]
##   sum_m1 sum_m2 sum_m3
## 1 278500 159900 185518

先程よりも長生きするようにしてみたバージョン。

surv_p2 <- c(1, 0.8, 0.75, 0.73, 0.70, 0.67, 0.65, 0.63, 0.62, 0.60, 0.55, 0.50)
churn_p2 <- 1 - surv_p2

d2 <- data.frame(t, value, surv_p2, churn_p2) %>% 
  mutate(
    m1 = value*surv_p2,
    m2 = floor(value*1/(1+churn_p2)^t),
    m3 = floor(value * 1 / cumprod(1 + churn_p2))
  )

d2_sum <- d2 %>% 
  summarise(
    sum_m1 = sum(m1),
    sum_m2 = sum(m2),
    sum_m3 = sum(m3)
  )

list(d2, d2_sum)
## [[1]]
##     t value surv_p2 churn_p2    m1    m2    m3
## 1   0 50000    1.00     0.00 50000 50000 50000
## 2   1 50000    0.80     0.20 40000 41666 41666
## 3   2 50000    0.75     0.25 37500 32000 33333
## 4   3 50000    0.73     0.27 36500 24409 26246
## 5   4 50000    0.70     0.30 35000 17506 20189
## 6   5 50000    0.67     0.33 33500 12014 15180
## 7   6 50000    0.65     0.35 32500  8259 11244
## 8   7 50000    0.63     0.37 31500  5519  8207
## 9   8 50000    0.62     0.38 31000  3801  5947
## 10  9 50000    0.60     0.40 30000  2420  4248
## 11 10 50000    0.55     0.45 27500  1216  2929
## 12 11 50000    0.50     0.50 25000   578  1953
## 
## [[2]]
##   sum_m1 sum_m2 sum_m3
## 1 410000 199388 221142