金融工学入門[Investment science] 第2章練習問題　自己解答

#はじめに
本記事はDavid G.Luenberger氏の『Investment science (Second edition)』の和訳本である『金融工学入門』の各章の終わりにある練習問題の自己解答です。

あくまで僕自身の解答なので参考程度にしていただけると幸いです。また、記載されている答えが誤っている場合や良いより手法があった場合は是非教えて頂けるとありがたいです。

可能な限り導出なども記載し、数値計算などが必要な場合は適宜PythonまたはRを用いて実装する予定です。

<b><font color='Red'>また、著作権の問題で問題文は記載しないので問題文は各自で確認してください。</b></font>

#解答範囲
本記事は第二章<b>『基本的な金利理論』</b>の練習問題の解答です。

#解答
##2.1 
投資の終了期間は執筆時点の2020年とした。

求めたい価格$P$を$$P=x\left( 1+r\right) ^{n}\tag{1}$$ として計算した。ここで $x$:初期投資額、$r$:金利、$n$:投資期間 とする。
###(a)
$$r=0.033\\\n=2020-1776=244$$
が既知である。

この時
$\left( i\right) x=1,000ドル$

$(1)$より $P=1000(1+0.033)^{244}\approx276万ドル$

以下同様に
$\left( ii\right) x=10,000ドル$
$P=100000(1+0.033)^{244}\approx2760万ドル$

$\left( iii\right) x=100,000ドル$
$P=1000000(1+0.033)^{244}\approx2億7600万ドル$

$\left( iv\right) x=1,000,000ドル$
$P=10000(1+0.033)^{244}\approx27億6000万ドル$

###(b)
$r=0.066$として(a)の時と全く同じく$(1)$利用して解くことができるので$\left( i\right) x=1,000ドル$のみ確認すると

$P=1000(1+0.066)^{244}\approx59億ドル$

(複利の力恐ろしい...)

##2.2
```math
\begin{align}
\left(1+r\right)^{n}&=2\\
\Leftrightarrow n\ln\left(1+r\right)&=\ln2\tag{2}
\end{align}
```
ここで　
$$\ln2=0.69\\\ \ln(1+r)\approx r$$
を用いる事で$(2)$は
$$n=\frac{0.69}{r}$$
パーセント表示の為$r=i/100$とすれば
$$n=\frac{69}{i}$$
よって題意を満たす。

もう一方の
$$n=\frac{72}{i}$$
と近似する方はイマイチ納得できるやり方がまだ分からないので知ってる人がいたら教えてください。

##2.3
求めたい実行利率$r_0$を$$1+r_0=\left(1+\frac{r}{m}\right)^{m}\quad(m:複利の実施間隔)$$
とする。

###(a)
```math
1+r_0=\left(1+\frac{0.03}{12}\right)^{12}\\
r_0=0.0304
```
###(b)
```math
1+r_0=\left(1+\frac{0.18}{12}\right)^{12}\\
r_0=0.1956
```
###(c)
```math
1+r_0=\left(1+\frac{0.18}{4}\right)^{4}\\
r_0=0.1925
```

##2.4
本文中ではニュートン法の定義が書かれてるだけだが一応導出もしたので記載しておきます。

```math
\begin{align}
f(\lambda)&=-a_0+a_1\lambda+\cdots+a_n\lambda^n\\
f'(\lambda)&=a_1+2a_2\lambda+\cdots+na_n\lambda^{n-1}
\end{align}
``` 
この時、$\lambda>0$の条件の下で適当な解$\lambda_0$を決め、$(\lambda_0,f(\lambda_0))$を通る傾きが$f'(\lambda_0)$の直線と$x$軸との交点を新たに$\lambda_1$として更新する。この直線を$g(\lambda)$とすれば$g(\lambda)$は

```math
g(\lambda)=f'(\lambda_0)(\lambda-\lambda_0)+f(\lambda_0)
```
であり、交点$\lambda_1$は

