1.今回学ぶこと
前回説明した通り、内部収益率(最終利回り)の計算は解析的にはできない。 そのため、適当な値で何回も計算してみて解を見つけるという、数値的な解法が 必要となる。本当に、適当に値を選んでいたら、いつになっても解が見つからない という事態となるので、効率的に(少ない計算回数で)解を探すための方法が、 幾つも考案されている。今回は、そうした方法として最も有名なNewton法 (正確には、Newton-Raphson法と呼ぶ)について、その考え方と実装方法について 学ぶ。
2.Newton法の概念
Newton法は、解を持つことが分かっている滑らかな関数の解を、非常に効率的に 求めることができる。1次導関数の値を使用するので、少なくとも解を探す範囲で、 微分可能でなければならない(導関数の値を数値的に求めることもできるが、 微分不可能な関数についてこれを行っても効果が無い場合が多い)。ここでは、 前回の例4を用いて、Newton法の考え方について解説する。まず、前回の例4は 以下の通りである。
10年満期で、元本100万円クーポン1.9%の国債があったとする。また、利払いは 年1回である。この国債の受け渡し日が今日で、価格が100.737万円であったとすると、 1年複利ベース内部収益率(IRR)は、以下の式で表すことができる。 (四捨五入して0.001%単位まで)。
 |
この式は、両辺に(1+IRR)10をかけることによって、次のように変形 することができる。

ここで、x=1+IRRとして整理すると、上の式は次の関数f(x)に書き換えることが できる。

関数f(x)をx=0.5からx=1.5の範囲で図示すると、下のグラフの青線のようになる。

上の図で、最初に選んだ値をx0とすると、関数の値はf(x0)で0にはほど遠い。つまり、 x0は関数f(x)の解とは言えない。そこで、次なるxの値を決める必要があるが、 Newton法ではここで1次導関数f'(x)のx0における値を使用する。
f'(x0)は、関数f(x)の接線のx0における傾きである。この傾きはx0において 負であるので、x0近傍では関数f(x)が左上がりであることを示している。また、 x0における関数f(x)の値は負であるので、探すべき解はx0の左側(小さい方)に 存在することが予想される。そこで、次なるxの値をどれだけx0の左側に設定するかが 問題となるが、Newton法では関数f(x)のx0における接線のX軸との交点を用いる。 これをx1とすると、次の関係が存在する。

上の式を変形して、x1を求める形にすると、以下の通りである。

次にx1について関数の値f(x1)を計算すると、それはまだ0には遠いので、 解とは言えない。そこで、再び1次導関数f'(x)のx1における値を求め、上記と同様に して次なる値x2を求める。f(x2)も0ではないから、x3を求めることになり、これを f(x)が0になるまで繰り返していく。通常は、必要な精度で0に近づけば十分とし、 計算を打ち切る。
3.Excelでの実装
3-1 導関数を用いた例
代数方程式のべき乗の数が全て整数で、全区間で微分可能である場合、1次導関数を 簡単に求めることができる。ここでは、これを用いた計算の繰り返しを、 Excelで実装した例を説明する。まず、上記の例での1次導関数は、 以下のようになる。
Excelでの計算手順は、以下のように考える。
- 初期値を入力する
- 1を用いて、f(x)の値を計算する
- 1を用いて、f'(x)の値を計算する
- 1と2と3を用いて、次のxを計算する
- 4を用いて、f(x)の値を計算する
- 4を用いて、f'(x)の値を計算する
- 4と5と6を用いて、次のxを計算する
- f(x)の値が0になるまで、5~7を繰り返す
下の図は、実際にExcel上で導関数を用いたNewton法を行った例である。

3-2 導関数の値を数値的に求める例
導関数式を記述するのが困難な場合は、数値的にこれを求めて代用してもよい。 ただし、この場合は、dxの値のとりかたによって、解を得るまでに必要な計算回数が 異なる(場合によっては、収束しなくなる)。また、導関数を用いる場合と比べて、 必要な計算回数は一般に多い。
微小な値をdxとすると、1次導関数f'(x)は、次の式で近似することができる。

計算の手順は、導関数を用いる場合と同じである。下の図は、導関数の値を数値的に 求めることによるNewton法を、Excel上で行った例である。

4.C言語での実装
Excelの計算精度は15桁であるため、より高い精度での計算が必要な場合は、 そのためのプログラムを作成する必要がある。 また、作業効率や計算速度の向上を望む場合も同様である。 プログラミング言語は何でもよいが、ここではC言語による実装をとりあげる。 以下のリンクは、導関数の値を数値的に得る方法で、上記例の 内部収益率をNewton法により求めるC言語のプログラム例である。そして、 下図はこれをコンパイルして実行した結果である。
ソースコードの表示

課題
課題1・2についてはExcelブックを、課題3・4についてはソースコードを 提出します。期限は授業中に指示します。
- 次の条件の債券の内部収益率(1年複利ベース)を、Excel上でのNewton法により 計算しなさい。ただし、導関数を求めて、それを用いること。
20年満期で、元本100万円クーポン2.2%の国債。利払いは 年1回である。この国債の受け渡し日は今日で、価格が96.452万円である。 |
- 次の条件の債券の内部収益率(1年複利ベース)を、Excel上でのNewton法により 計算しなさい。ただし、導関数は求めないで、数値的に近似しなさい。
15年満期で、元本100万円クーポン3.7%の国債。、利払いは 年1回である。この国債の受け渡し日は今日で、価格が118.881万円である。 |
- 上記課題1の計算を行うC言語プログラムを作成して、実行しなさい。
- 上記課題2の計算を行うC言語プログラムを作成して、実行しなさい。