1. QuantLibを使ってみる
1.2 Example コードを試す
1.2.11 CDS : Credit Default Swap の価格評価
1.2.11.1 はじめに
今回は、QuantLib の Example コードの中から、“CDS” プロジェクトについて解説します。CDS は Credit Default Swap の略称で、クレジットデリバティブズの中では、最も一般的な商品です。このサイトでは、現段階で(2024年12月時点)、基礎編でも上級編でも、クレジットデリバティブズについては未だ何も解説してませんが、先に QuantLib の Example プロジェクトのソースコード解説をやります。なので、最初に、CDS の商品特性や、価格計算方法についても、簡単な解説を行いたいと思います。
はじめに、CDSの商品性を簡単に解説します。CDSは、一方の当事者が、特定の債務者のクレジットリスク(reference credit)を保証するもので、もう一方の当事者が、その保証を受ける見返りに、一定額のプレミアムを支払うものです。経済効果は保証契約とほぼ同じですが、商品名にある通り、キャッシュフローの交換であるスワップ契約(デリバティブズ契約)の形態をとります。なので契約書は、一般的に、ISDAが制定した共通の契約書フォームが使われます。
スワップ契約で発生するキャッシュフローは、
- 片方のキャッシュフローは、reference credit について何等かの credit event(デフォールトや債務リストラなど)が発生した場合、それによって発生する損失額を相手方に支払います。損失額は、保証されたみなし元本額から、債権回収額を差し引いた、ネットの損失額になります。
- もう一方のキャッシュフローは、保証料に相当するプレミアムを満期までの間定期的に支払うか、あるいは契約当初にまとめて支払うか、あるいは、それらを組み合わせて支払います。
一般的に、前者を(デフォールト)プロテクションキャッシュフロー((default) protection leg CF) と呼び、後者をプレミアムキャッシュフロー(premium leg CF)とよんでいます。
いずれのキャッシュフローも、キャッシュフローの発生確率に、Discount Factor を掛けた値で、現在価値に換算され、両者が等価になるように価格が決められます。その発生確率をどう求めるかについては、解説すると長くなるので、省略します。多くの解説書やネット記事が出ているので、そちらをご覧ください。いずれ、基礎編あるいは上級編で、詳しく解説したいと思います
また、CDS契約の特徴として、OTC derivatives ありながら、契約形態が標準化され、反対売買や契約移転などの取引がスムーズにいくように設計されています。標準形態では、CDS の満期日は、各年の、3,6,9,12月(2015年以降は、9,12月のみ)の20日と決められています。仮にその日が休日であっても、翌営業日にずらされる事はありません。これは、CDSの満期日のミスマッチが極力発生しないようにする為です。また、プレミアムキャッシュフローの支払日も、それらの月の20日と決められています(なので、年4回払い)。プレミアムキャッシュフローについては、その日が休日の場合は、翌営業日に繰り延べられますが、その休日を決めるカレンダーは、土曜日と日曜日だけが休日のカレンダーが使われます(除く日本)。これは、契約当事者の所属国のカレンダーを使うと、国によって支払日がずれる可能性があり、それを避け、支払日が全世界共通の日付になるようにする為です。OTCデリバティブズなので、もちろん、そうでない契約形態が取れない訳ではないですが、極めて稀です。
クレジットデリバティブズについては、credit event が発生すると、保証している側に巨額の資金支払いが発生するので、しばしば契約内容や文言について、法的な争いが発生します。なので、ISDA が中心となって、契約の実効性を担保する為の、色々な仕組みが整備されてきています。クレジットデリバティブズは、価格計算の為の数理工学的な側面だけでなく、契約の法的側面が非常に重要なデリバティブズ取引になります。ただ、このサイトは、デリバティブズの価格計算方法の解説がメインなので、法的側面については、解説しません。
プロジェクトのビルド
これまでのプロジェクトと同様、まず ”CDS” プロジェクトのソースコードをビルドします。
- QuantLib のディレクトリ下にあるソリューションファイル "QuantLib.sln" を開けます。すると、Visual Studio が起動され、このソリューションファイル下にあるプロジェクトがオープンされます。ソリューションエクスプローラー画面にある 21 個のプロジェクトファイルの中から、CDS プロジェクトを選択します。
- CDS プロジェクトのディレクトリを展開し、SourceFiles のフォルダーにある "CDS.cpp" をクリックすると、約 640行あるソースコードが開かれます。
- メニューバーから “プロジェクト(P)” → “スタートアッププロジェクトに設定(A)” を選択します。これで、QuantLib.sln の中で、最初に CDS プロジェクトのメイン関数が呼び出されます。
- 同じくメニューバーから、 “プロジェクト(P)” → “プロパティ(P)” を選択し、これまでのプロジェクトと同様、boost ライブラリへのパスを設定します。(実践編1.1.5 “QuantLibソリューションのビルド”の解説を参照)
- メニューバーから "ビルド" → "CDS のビルド" を選択するとビルドが開始されます。エラー無くビルドが正常終了すれば、試しにプログラムを走らせてみます。メニューバーの "デバック" → "デバックの開始" を選択し、下記のConsole画面が出力されれば成功です。
(注:プログラムが終了すると同時にConsole画面も消えてしまうようであれば、"ツール" → "オプション" → "デバック" → "全般" とし、「デバックの停止時に自動的にコンソールを閉じる」 のチェックボックスをオフにする。)
1.2.11.3 ソースコードの全体像
このプロジェクトのソースコードは、CDS.cpp になります。この解説はそのソースコードを見ながら読み進めてください。それをブラウザーでも見れるように、htmlファイルに変換したソースコードを載せておきます。
さて、ソースコードは見ての通り、約640行あります。その構成は、以下のようになっています。
― | プリプロセッサー | (1~50行目) |
― | 3種類のローカル関数の定義 | (52~604行目) |
・example01() | (52~203行目) | |
・example02() | (205~423行目) | |
・example03() | (425~604行目) | |
― | メイン関数 | (607~639行目) |
・main()の内容は上記の3種類のローカル関数を呼び出すだけ |
この構成は、これまでのプロジェクト例と異なり、テストの為のコードが、main()関数の中では無く、ローカル関数の中に記述されています。まあこれは、作成者の好みの問題なので、どちらでもいいでしょう。
テスト内容を記述している3種類のローカル関数は、作成時期と作成者が異なっているようです。また、コード中に不要なオブジェクトが作成されている部分もあり、作成者の意図がよく解からない部分もあります。ただ、プロジェクト全体としては、これまでの例と同じく、商品オブジェクトと価格エンジンを、それぞれ部品から組み立てて、最後に価格を計算しています。その過程で、最も重要な部品であるイールドカーブとクレジットカーブが作成され、それぞれのカーブのPillarにおける値を画面出力しています。
特に、イールドカーブとクレジットカーブの構築については、ISDA Standard Model で定義されている構築方法(Bootstrapping-Interpolationのアルゴリズム)が使われており、その理解の一助になると思います。ISDA Standard Modelについては、OpenGamma 社が出している文書が詳しいので、それを参考にして下さい。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス