1. QuantLibを使ってみる
1.2. Exampleを試す
1.2.1 イントロダクション
以下のセクションでQuantLibが用意している、いくつかのプログラム例を使って、QuantLibが、どのようなライブラリーで、そこで用意されている様々なオブジェクトを、どのように使うかを、解説していきたいと思います。但し、読まれる方が、C++と、オブジェクト指向プログラミングについて、基本的なシンタックスとプログラミング技法を理解されている前提で話をすすめます。そこが、全くの初心者の方は、まずC++を学ぶために、数週間から数カ月時間をかけ、その後に戻ってきて下さい。その土台が無いと、何を説明しているのか全く理解できないと思います。
QuantLibを具体的に使っていくためには、まずQuantLibがどういうものかを理解しておく必要があります。QuantLibのWebページのDocumentationの所に、いくつか参考となる書籍、サイト、ビデオなどが紹介されています(但し、すべて英語です)。GoogleでQuantLibを解説している日本語のサイトを探してみましたが、殆ど見つかりませんでした。
英語の解説では、開発チームの主要メンバーであるLuigi Ballabio氏が書いた“Implementing QuantLib”が、最も詳しいかと思います。Ballabio氏のWebサイトで公開されている他、LeanPubでも手に入ります。また、その日本語訳を、本人の了解を得て、実践編の、次のChapterに載せています。但し、その内容は、主要なモジュールの設計方法に関するもので、具体的な使用法を解説するものではありません。
また、Dimitri Reiswich氏も、主要なモジュールやクラスについて解説しています。
QuantLib Introduction, Part IQuantLib Introduction, Part II
具体的な使い方については、Felix Lee氏がビデオ形式でYou Tubeに公開しているものが、初心者向きで解りやすいと思います(但し、英語です)。
Introduction to QuantLib, Screencasts
という事で、英語の解説ではどうも判りにくいという方のために、QuantLibとは、どういったものかを簡単に説明します。一言で言えば、様々な金融商品の「価格計算アルゴリズム」のライブラリです。その機能を提供するために、15~20のモジュールと、それらを支える 1000以上のクラスが用意されています。
全体像を俯瞰する為に、QuantLibのReference Manualから、モジュールリストを抜き出しました。
たくさんありますが、中心となるモジュールは、“Financial Instruments”と “Pricing Engines” の2つです。QuantLibとは何かを、誤解を恐れず極めてシンプルに言えば、様々なFinancial Instruments(オブジェクト)に、対応するPricing Engines(オブジェクト)を組み合わせて、価格計算を行う機能を提供しているライブラリです。他のモジュールは、メインとなるこの2つのオブジェクトに、部品を提供するモジュールであったり、Design Patterns、Numeric types、QuantLib macrosといった、ライブラリ全体の環境設定、変数定義、設計方法に関するモジュールです。
ここで、基礎編の冒頭で紹介した、金融商品の価格計算式を再度記載します。
\[ 金融商品の価格 =\sum CashFlow_i (T_i) \times Probability(CashFlow_i) \times DiscountFactor(T_i) \]基礎編で、すべての金融商品は Cash Flowの集合であると述べました。そして、その価格はどのような商品であっても基本的に上の式で求まると述べました。金融商品の定義や価格計算方法を、このように抽象化・一般化して考えるのは、オブジェクト指向プログラミングにとっては極めて重要です。キャッシュフロー計算、確率計算、割引率計算などの役割を、それぞれ汎用的なベースクラスでカプセル化し、それらが協働して、ひとつの目的(価格計算)を達成するような仕組みを構築しておけば、派生クラスで、多様な商品や、様々な価格計算アルゴリズムを実装する事により、拡張性の高い価格モデル・ライブラリーが構築できます。
これを QuantLib に置き換えると、Cash Flowsの情報を保持しているのがFinancial Instrumentで、Probability、Discount Factor、およびその他の計算しているのがPricing Engineになります。そして、価格計算は、この2つのオブジェクトが協働して行います。
Financial Instrumentsモジュールの中で、様々な金融商品のオブジェクトモデルが定義されています。下記のQuantLibのサイトから、このモジュール下で定義されている商品のクラスを、いろいろクリックしてみて下さい。
Financial Instrumentsモジュールで定義されている金融商品のクラス例えば、Swapクラスをクリックし、さらにその派生クラスとの継承関係(Inheritance Diagram for Swap)をクリックすると、以下のようなダイアグラムが表示されます。
Swapという大きな商品のカテゴリーの中に、様々なバリエーションがあり、それぞれ派生クラスで定義されている事が分かります。他の商品クラスでも同様に、大きな商品カテゴリーの下で、様々な派生クラスが定義されているので、チェックしてみて下さい。相当多様な商品をカバーしている事が分かります。そして、これらすべてのクラスのベースクラスとして、Instrumentクラスがあり、さらにそのベースクラスとしてLazyObjectクラスが定義されています。LazyObjectやInstrumentsが提供している、全商品に共通の機能については、おいおい説明していきます。
Financial Instruments(金融商品)に含まれる各クラスは、それぞれの商品の「キャッシュフロー額」と「期日」を特定できる情報を持っています。Swapであれば、2つのキャッシュフローの”Leg”クラスが、その情報を提供しています。またOptionクラスであれば、"Payoffクラス"と"Exerciseクラス"が、行使時のキャッシュフローと期日を特定します。このように、Financial Instruments は、キャッシュフロー額と期日を特定する為の、様々なオブジェクト(部品)を組み立てて作られます。さらに、部品オブジェクト自体も、より細かな部品オブジェクトから作られています。例えば、上記の“Leg”クラスは、個別のキャッシュフローの情報を持つ”CashFlow”オブジェクトの集まりです。
これらのクラスは、工場で物を生産する際の、型枠に相当します。これらの型枠を使って、まず具体的な部品(インスタンス)を作ります。そして、その部品をコンストラクターで組み立てる事によって、具体的な金融商品の完成品(インスタンス)が出来上がります。従って、QuantLibを使いこなすには、Financial Instrumentsで定義されている各商品が、どのような部品から出来ているのか、また各部品が、さらにどのような部品で出来ているのかを理解するのが必須です。
Pricing Engineも同様に、様々な部品を組み合わせて作ります。Financial Instrumentsの部品が、キャッシュフローを特定するための情報であったのに対し、Pricing Engineの部品は、基本的に、様々な「計算アルゴリズム」をカプセル化したクラスになります。金融商品の基本価格式を見れば判る通り、Discount Factorを計算するアルゴリズムが、主要部品になるだろうという事は、容易に推察できるでしょう。実際にその通りであり、全てのPricing Engineは、金利の”Term Structureクラス”、すなわちイールドカーブが主要部品になります。また、オプションであれば、Probabilityの計算が必要になるので、確率過程を記述する”Stochastic Process”オブジェクトも主要部品になります。
これらの主要部品も、さらに細かな部品から出来ています。例えば、Term Structure(イールドカーブ)は、Rate Helperと呼ばれる市場データを保持する部品と、Interpolationの方法(アルゴリズム)をカプセル化した部品から出来ています。Interpolationの方法には、様々な種類があり、QuantLibで用意された部品のリストから選択できるようになっています。あるいは、ユーザーが独自で開発したInterpolationの方法があれば、そのアルゴリズムをカプセル化し、新しいInterpolationクラスを定義でき、それを部品として使う事もできます。
Financial InstrumentsとPricing Engineの関係性については、ひとつの金融商品について複数の価格計算方法が存在し得る点に留意が必要です。シンプルなヨーロピアンオプションであっても、Black-Scholesの公式(解析解)を使う方法や、2項モデル、数値積分を使った方法などがあります。従ってQuantLibでは、同じ金融商品であっても、複数のPricing Engineが使えるような仕組みが構築されています。すなわち、個別のFinancial Instrumentの価格計算において、Pricing Engineオブジェクトを取り替える事が可能になっています。その場合でも、すべてのFinancial Instrumentsオブジェクトに共通するメソッド NPV() を呼び出せば、価格計算を行い、その結果が返ってきます。価格計算が可能になれば、同じアルゴリズムを使って、リスク量(Sensitivities)の計算も出来るので、それを計算するメソッド群も、共通のインターフェースとして用意されています。
この大きな枠組みを念頭において、以下の具体的なExampleの解析を通して、QuantLibをどのように使っていくのかを説明して行きたいと思います。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス