1. QuantLibを使ってみる
1.2. テストプログラムを試す
1.2.1 イントロダクション
QuantLib を使ってみる前に、QuantLib がいったいどいうものか、全体像を理解しておくと、使い方を学んでいく上で、何かと参考になるかと思います。QunatLib を一言で表現すると、何度も繰り返しになりますが、
- 様々な金融商品の価格計算アルゴリズムを
- C++言語を使って
- オブジェクト指向プログラミングの手法でクラス階層に抽象化した
- オープンソース・ライブラリです。
これだけだと、まだ具体的なイメージが沸かないと思いますので、もう少し詳しく説明します。
< Instrument Class と PricingEngine Class >
かなり単純化して述べますが、QuantLibが究極的にやろうとしている事は、様々な金融商品の価格計算です。その様々な金融商品は、“Instrument”(金融商品)という名前のベースクラスとして抽象化されており、そこから派生したクラスで、多種多様々な金融商品が定義されています。
一方、価格計算は、“PricingEngine”(価格計算エンジン)という名前のベースクラスで、すべての価格計算アルゴリズムが抽象化されています。そして、そこから派生するクラスで、個別の金融商品ごとの、様々な価格計算アルゴリズムが具体的にプログラムされています。
価格計算を行うには、具体的なInstrumentのオブジェクトに、その商品に対応する価格エンジンオブジェクトを組み込んで、価格計算の命令を呼び出します。価格が計算できれば、リスク量も計算できるので、同様の機能を使ってリスク量を計算する事もできます。
QuantLibのReference Manualから、InstrumentとPricingEngineクラスから、様々なクラスが派生していく様子が分かるダイアグラムが得られるので、その一部を下記に載せます。
< Instrument Class の階層構造 >
(注 : QuantLib の Reference Manual にある Instrument Class の仕様ページにあるInheritance Diagram for Instrument という項目をクリックすると、上記ダイアグラムの全貌が出てきます。)
< PricingEngine Class の階層構造 >
(注 : QuantLib の Reference Manual にある PricingEngine Class の仕様ページにあるInheritance Diagram for PricngEngine という項目をクリックすると、上記ダイアグラムの全貌が出てきます。)
見ての通り、金融商品(特にデリバティブズ)の種類やバリエーションは膨大で、さらにそれらの価格計算アルゴリズムは、ひとつの金融商品に複数存在するので、膨大な数のクラスが必要になります。ただ、それを、たった2種類のベースクラスを元に、階層構造で抽象化する事により、価格計算という機能が、統一されたインターフェースを使って実行できる仕組みになっています。
< Instrument と PricingEngine を、部品から組み立てる >
さて、Instrument(金融商品)の価格を計算するには、その Instrument のキャッシュフローの情報が必要になります。キャッシュフローは、債券やスワップであれば、クーポンキャッシュフローの形をとり、オプションであれば、行使日の Payoff の形を取ります。Instrument の具体的なオブジェクトは、こういったキャッシュフローの情報を部品とみなし、部品を組み立てて作っていくイメージです。さらにキャッシュフローも大きなオブジェクトなので、それ自体、もっと小さな部品から組み立てて行きます。部品は、商品によってまちまちですが、QuantLib は、大きな部品から小さな部品まで、様々な部品をクラスとしてカプセル化して提供しています。
金融商品の価格計算には、キャッシュフローを現在価値に割り引くためのイールドカーブの情報が必要です。また、商品がオプションであれば、キャッシュフローの発生確率の情報が必要で、それはオプションモデルを使って導出します。PricingEngine の主要部品は、このイールドカーブの情報と、オプションモデルの情報になります。さらに、金融商品の価格計算アルゴリズムは、商品によって多種多様で、かつ同じ商品でも複数のアルゴリズムが存在します。例えば、ヨーロピアンオプションの価格計算方法はBlack Scholesの公式のような解析解によるものもあれば、数値積分や、有限差分法や、モンテカルロシミュレーションといった、数値解を導出する方法があります。そういった様々なアルゴリズムも部品になります。数値解のアルゴリズムは複雑で、非常に大きな部品になるので、それ自体、より小さな部品から組み立てていきます。それらの大小の部品を組み立てて、個々の PricingEngine を作り上げるイメージです。
このように、すべてのオブジェクトをカプセル化し、それを組み立てて、より大きなオブジェクトを作り上げるというのが、オブジェクト指向プログラミングの特徴のひとつです。
QuantLib では、1500 以上のクラスが、クラスライブラリーとして提供されていますが、その大半が、Instrument と PricingEngine の派生クラスと、それらのオブジェクトを構築するのに必要な部品のクラスです。それ以外のクラスは、環境設定とか、デザインパターンを使う為のクラスなど、プログラムを効率的かつ安全に動かすためのサポート機能を提供するクラスになります。また、標準テンプレートライブラリや、boostライブラリからも、部品の提供を受けています。
Instrument と PricingEngine を部品から組み立てると言っても、それぞれにどのような部品が必要になるかは、具体的な商品ごと、あるいは具体的な価格計算アルゴリズムごとに異なります。どのような部品が必要になるかは、各クラスのコンストラクターが、おおまかな設計図になります。ただそれだけでは十分でなく、部品を正しく組み立てていくには、個別の金融商品の属性に関する知識(実務知識)と、様々なタイプのイールドカーブ、オプションモデル、価格計算アルゴリズムに関する金融工学の知識が必要になります。
次のセクション以降で、これらのクラスを使って、Instrument オブジェクトと PricingEngine オブジェクトを、どのようにして組み立てて行くかについて、QuantLib が提供している様々な Examples(プログラム例)を使って、解説していきます。最初から、すべてを理解している人はいないので、これらのプログラム例から、使い方に馴染んでいって下さい。
< QunatLib を学んでいくための参考資料 >
QuantLibがどういったものなのか、あるいは、どうやって使うかについては、次のようなサイトでも参考情報があります。
QuantLibのReference Manual :QuantLib プロジェクトの全体像や、QunatLib が提供している 1500 以上のクラスについて、簡単なクラスの解説、クラスの階層構造、コンストラクター、メンバー関数、メンバー変数などの定義内容などの情報が得られます。
Implementing QuantLib : Luigi Ballabio氏(QuantLib開発チームの主要メンバー)による、QuantLib開発における設計思想などを取りまとめた書籍(Leanpubによるオンライン書籍として提供)
この書籍の日本語訳 (私自身の訳です。Leanpubで提供)
QuantLib Python Object Building Documentation : David Duarte 氏による、QuantLib を Python上で使う方法の解説(建設中)
QuantCollege :日本語での解説も最近見つけました
具体的な使い方については、Felix Lee氏がビデオ形式でYou Tubeに公開しているものが、初心者向きで解りやすいと思います(但し、英語です)。
Introduction to QuantLib, Screencasts
他にも、いろいろあるようですが、古いバージョン時代に書かれたものでアップデートされていないものも多く、その辺を注意しながら参考にして下さい。
<ライセンス表示>
QuantLibのソースコードを使う場合は、ライセンス表示とDisclaimerの表示が義務付けられているので、添付します。 ライセンス