1. QuantLibを使ってみる
1.2 Example を試す
1.2.4 Bonds プロジェクト: 一般的な債券の価格、利回り、経過利息の計算
1.2.4.1 はじめに
3番目のプログラム例として、Bonds プロジェクトのソースコードの解析を行いたいと思います。このプロジェクトでは、一般的な債券の、価格、利回り、経過利息などを計算します。債券利回りの計算方法は、市場慣行では内部収益率(IRR : Internal Rate of Return)の考え方を使い、債券価格からそれに対応する債券利回りを計算します。内部収益率は、金利の期間構造を考慮しませんが、逆に 1 個の値で利回りを表現できるので、様々なクーポンの債券や、満期の異なる債券の価値を比較するのに適しています。また、債券利回りが求まれば、価格計算も、イールドカーブの構築を必要としないので、はるかに簡単に行えます。
しかしこのプロジェクト例では、イールドカーブを構築して、金利の期間構造も勘案した方法で債券価格を計算しています。そもそも債券価格は市場データから取ってくるのが一般的で、このようにして価格計算するのは、デリバティブズが付随した仕組債券など、一部の債券に限られます。
これまでの例と同様、Instrument の派生クラスである”Bond”クラスのオブジェクトと、債券価格を計算する用の PricingEngine オブジェクトを構築し、両者を組みあせて価格計算を行います。価格計算にイールドカーブを使うので、その構築にテストコード全体の半分以上を費やしています。ここで使われる Instrument オブジェクトは、シンプルなゼロクーポン債、固定金利債、及び変動金利債なので、使われている PricingEngine もシンプルです。すなわち、イールドカーブから Discount Factor を導出し、キャッシュフローの現在価値を計算しているだけです。デリバティブズ用の PricingEngine を使った、コールオプション付き債券の価格計算は、次の CallableBonds のプロジェクトで解説します。
尚、このプロジェクトの解説は、既に 2019 年頃にこのサイトにあげていましたが、その後、C++11 への対応に合わせて。ソースコードの書き換えが行われており、その新しいコードをベースに解説を行います。また、前回の解説は、細部を説明しすぎて、読みにくい文章になっていたので、より簡潔に主要なポイントに絞って説明し、細部については Appendix で解説を行うようにしました。
1.2.4.2 ソースコードのコンパイルと実行
これまでのプロジェクト例と同様、まず Bonds プロジェクトのソースコードをビルドし、実行可能なバイナリーファイルを生成します。そのために、まず QuantLib.sln ファイルから Bonds プロジェクトを選択します。その手順は以下の通りです。
- まず QuantLib ディレクトリ下にある“QuantLib.sln”ファイルを開けます。すると Visual Studio が起動され、このソリューションファイルが開かれます。ソリューションエクスプローラーにある 21 個のプロジェクトのリストから、Bondsプロジェクトを選択します。
- メニューバーから、“プロジェクト(P)” → “スタートアッププロジェクトに設定(A)”を選択します。これにより Bondsプロジェクトが、21個のプロジェクトの中で、最初に実行されるプロジェクトになります。
ここからの、ビルド方法は、こでまでのセクションで何度か解説しているので、そちらを参考にして下さい。そこで解説した通り、Boostライブラリへのパスの設定を忘れずに行って下さい。
ビルドが成功すれば、試しにプログラムを走らせてみます。メニューバーから“デバック(D)” → “デバックの開始(S)”を選択します。下記のConsole画面が出力されれば成功です。
1.2.4.3 ソースコードの全体像
ソリューションエクスプローラーにある Bondsプロジェクトを展開すると Bonds.cpp というファイル名のソースコードファイルが現れます。それを、ブラウザーでも見られるように、htmlファイルに変換したソースコードを載せますので、それを見ながら読み進めて下さい。
ソースコードは全体で約560行ありますが、その構成は、
― プリプロセッサ- | (25~47行目) |
― メイン関数 | (49~558行目) |
・ 本体 | (51~551行目 try{}で囲まれた部分) |
・ 例外処理 | (551~557 catch{}部分) |
と成っています。(プリプロセッサ-と例外処理の説明は省略します。)
さて、メイン関数の本体部分(51~551行目)は、大きくわけて、以下の5段階から成っています。
― 時価評価の基準日の設定 (59~76行目) | |
― 債券イールドカーブとLiborインデックスカーブの組み立て(81~366行目) | |
― PricingEngineの組み立て (376行目) | |
― ゼロクーポン債、固定金利債、変動利付債の組み立て(378~464行目) | |
― 価格、利回りなどを計算し画面出力 (470~544行目) |
前の MulticurveBootstrapping プロジェクトと同様、イールドカーブ(TermStructureクラスのオブジェクト)の組み立てに、全体コードの5割以上が使われています。
そのイールドカーブを使って、PricingEngine を組み立てますが、たった1行(376行目)で済んでいます。価格評価対象の3種類の債券は、いずれもオプション性がなく、すべて同じ DiscountBondEngine オブジェクトを使って価格評価しています。
3種類の債券は、ゼロクーポン債と固定金利債と変動利付債です。それぞれ、部品から組み立てられていますが、変動利付債は、やや複雑な部品から出来ており、それらについては以下のソースコードの解析で詳しく説明します。
Instrument(3種類の債券オブジェクト)と PricingEngine(1種類)が出来上がれば、あとは、Instrument オブジェクトに PricingEngine を設定し、価格や経過利息などを計算して画面出力しています。債券の商品オブジェクトでは、NPV()以外に、cleanPrice()、dirtyPrice()、accruedAmount()メソッドも用意されており、それぞれ”経過利子を含まない価格”、”経過利子を含む価格”、”経過利息”を計算し出力します。いずれも、債券の額面に対する%表示で返されます。 また、yield()メソッドは、内部収益率の考え方を使い、債券のクーポン支払い回数に対応した複利表示で返します。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス