1. QuantLibを使ってみる
1.2 テストプログラムを試す
1.2.2 EquityOption プロジェクト : シンプルな株式オプションの価格計算
1.2.2.1 はじめに
最初に紹介するプログラム例として、“EquityOption”プロジェクトを選びました。イントロダクションで説明した通り、QuantLibの機能を端的に説明すると、
- Instrument(金融商品)というオブジェクトに、
- Pricing Engine(価格計算エンジン)というオブジェクトを組み合わせ、
- 様々な金融商品の価格計算アルゴリズムを提供しているライブラリです。
このプロジェクト(Example)は、その仕組みが最も解りやすい例かと思います。この2つの中心となるオブジェクトは、それぞれ必要な部品を組み立てて作りますが、部品自体もさらに細かなパーツを使って組み立てます。そういった様子がこのExampleのソースコードを見ればよく解ると思います。
尚、この解説は、当初 2019 年頃に Web に掲載したものを、その後の QunatLib のバージョンアップにより見直したものです。現在のバージョン(QuantLib 1.32)は、C++11 への移行が為されており、新たなシンタックスや標準テンプレートライブラリが使われています。また例で使われている価格エンジンについても、前回解説に使った古いバージョン(QuantLib 1.21)から変更されています。
さらに、前回Webにあげた解説を読み直すと、細部の解説が多くて要点がまとっておらず非常に読みづらいので、もう少し読みやすくなるように修正しました。コードの説明は要点に絞り、QuantLibで定義している様々なクラスや、変数型や、定数や、デザインパターンなどの細部の説明は、Appendixでまとめて、そこにリンクを張って、そこに飛べば説明があるという形にしました。
1.2.2.2 ソースコードのコンパイルと実行
まず EquityOption.vcxproj のソースコードをビルドし、実行可能なバイナリーファイルを生成します。
すでに、前のセクションで、"QuantLib.sln" のソリューションファイルから "EquityOption プロジェクト"のビルドの方法を解説しました。そこで既にビルド済であれば、そのまま実行可能です。でなければ、そのセクションに従ってビルドして下さい。
ターゲットの構成は、Debug モードでも Release モードでもかまいませんが、Debug モードの方が、ソースコードの内容をチェックするのに便利です。ビルドの際は、boost ライブラリへのパスの設定などが正しく行われているか、よく確認して下さい。
エラー無くビルドが正常終了すれば、試しにプログラムを走らせてみます。メニューバーから "デバック" → "デバックの開始" を選択します。下記の Console 画面が出力されれば成功です。
(注:プログラムが終了すると同時にConsole画面も消えてしまうようであれば、
"ツール" → "オプション" → "デバック" → "全般" を選択し、
「デバックの停止時に自動的にコンソールを閉じる」 のチェックボックスをはずします。するとConsole画面が残るようになります。
Release モードでビルドする場合は、ソースコードの最後にある return 0; の手前に system(“pause”); というコードを付け足せば、同様の効果が得られます。)
この画面出力を見れば判る通り、このExampleでは、3種類の行使タイプの株式オプション価格を、21種類の価格計算エンジンを使って算出しています。
1.2.2.3 ソースコードの全体像
このプロジェクトのソースコードは、EquityOption.cpp になります。ソリューションエクスプローラーからEquityOptionプロジェクトを選択すればそのディレクトリ下に出てきます。この解説はそのソースコードを見ながら読み進めてください。それをブラウザーでも見れるように、htmlファイルに変換したソースコードを載せておきます。
さて、ソースコードは見ての通り、約400行あります。その構成は、 次のようになっています。
― プリプロセッサ | 1 ~ 44 行目 | |
― main() 関数 | 46~ 402 行目 | |
・ 本体 | 48 ~ 397 行目 (try { } で囲まれた部分) | |
・ 例外処理 | 397~ 402 行目 (catch { } の部分) |
一般的なプリプロセッサーの役割や例外処理については、Microsoft のチュートリアルなどを参考にして下さい。ただ、プリプロセッサーの段階で行われる QunatLib 特有の環境設定やマクロ設定があります。これらについては、後程どこかのセクションで解説する予定ですが、当面は QuantLibの環境設定の解説ページ などを参考にして下さい。
ではmain()関数本体ですが、おおまかに以下の3つの段階で構成されています。
― Instrument と PricingEngine の部品を生成している部分 |
― 部品を使って、Instrument と PricingEngine を組み立てている部分 |
― 組み立てられたオブジェクトを使って、価格計算を行い、その結果を出力している部分 |
この EquityOptionプロジェクトで生成される Instrumentオブジェクトは、対象資産が1個の株式オプションで、次の 3 種類の行使タイプのものです。
― ヨーロピアンオプション |
― バーミューダンオプション |
― アメリカンオプション |
Instrument オブジェクト(金融商品)のメインの部品はキャッシュフローの情報です。オプションの場合、それはオプションの行使日とPayoff関数になりますが、QuantLibでは、それらをExerciseクラス(の派生クラス)とPayoffクラス(の派生クラス)で定義しています。具体的なオプション取引条件を使って、それらのクラスを具体化(そのクラスの型を持つ変数(オブジェクト)を生成)すれば、部品が出来上がります。
また、この Example で使われている価格エンジンは 21 種類ありますが、おおまかに分類すると以下の通りです。
― 解析解でオプション価格を求めるエンジン |
― 数値解でオプション価格を求めるエンジン (これは、さらに以下の 4 種類に分類できます) |
・ 数値積分法 |
・ 有限差分法 |
・ 二項モデル |
・ モンテカルロシミュレーション |
価格エンジンのメインとなる部品はイールドカーブです。商品がオプションの場合、さらにキャッシュフローの発生確率を導出する為のオプションモデル(対象資産価格の確率過程を記述した確率偏微分方程式)が必要になります。これらの部品は、TermStructureクラスのオブジェクトとStochasticProcessクラスのオブジェクトとして提供されます。
Instrument と PricingEngineオブジェクトのメインの部品は、さらに小さな部品オブジェクトから組み立てられます。ソースコードの大半は、こういった様々な部品の組み立てにあてられています。
以上を念頭に、ソースコードをもう少し詳しく見ていきます。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス