1. QuantLibを使ってみる
1.2 テストプログラムを試す
1.2.3 MulticurveBootstrapping : Multi-Curveの構築
1.2.3.1 はじめに
EquityOption プロジェクトの次に、MulticurveBootstrapping プロジェクトのソースコードの解析を行いたいと思います。このプロジェクトは、PricingEngine(及びInstrument)の、最も重要な部品であるイールドカーブを、どのようにして組立てて行くかを理解する上で、恰好のプロクラム例となっています。
前のセクションの繰り返しになりますが、QuantLib を端的に説明すると、Instrument というキャッシュフローの情報を格納しているオブジェクトに、PricingEngine という価格計算のアルゴリズムを格納しているオブジェクトを組み合わせ、様々な金融商品の様々な価格計算方法を提供しているライブラリです。
ここで、金融商品の価格計算は、どのように為されるかについて、基礎編で示した基本的な式を再度示します。
\[
金融商品の価格 = \sum CashFlow_i(t_i)~×~Propability_{CF_i}~×~DiscountFactor(t_i)
\]
この式を言い換えると、金融商品の価格は、将来のキャッシュフローの期待値を現在価値に換算した値、という事になります。
式の右辺の内、\(CashFlow_i (t_i)\) の情報は、Instrument オブジェクトに格納されます。また、Cash Flowの発生確率 \(Propability_{CF_i}\) と現在価値への割引率 \(DiscountFactor(t_i)\) の情報は、PricingEngine に格納されます。PricingEngine は、右辺の計算式(アルゴリズム)の実行も担います。
前の EquityOption プロジェクトの例では、Cash Flow は確率的に発生するので、その発生確率の情報を StochasticProcess クラスから導出しました。この例で示すシンプルな金利スワップの場合、Cash Flow の発生確率はすべて 1 と看做すので、価格エンジンが必要とする情報は、Discount Factor だけです。この例では、Discount Factor を、本格的なBoostrapping+Interpolationのアルゴリズムを使って導出します。
このプログラム例では、Instrument として、VanillaSwap クラスのオブジェクトが使われ、PricingEngine として、DiscountingSwapEngine クラスのオブジェクトが使われています。VanillaSwap オブジェクトは、シンプルな金利スワップを具体化したものですが、その主要部品は、固定金利キャッシュフローと変動金利キャッシュフローになります。さらに変動金利キャッシュフローを構築するには、将来の変動金利の予想が必要になるので、変動金利インデックスのイールドカーブ(index curve)が部品として必要になります。また、PricingEngine の主要部品は、将来のキャッシュフローを現在価値に換算するための Discount Factorのカーブ(Discounting Curve)になります。
尚、このプロジェクトの解説は、既に 2019 年頃にこのサイトにあげていましたが、その後、C++11 への対応に合わせて。ソースコードの書き換えが行われており、その新しいコードをベースに解説を行います。また、前回の解説は、細部を説明しすぎて、読みにくい文章になっていたので、より簡潔に主要なポイントに絞って説明し、細部については Appendix で解説を行い、そこにリンクを張るようにしました。
イールドカーブの具体的な構築方法や、そのバリエーションについては、
- 基礎編のイールドカーブの構築方法(2) : Bootstrapping + Interpolation法で、伝統的なSingle Curve構築のアルゴリズムを紹介
- 上級編のイールドカーブ Multi-Curve対応 : Forecasting CurveとDiscounting Curveを別にした場合の構築方法
の所で簡単に説明しました。Bootstrapping + Interpolation のアルゴリズムに馴染みが無い方は、まずそちらの方をご覧下さい。
1.2.3.2 ソースコードのコンパイルと実行
“EquityOption”プロジェクトと同様、まず MulticurveBootstrapping プロジェクトのソースコードをビルドし、実行可能なバイナリーファイルを生成します。こののプロジェクトも QuantLib.sln のソリューションファイルに含まれているので、QuantLib プロジェクトと同様の方法でビルドできます。ビルド方法は既に説明済みですが、以下のポイント2.の部分に注意が必要なので、もう一度、同様の説明をします。
- まず QuantLib ディレクトリ下にある“QuantLib.sln”ファイルを開けます。すると Visual Studio が起動され、このソリューションファイルが開かれます。ソリューションエクスプローラーにある 21 個のプロジェクトのリストから、MulticurveBootstrapping プロジェクトを選択します。
- メニューバーから、
“プロジェクト(P)” → “スタートアッププロジェクトに設定(A)”
を選択します。これにより MulticurveBootstrapping プロジェクトが、21 個のプロジェクトの中で、最初に実行されるプロジェクトになります。 - ビルドする前にプロジェクトプロパティの設定をします。プロパティの設定内容は、既に解説した QuantLibプロジェクトや EquityOption プロジェクトと同じです。すなわちプロパティの設定ウィンドウから、
“構成プロパティ” → ”VC++ディレクトリ”
を選択し、インクルードディレクトリとライブラリディレクトリについて、それぞれboostへのパスを設定します。(設定方法は実践編 1.1.5.2 - プルジェクトプロパティの設定 参照) - プロパティの設定が終われば、ソリューションエクスプローラーの MulticurveBootstrapping にカーソルを合わせ、マウスを右クリックし、ビルドを選択・実行します。あるいは、メニューバーから、
“ビルド(B)” → “MulticurveBootstrappingのビルド(U)”
を選択しても同じです。 - エラー無くビルドが正常終了すれば、出力ウィンドウに成功の表示が出ます。失敗した場合、原因の大半は、boost ライブラリや、QuantLib のライブラリへのパスの設定ミスです。QuantLib ソリューションのビルドで解説した箇所を見ながら、それらのパスの設定が正しかったか、再度確認して下さい。
- ビルドが成功すれば、試しにプログラムを走らせてみます。メニューバーから
“デバック(D)” → “デバックの開始(S)”
を選択します。下記の Console 画面が出力されれば成功です。 - この Console 画面の出力を見れば判る通り、このプロジェクトでは、2種類の Plain vanilla Swap の現在価値と Fair Spread および Fair Fixed Rate の計算を行っています。また、5 年物 Swap の市場レートが、0.76% の場合と 0.9% の場合の2通りで計算しています。
(注:プログラムが終了すると同時にConsole画面も消えてしまうようであれば、メニューバーから、
”ツール(T)” → “オプション(O)” → “デバック” → “全般”
を選択し、 「デバックの停止時に自動的にコンソールを閉じる」 のチェックボックスをはずします。)
1.2.3.3 ソースコードの全体像
ソリューションエクスプローラーにある MulticurveBootstrapping プロジェクトを展開すると MulticurveBootstrapping.cpp というファイル名のソースコードファイルが現れます。それを、ブラウザーでも見られるように、htmlファイルに変換したソースコードを載せますので、それを見ながら読み進めて下さい。
さて、ソースコードは、約 500 行ありますが、その構成は、
― プリプロセッサ | 1 ~ 53 行目 | |
― main() 関数 | 57 ~ 517 行目 | |
・ 本体 | 59 ~ 508 行目 (try { } で囲まれた部分) | |
・ 例外処理 | 510~ 516 行目 (catch { } の部分) |
と成っています。(この内、プリプロセッサ-と例外処理の説明は省略します。)
さて、メイン関数の本体部分(59~517行目)は、大きくわけて、以下の4段階から成っています。
― 時価評価の基準日の設定 (63~83行目) | |
― 2種類のイールドカーブ(OISカーブとIndexカーブ)の組み立て(85~307行目) | |
― Instrument(VanillaSwapオブジェクト)の組み立て (309~362行目) | |
― PricingEngineの組立て、Instrumentへの設定、価格計算、及び画面出力(365~508) |
この内、イールドカーブの組み立てに、全体のコード数の6割程度が充てられています。2 種類のイールドカーブの内、OIS カーブ(Overnight Index Swapカーブ)は、PricingEngine の部品となり、Euribor Index カーブ(Forecasting カーブ)は、Instrument の部品となります。
この例で使われている Instrumentは、最も典型的なデリバティブズ商品である金利スワップ(Instrumentの派生クラスである VanillaSwap クラスのオブジェクト)です。それを、スポットスタートと、フォワードスタートの 2 種類生成しています。また、PricingEngine は、Plain Vanilla (シンプルな)金利スワップ用の価格計算エンジン(PricingEngineの派生クラスである DiscountingSwapEngine のオブジェクト)を使っています。それぞれ、大きな部品を使っており、部品の組み立ては大変ですが、それが出来てしまえば、あとは簡単です。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス