1. QuantLibを使ってみる
1.2 Example を試す
1.2.5 CallableBonds : Call Option付き債券の価格評価
1.2.5.1 はじめに
4番目のプログラム例として、CallableBonds プロジェクトのソースコード解析を行いたいと思います。このプロジェクトでは、Hull-White モデルを使って、Call オプション付き固定金利債の価格を求めています。
固定金利債で、Call Option や Put Option が付いているものは、事業債ではよく見かけます。債券の Call Option とは、発行体が、任意で債券を中途償還できる権利であり、Put Option は逆に投資家側から中途償還を請求できる権利です。発行体は、調達金利が低下してより安いコストで借換えができる場合に、Call Option を行使します。発行体の調達コストは、事業債の場合は一般的な市場金利に加え、発行体のクレジットスプレッドの影響も受けるので、Call Option は本来、金利と、クレジットスプレッドに依存するオプションになります。従って厳密な価格計算をしようとすると、両方の確率変数を勘案したモデルが必要になります。しかしそれでは、相当複雑なモデルになり、さらにクレジットスプレッドのVolatilityデータが必要になります。ところが、クレジットスプレッドVolatilityのデータは、限られた少数の銘柄でしか得られず、そのデータが得られない銘柄では使えません。従って、実務慣行としては、金利オプションの部分にのみ着目したモデルで価格計算を行うのが一般的です。
失礼しました。これは正確な言い方ではありません。債券の場合は、通常、価格は市場で決定されるので、まず価格ありきです。デリバティブズのように、価格計算アルゴリズムにパラメータを与えて、価格を計算する訳ではありません。実務では、まず市場価格が与えられて、そこから、何等かの金利オプションモデルを使ってオプション価値を計算し、そのオプション価値を調整した後の利回りとクレジットスプレッド(OAS:Option Adjusted Spread)を計算します。投資家は、その OAS を、他の似たようなクレジットリスクを持つ債券と比較して、投資の判断基準とします。
ところが、このプロジェクトでは、OAS を計算するアルゴリズムをテストするのではなく、デリバティブズの価格計算と同じように、パラメータを外生的に与えて、そこから価格計算する方法をテストしています。QuantLib のライブラリーを覗くと、OAS を計算するメソッドも備わっているようですが、ここではそれに触れません。いずれにしても、Call Option 付きの固定金利債券の金利オプション価値をどのように計算するかが重要なので、そこにフォーカスして説明したいと思います。
尚、このプロジェクトの解説は、既に2021年頃にこのサイトにあげていましたが、その後、C++11への対応に合わせて。ソースコードの書き換えが行われており、その新しいコードをベースに解説を行います。また、前回の解説は、細部を説明しすぎて、読みにくい文章になっていたので、より簡潔に主要なポイントに絞って説明し、細部についてはAppendixで解説を行うようにしました。
1.2.5.2 ソースコードのコンパイルと実行
これまでの例と同様、まずCallableBondsプロジェクトのソースコードをビルドし、実行可能なバイナリーファイルを生成します。まずQuantLib.slnファイルからCallableBondsプロジェクトを選択します。その手順は以下の通りです。
- まず QuantLib ディレクトリ下にある“QuantLib.sln”ファイルを開けます。すると Visual Studio が起動され、このソリューションファイルが開かれます。ソリューションエクスプローラーにある21個のプロジェクトのリストから、CallableBonds プロジェクトを選択します。
- メニューバーから、“プロジェクト(P)” → “スタートアッププロジェクトに設定(A)”を選択します。これによりCallableBondsプロジェクトが、21個のプロジェクトの中で、最初に実行されるプロジェクトになります。
ここからの、ビルド方法は、QuantLib.slnファイルのビルド、EquityOptionプロジェクトのビルド、の所で何度か解説しているので、そちらを参考にして下さい。そこで解説した通り、Boostライブラリーへのパスの設定を忘れずに行って下さい。
ビルドが成功すれば、試しにプログラムを走らせてみます。メニューバーから“デバック(D)” → “デバックの開始(S)”を選択します。下記の Console 画面が出力されれば成功です。
(但し、プログラムが終了すると同時にConsole画面も消えてしまうようであれば、メニューバーから、ツール→オプション→デバック→全般を選択し、「デバックの停止時に自動的にコンソールを閉じる」のチェックボックスをはずします。)
1.2.5.3 ソースコードの全体像
ソリューションエクスプローラーにある CallableBonds プロジェクトを展開すると CallableBonds.cpp というファイル名のソースコードファイルが現れます。それを、ブラウザーでも見られるように、htmlファイルに変換したソースコードを載せますので、それを見ながら読み進めて下さい。
ソースコードは約 300 行あります。その構成は、下記のようになっています。
― プリプロセッサ- | (24~38行目) |
― ローカル関数の定義 | (43~68行目) |
― メイン関数 | (71~311行目) |
・本体 | (73~303行目 try{}で囲まれた部分) |
・例外処理 | (305~310行目 catch{}部分) |
上記にある通り、これまでの例では無かった、ローカル関数の定義があります。ソースコードを見ればわかる通り、flatRate()と呼ばれる関数を2通り(オーバーロード関数)定義しています。この関数は、このプロジェクト内でしか使えない、テスト用の関数です。
メイン関数の本体部分は、これまでの例と同じく、商品(Instrument)オブジェクトと価格エンジン(PricingEngine)オブジェクトを、それぞれ部品から作り上げています。商品オブジェクトは、Callオプションの付いた固定金利債で、CallableFixedRateBondクラスのオブジェクトを生成しています。また価格エンジンは、Hull Whiteモデルの確率過程を、3項Treeで離散的に近似したアルゴリズムを使っています。
最後に、モデルに投入するVolatilityの値を5通り用意し、それぞれの計算結果を、Bloombergの計算結果と比較しています。概ね、近い値が出ているのが判ります。Hull-Whiteモデルを使っているので、シナリオにあるVolatilityは、ガウス分布におけるVolatilityであり、Black Modelで使われる対数正規分布のVolatility(いわゆるBlack Vol.)ではありません。そうすると、金利の(変化率ではなく)絶対水準が、1年で(1×標準偏差の信頼区間で)上下3%~12%変動するとの最後の3つのシナリオは、あまり現実的ではありません。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス