1. QuantLibを使ってみる
1.2 Example を試す
1.2.7 Gaussian1dModels : Gaussian Short Rate Model と Markov Functional Model
1.2.7.1 はじめに
前回と前々回のプログラム例(”CallableBonds” と “BermudanSwaption”)で、Short Rate Modelを使った、バーミューダンタイプの金利オプションの価格計算方法をみてきました。
今回のプログラム例でも同様にバーミューダン・スワップションの価格評価を行いますが、今回は特に、
- 汎用的な Hull-White Model である One Factor Gaussian Short Rate Model(GSR) と
- Markov Functional Model(マルコフ汎関数モデル“MFM”)
を使って
- 通常のスワップを対象資産とするバーミューダン・スワップション と
- Constant Maturity Swap(CMS)を対象資産とするバーミューダン・スワップション
の、2種類のデリバティブズの価格評価方法を見て行きます。この例では特に、モデルパラメータの calibrationの手続きを何度もテストしているので、そこに焦点を当てて解説したいと思います。また、a,b,いずれのケースも、前回、前々回と異なり、将来の金利の分布の予想に使われるイールドカーブ(forecasting Curve)と、Payoffを現在価値に割り引く為のイールドカーブ(discounting curve)を、それぞれ別のカーブを使って価格計算を行っています(いわゆるマルチカーブ対応です)。forecasting curve と discounting curveが大きく異なると、価格に少なからず影響を与えるので、それもテストされています。
ちなみに、(1次元の)Gaussian Short Rateモデル(以下”GSR”)とは下記の確率微分方程式で表現される、瞬間短期金利 \(r\) の拡散過程を記述したモデルです。
\[ dr=\left[θ(t)-α(t)r(t)\right]~dt+σ(t)~dw(t) \]式を見ての通り、このモデルは、Hull-White Model の中心回帰強度 \(α\) とボラティリティ \(σ\) を、定数ではなく、関数(piecewise constant(階段)関数)と看做したものです。なので、このモデルは Generalized Hull-White(汎用Hull-White Model)とも呼ばれています。拡散項係数を piecewise constant 関数にした事により、Volatilityの期間構造を柔軟に表現でき、市場で観測されるVolatility 期間構造にフィットしやすくなります。
(注 : QuantLib の Short Rate Modelのクラス階層を見ると、Generalized Hull-Whiteモデルのクラスも用意されています。そのクラスと、このGSRクラスの違いは、よく分かりません。)
一方、Markov Functional Model(マルコフ汎関数モデル、以下“MFM”)は、ニュメレールとなるゼロクーポン債価格を確率変数と看做すモデルです。1ファクターモデルでありながら、ベンチマーク商品(ヨーロピアンスワップション)の Volatility 期間構造と、Volatility スマイルの形状に、うまくフィットできるので、実務界で広く使われるようになりました。但し、モデルの calibration の手続き(アルゴリズム)は、非常に難解で複雑なので、理解するのは容易ではありません。
(注 : MFM は、他のモデルと比べ、かなり異質なモデルで、個人的には厳密な意味のモデルとは呼べない思っています。その点も含め、MFM の詳細については、上級編 "マルコフ汎関数モデル"で解説しているので、参考にして下さい。但し、難解です。)
このプログラム例では、いずれのモデルも、BasketGeneratingEngine クラスのオブジェクトの部品となります。この価格エンジンの特徴は、モデルの calibration 用に、Calibration Helper の配列(Basket)を自動生成(Generating)する機能を持っている事です(クラス名からしてそれを彷彿させます)。そして、Calibration された "モデル+価格エンジン" を使って、NonStandardSwaption クラスの商品オブジェクト(具体的には金利スワップを対象資産とするバーミューダン・スワップションと、CMS を対象資産とするバーミューダン・スワップション)の価格計算を行っています。
この2つのクラスは、QuantLib ライブラリの中では、若干特殊なクラスで、汎用的なモデルライブラリとして作られたのではなく、ある特殊な用途の為にカスタマイズされたクラスのように見受けられます。なので、このプロジェクトは、QuantLib が用意したライブラリの使い方を学ぶと言うより、QuantLib を使って、新たなクラスをカスタマイズする方法を学ぶためのプロジェクトと見た方がいいかも知れません。
(注:カスタマイズされたクラスに見える理由は、BasketGeneratingEngine クラスが持つ関数の中に、データがハードコードされた部分が見受けられるからです。それもあってか、QuantLib の Reference Manual に、このクラスは載っていません。これは、後でこのクラスをユーザーが応用して使う事を想定していないという事でしょう。但し、GitHub で公開されている、技術者用の Reference Manual には記載があります。なので、このクラスの詳細な情報は、こちらで確認できます。
QuantLib: BasketGeneratingEngine Class Reference )
このプロジェクト全体で、BasketGeneratingEngine クラスのオブジェクトと、NonStandardSwaption クラスのオブジェクトが何度も使われているので、それぞれのクラスの解説を、Appendix-1 に載せておきます。
このプログラム例の解説は。2021年頃にサイトに掲示していましたが、その後 C++11 へ準拠する為に、若干の変更が加えられました。改変後のコードで、随所に出てくる変数宣言“auto”や、namespace である“ext::”は、C++11 対応によるものです。これらについては 既に auto type について や ext:: namespaceについてで既に解説しています。また、前回の解説を見ると、だらだらと長く非常に読みづらかったので、解説を全面的に書き直しました。今回は、いくつかのパートに分けて、それぞれコードの解析だけにフォーカスして簡潔にしました。モデルの理論面の解説や、重要なクラスの詳細な説明は、上級編の別のセクションや、Appendixで別途解説するようにしました。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス