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 プロジェクトを選択します。その手順は以下の通りです。 

  1. まず QuantLib ディレクトリ下にある“QuantLib.sln”ファイルを開けます。すると Visual Studio が起動され、このソリューションファイルが開かれます。ソリューションエクスプローラーにある 21 個のプロジェクトのリストから、Bondsプロジェクトを選択します。
  2. メニューバーから、“プロジェクト(P)” → “スタートアッププロジェクトに設定(A)”を選択します。これにより Bondsプロジェクトが、21個のプロジェクトの中で、最初に実行されるプロジェクトになります。

ここからの、ビルド方法は、こでまでのセクションで何度か解説しているので、そちらを参考にして下さい。そこで解説した通り、Boostライブラリへのパスの設定を忘れずに行って下さい。 

ビルドが成功すれば、試しにプログラムを走らせてみます。メニューバーから“デバック(D)” → “デバックの開始(S)”を選択します。下記のConsole画面が出力されれば成功です。 

Bonds プロジェクトのアウトプット画面

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の表示が義務付けられているので、添付します。   ライセンス

目次

Page Top に戻る

// // //