```math
f'(\lambda_0)(\lambda_1-\lambda_0)+f(\lambda_0)=0\\
\therefore \lambda_1=\lambda_0-\frac{f(\lambda_0)}{f'(\lambda_0)}
```
この作業を何度も行う事で一般式$$\lambda_{k+1}=\lambda_k-\frac{f(\lambda_k)}{f'(\lambda_k)}\tag{3}$$を得る。

さて本題ですが、

```math
f(\lambda)=-1+\lambda+\lambda^2\\
f'(\lambda)=1+2\lambda\\
\lambda_0=1
```
として$\lambda_1,\lambda_2,\lambda_3$を求める。$(3)$に代入するのみなので計算は省略します。

```math
\begin{align}
\lambda_1&=\frac{2}{3} \\
\lambda_2&=\frac{13}{21} \\
\lambda_3&=0.62
\end{align}
```

Pythonで簡単に実行してみます。

```python
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def f(x):
    y=-1+x+x**2
    return y
def df(x):
    y=1+2*x
    return y

lam=1
num=10
plt.figure(figsize=(4,3))
y = [lam,]

for i in range(num):
    lam = lam - (f(lam)/df(lam))
    print(lam)
    y.append(lam)
    
plt.plot(np.arange(num+1),y)
```
実行結果
![newton.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637140/6b7a367e-f986-90f8-0f07-d485ff15540b.jpeg)

$\lambda$の更新毎の値

0.6666666666666667
0.6190476190476191
0.6180344478216818
0.618033988749989
0.6180339887498948
0.6180339887498948
0.6180339887498948
0.6180339887498948
0.6180339887498948
0.6180339887498948

4，5回$\lambda$の値を更新した段階でもう誤差は0とみなせる程になりました。（なぜかX軸のラベルがはみ出る、、、）

##2.5
この問題は2章の中でも練習問題で取り上げられて、現在価値で評価する方法と内部収益率で評価する方法の二つを挙げています。同様にこの問題も二つの手法で解いてみますが、おそらくこの問題は現在価値で評価する事を目的にしていると思われます。（内部収益率は計算できる感じはないような気がするので。）

###1.現在価値で評価

$n$年待った際の現在価値$PV_n$は
$$PV_n=-1+\frac{n+1}{(1+0.1)^n}$$
となる。
この時

```math
\begin{align}
PV_{n+1}-PV_{n}&=\left(-1+\frac{n+2}{1.1^{n+1}}\right)-\left(-1+\frac{n+1}{1.1^{n}}\right) \\
&=\frac{1}{1.1^n}\left(\frac{n+2}{1.1}-(n+1)\right)
\end{align}
```
今回は符号に興味があるので最後の式の括弧内にのみを対象に考えればよく
$$\frac{n+2}{1.1}-(n+1)=\frac{-0.1n+0.9}{1.1}$$
これにより

```math
PV_{n+1}-PV_{n}は\begin{cases}n<9\rightarrow +\\ n=9\rightarrow 0\\ n >9\rightarrow -\end{cases}
```

よって$PV_9$までは単調に現在価値が増加するが$PV_9$と$PV_{10}$で等しい値になり以後単調に下がり続ける為、$n=9,10$が最も最善であると考えられる。

###2.内部収益率で評価

このプロジェクトが一回限りで終わらず何度も繰り返し行われるのであれば内部収益率で考えるのが望ましい。
この時の$n$年待ったプロジェクトの内部収益率$r_n$は

```math
-1+c^n(n+1)=0\quad\left(c=\frac{1}{1+r_n}\right) 
```
を満たす。

$$c^n=\frac{1}{n+1} \\\ c=\left(\frac{1}{n+1}\right)^{\frac{1}{n}}$$

$r$が大きい時$c$は小さい値をとるので最小の値を取る$c$を求めればよい。
なんとなく$\log$に似たような形になるような気はしますが、確認がてらPythonの実装をしてみました。
この計算は頑張れば解けそうな気がするんですがやり方が思い出せないので分かる人いたら教えてください。

```python
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

y = []
num = 1100
def IRR(n):
    y=(1/(n+1))**(1/n)
    return y

for i in range(num):
    i+=1
    y.append(IRR(i))

x = np.arange(num)
x+=1

plt.figure(figsize=(4,3))
plt.plot(x,y)
plt.xlabel("num")
plt.ylabel("c")
plt.savefig('IRR.png')
```
![IRR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637140/524940d6-7fa6-e709-2a60-5997912a00e2.png)

またX軸のラベルが切れてて申し訳ないんですが、$n$と$c$の関係を表したグラフです。
これを見るとやはり$\log$らしき感じで出てきました。
よってグラフかも分かる通り、最も良い内部収益率を持つ点は$n=1$であるようです。

##2.6

これは単純な計算問題なので式のみ記述します。

```math
(a) \left(1+\frac{0.1}{12}\right)^{12}=1.104713\cdots \\
(b) e^{0.1}=1.105170\cdots
```
よって求めたり金利$r$は
$$(a)r=10.471\%\\\ (b)r=10.517\%$$

である。


もしかしたらなんですが・・・

```math
(a) \left(1+\frac{r}{12}\right)^{12}=1.10 \\
(b) e^{r}=1.10
```
を満たすような$r$を求めよという意味の問題なのかもしれないです。ちょっと文章を読んだだけではどちらか判断できませんでした。

ちなみにこの答えは
$$(a)r=9.5670\% \\\ (b)r=9.5310\%$$
となります。

##2.7
この問題は単純に
$$PV=\sum ^{19}_{k=0}\frac {50}{\left( 1.1\right) ^{k}}$$
を解くだけであるが、無限級数を使った解き方の導出も掲載しておきます。

```math
\begin{align}
\sum^{n}_{0}\frac{a}{(1+r)^k}&=\sum^{\infty}_{0}\frac{a}{(1+r)^k}-\sum^{\infty}_{n+1}\frac{a}{(1+r)^k} \\
&=\frac{a(1+r)}{r}-\frac{1}{(1+r)^{n+1}}\frac{a(1+r)}{r} \\
&=\left(1-\frac{1}{(1+r)^{n+1}}\right)\frac{a(1+r)}{r}
\end{align}
```

よって$$r=0.1 \\\ n=19 \\\ a=50$$を代入して$$PV=468.24万ドル$$を得る。