【QuantLibの使い方】第１回：インストールの方法

#はじめに

本記事は私の運営する個人メディア [Quant College に書いた記事](https://quantcollege.net/library-quantlib-introduction-1-install)と同じ内容になります。

##QuantLibとは

QuantLibは金融商品のプライシング（時価評価）のオープンソースライブラリである。主な機能はデリバティブや債券の時価評価、リスク指標の計算である。言語はC++で開発されており、管理人はLuigiを筆頭に何人かいるようだが、主に欧州を中心に開発が行われたようだ。

内容としては、必ずしも実務でそのまま使えるようなものではないが、実務家にとっても場合によっては、モデルの実装方法やクラス設計の参考になると思われる。海外の学生の中には、モデルの実装方法に加え、C++のクラス設計やデザインパターンの勉強に使っている人も結構いるようだ。

このQuantLibを外から呼び出すラッパーも開発されており、よく使われているのはPythonラッパーのQuantLib-Pythonである。Excelからアドイン関数として呼び出すQuantLibXLもある。
そのほか、

* Javaに翻訳したもの：JQuantLib
* C#に翻訳したもの：QLNet
* Python/Cythonで翻訳したもの：PyQL
* Rに翻訳したもの：RQuantLib

などがある。他にもJulia, Haskell, F#など少々マイナーな言語に翻訳するプロジェクトもある。

QuantLibを拡張することで作られたオープンソースとして、ORE (Open source Risk Engine) というものもある。これはCVAなどのXVA計算や、シナリオ生成、VaR計算、ストレステストなどにも使えるようだ。

##前提

* Windows10, 64bit
* Visual Studio Community 2019
* Boost 1.74.0
* QuantLib 1.19

##インストールの流れ

* C++の統合開発環境（Visual Studio）のインストール
* Boostのインストール
* QuantLibのインストール
* 正しくインストールできたかテスト

上記の通り。統合開発環境をマルっとインストールすればC++の標準ライブラリが一緒に付いてくる。QuantLibは外部ライブラリとしてBoostしか使っていないため、Boostをインストール後、QuantLibをインストールする。最後に、正しくインストールできたか確認するために、外部からQuantLibを使う別プロジェクトをビルドして動かしてみる。

##Boostについて

BoostはC++の準標準ライブラリのようなもので、膨大な数の便利機能を提供してくれる。Boostの一部機能はしばらくすると標準ライブラリにも導入される。いわば標準ライブラリに導入される前の実験台のような位置づけでもある。

新しいバージョンのC++をインストールしていれば、Boostの一部機能は標準ライブラリからも使える。しかしQuantLibでは古いバージョンのC++でも動くように対応するため、最新バージョンのC++であれば標準ライブラリに入っているような機能でも、QuantLibのコード上ではBoostから呼び出していたりする。

##ハマりやすいポイント

ハマりやすいポイントがいくつかあるが、以下の点に気を付ければうまくいくはずだ。

* 自分のVisual Studioのバージョンが、落としてきたBoostのlibファイルとそろっているかを確認する
* 自分のVisual Studioのバージョンが、落としてきたQuantLibのバージョンでサポートされているかを確認する
* QuantLibプロジェクトにBoostのヘッダーファイルとlibファイルへのパス２つを指定する
* ExamplesプロジェクトにQuantLibプロジェクトのヘッダーファイルとlibファイルへのパス２つを指定する 

##この記事を書いた人（自己紹介）

QDくんと申します。
デリバティブの分野でクオンツ (主にQuant Developer)を10年以上やっております。
クオンツとは金融機関等でモデル開発を行う専門職であり、ひとくちにクオンツといっても金融商品評価、リスク管理、アルゴリズム取引、アセットアロケーションなど多くの分野に分かれます。

ファイナンス、金融工学、ファイナンス機械学習関連の情報発信を行っておりますので、ご興味のある方は一度のぞいてみて下さい。

個人メディア：[Quant College](https://quantcollege.net/)
金融工学、確率解析、『ファイナンス機械学習』本、ファイナンス関連のプログラミング、などを発信中

Twitter：[@developer_quant](https://twitter.com/developer_quant)
Risk.netの記事サマリー、ファイナンス関連のライブラリ、クオンツ就活、勉強方法などを発信中

note：[QuantDeveloper](https://note.com/quantdeveloper)
LIBOR廃止問題のサマリーなどを発信中
（今後はCVA入門やSA-CCR入門などを追加予定）

#Visual Studioのインストール

インストーラーをダウンロードする。
[ダウンロードサイト](https://visualstudio.microsoft.com/ja/vs/)でVisual Studio Community 2019を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/f66d00b5-fb73-bc73-6ace-99843967770f.png)

ダウンロードしたインストーラー (.exe) を走らせる。 
途中で、インストールする機能を選択する画面になるが、「C++によるデスクトップ開発」にチェックを入れる。ついでに他に興味のある機能があればそれらもチェックを入れてインストール。
 Visual Studio 2019のインストールからC++の開発を始めるまでは[こちらのQiita記事](https://qiita.com/Gaccho/items/1409c27216a67014a024)を参照。

#Boostのインストール

##注意点

Boostは大半の機能はヘッダーオンリーで書かれており、ヘッダーファイル（hppファイル）のパスを指定して#includeするだけで使える機能も多いが、一部機能（unit_testなど）はソースファイルをビルドして作ったライブラリファイル（libファイル）が必要である。このため、ヘッダーファイルに加えて、ビルド済みのlibファイルが必要。方法としては２つある。

（１）Boostを落としてきた後、付属のビルドツールを使って自分でビルドする
（２）ビルド済みのlibファイルごとBoostのサイトから落としてくる

しかしどう考えても（２）の方が楽なので以下では（２）でインストールしていく。ここで注意すべきポイントは、落としてくるlibファイルは自分のVisual Studioのバージョンに合ったものを選ぶ必要がある、ということだ。

どのような場合に（１）でやらないといけないかというと、Visual Studioの新しいバージョンがリリースされてすぐだと、Boostのビルド済みファイルではその新しいバージョンが未対応となっている場合である。
直近であればVisual Studio 2019が出てすぐは、Boostのビルド済みファイルではVisual Studio 2017までしか対応しておらず、2019はunsupportedとなっていたと記憶している。

（１）でやる場合は、ビルドツールのオプション引数で、DebugビルドとReleaseビルドの違いなどを反映したりしないといけない。

##インストーラーの選択

[boostのバイナリファイルのダウンロードサイト](https://sourceforge.net/projects/boost/files/boost-binaries/)に行き、boostのバージョンを選ぶ。2020年9月現在では1.74.0が最新だったので1.74.0のフォルダを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/f82cac3c-be97-1ccc-bc23-00eadb58ea50.png)

次の画面で、Visual Studioのバージョンと、Windowsが64bitか32bitかに応じて、ダウンロードするファイルを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/4f5c07d3-ccbe-4e35-0100-f55a7e71892b.png)

Visual Studio 2019であれば、その内部バージョン名は14.2なので、msvc-14.2を選ぶ。（外部バージョン名2019と内部バージョン名14.2が全然違ってわかりにくい。）
Windowsは今であれば64bitが普通だろうから64bitを選ぶ。
よって、boost_1_74_0-msvc-14.2-64を選ぶ。
 
Visual Studio 2017をインストール済みであれば、 boost_1_74_0-msvc-14.1-64を選ぶ。

##インストールしてパスを確認

あとはダウンロードしたインストーラーを動かせばインストールされる。途中でインストール先のフォルダを選ぶが、ここでは

C:\local\

にインストールした。よって、

C:\local\boost_1_74_0

にファイル一式が入っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/541be00d-1149-0a42-1f4e-71a9fe76542e.png)

この場合、
ヘッダーファイルは以下に入っている。
C:\local\boost_1_74_0\boost

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/7537e14e-8998-b4ed-a40e-cf32e2cc5714.png)

ライブラリファイルは以下に入っている。
C:\local\boost_1_74_0\lib64-msvc-14.2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/15c59920-355c-40a0-3db4-0df7ad1ab380.png)

これら２つのパスをQuantLibのプロジェクトで設定してあげないといけない。インストール先のフォルダが上記と違う場合は、以下の記述においてパスを読み替える必要がある。

#QuantLibのインストール

##ダウンロード

[ダウンロードサイト](https://bintray.com/quantlib/releases/QuantLib)に行き、zipファイルをダウンロードする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/f24caca4-a760-ecbe-c44f-4884ff9dcff9.png)

2020年9月現在、QuantLibの最新バージョンは1.19であり、QuantLib-1.19.zipファイルをダウンロードして解凍する。
ここでは、以下のパスに解凍した。

C:\local\

よって、QuantLibのファイル一式は以下にある。

C:\local\QuantLib-1.19

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/b986724c-6188-04ed-322e-ad59fcd49358.png)

##パスの設定

QuantLib.slnを開くと、QuantLib本体のプロジェクトと、Examplesフォルダ内に多くのExampleのプロジェクトが入っているのがわかる。ここから、全プロジェクトに対して、必要なパスの設定をする必要がある。一般にQuantLibを使って開発する際、必要となるパス設定の作業は大きく分けて以下の３つである。

１．インクルードディレクトリにBoostのヘッダーファイルへのパスを追加
２．ライブラリディレクトリにBoostのライブラリファイルへのパスを追加
３．QuantLibを呼び出す側のプロジェクトについては、QuantLibを使うために、 QuantLibプロジェクトのフォルダへのパスを設定する必要がある

３．については、QuantLibと一緒にデフォルトで付いてくるプロジェクトはパスを設定する必要がない。なぜならデフォルトで付いてくるtest-suiteプロジェクトと、Examplesフォルダ内の各プロジェクトには、初めからパスが設定されているからだ。しかし自分でQuantLibを呼び出すプロジェクトを新規で作っていく際には、３．の設定が必要になる。
本記事では、１．と２．の作業について、以下で詳しく見ていく。

##QuantLib本体のビルド

###Boostへのパスを設定

QuantLib.slnをVisual Studioで開き、Shiftキーを押しながら、全てのプロジェクトを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/a03b0954-4154-e1cf-f63d-f34d9cc5ff15.png)

この状態でAlt + Enterでプロジェクトのプロパティを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/e86ffb88-2bfe-3be8-d713-6537aa72be3e.png)

上の画像のように、以下の設定を行う。

・構成を「すべての構成」とする
・プラットフォームを「すべてのプラットフォーム」とする

構成プロパティ -> VC++ディレクトリ を開き、
・インクルードディレクトリにBoostのヘッダーファイルへのパスを追加
（上の画像では、C:\local\boost_1_74_0）
・ライブラリディレクトリにBoostのライブラリファイルへのパスを追加
（上の画像では、C:\local\boost_1_74_0\lib64-msvc-14.2）

###ちなみに（ご参考）

構成を「すべての構成」とするのは、DebugビルドとReleaseビルドでどちらも同じパスを参照するからである。
ヘッダーファイルはDebugビルドかReleaseビルドかによらず同じものを参照する。
ライブラリファイルは、dllファイルとlibファイルのいずれも、ファイル名に

・「mt-gd-x64」が付いているもの
・「mt-x64」が付いているもの

の２種類ずつある。その使い分けは、

・gdが付いている方がDebugビルド用
・gdが付いていない方がReleaseビルド用

であり、別々のファイルになっている。よって、これら２種類のファイルが別々のフォルダに入っている場合は、上記のプロパティで、構成をDebugとReleaseで別々のパスを設定しないといけない。そうしないとビルド時（コンパイル時ではなくリンク時）にlibファイルが見つからないというエラーが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/5b30b29e-cbe1-fa6e-dbe2-0073feb7dba2.png)

プラットフォームについては、これは64bitと32bitを切り替えるものだが、現代においては64bitが普通だろうからあまり気にしなくていいだろう。しかしビルド時に前もって、プラットフォームをx64としておかないといけない。

###ビルド

画面の上の方にある構成をDebug、プラットフォームをx64とする。
QuantLibプロジェクトを選択し、右クリックからビルドを選択するとビルド開始。終わるまで少し時間がかかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/4442261f-5569-a570-b173-bdcb62f86f7b.png)

ビルド中に多数の警告が出るが、多くはC4819エラーであり、この警告が出ている理由は、単にコードのコメント欄に、コード作成者の名前が多数入っているのだが、フランス人など外国人の人名で、通常のアルファベットではない文字が含まれていることが原因である。よって気にしなくてよい。

それ以外の警告も出るかもしれないが、初心者のうちはいったん気にしなくていいと思う。慣れてきてから、これらの警告が出ている理由を考え、比較的重要なものとそうでないものを見分けて、重要でないものは、その警告が出ないように設定してしまえばよい。

エラーが出なければ正常終了となる。以下のようにlibファイルが生成されていることを確認しよう。libファイルの生成場所は、デフォルトの設定であれば、
C:\local\QuantLib-1.19\lib
になっている。
・DebugビルドするとQuantLib-x64-mt-gd.libが生成される
・ReleaseビルドするとQuantLib-x64-mt.libが生成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/45f6a2b9-906d-7778-bff1-62035761c2a3.png)

エラーが出た場合は、たいていパスの設定が間違っているので、もう一度見直してほしい。また、ダウンロードしてきたBoostのlibファイルが64bitであるにも関わらず、ビルド時の設定がWin32になっている、などもあり得る。その場合、Boostのlibファイルの32bitバージョンがない、とのエラーが出る。（他にも、前提としているWindows SDKのバージョンが古い・新しい、などもあるだろうが、ここでは書ききれない。）

#正しくインストールできたかテスト

##パスの確認（ご参考）

test-suiteプロジェクトと、Examplesフォルダに入っている各プロジェクトは、QuantLibプロジェクトに依存しているため、以下の設定が完了していることを確認する。

・QuantLibのヘッダーファイルへのパスを指定する
・QuantLibのlibファイルへのパスを指定する

ヘッダーファイルへのパスを教えてあげることで、#includeでQuantLibのクラスや関数の宣言が見えるようになる。
libファイルへのパスを教えてあげることで、クラスや関数の実装が見えるようになる。 

ヘッダーファイル（とソースファイル）は全て、
C:\local\QuantLib-1.19\ql
に入っている。しかし#includeする際には

```cpp

#include <ql/foo/bar.hpp>
```

というようにqlを先頭に付けてインクルードするため、パスとして設定するのは、
C:\local\QuantLib-1.19\
である。

しかしこれは、test-suiteから見ると、自分自身のパスは
C:\local\QuantLib-1.19\test-suite
なので、これの１つ上の階層である。このため、パスの設定としては、絶対パスではなく相対パスとして、
..
と設定されている。「..」とはつまり「自分の１つ上」という意味である。

一方で、Examplesから見ると相対パスが少し変わってくる。
例えばEquityOptionプロジェクトであれば、自分自身のパスは
C:\local\QuantLib-1.19\Examples\EquityOption
なので、QuantLib-1.19は２つ上の階層である。このため、パスの設定としては、絶対パスではなく相対パスとして、
..\..
と設定されている。

libファイルのパスについても全く同様である。QuantLibのlibファイルは上で見たように、
C:\local\QuantLib-1.19\lib
であるから、上記のパス設定の末尾に\libを追加すればよい。
test-suiteの場合は、
..\lib
と設定し、Examplesフォルダ内のプロジェクトであれば、
..\..\lib
と設定すればよい。

これらを以下で確認していく。

##test-suiteのビルド

test-suiteプロジェクトは、その名の通りテストコードが多数入っているもので、正常にインストールできたか確認するために、まずはこれを回してみる。

まずはヘッダーファイルへのパスが設定されていることを確認する。
test-suiteプロジェクトを選択した状態で、Alt+Enterでプロジェクトのプロパティを開く。
構成プロパティ-> C/C++ -> 全般
と進み、「追加のインクルードディレクトリ」に「..」と入っていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/ee00270b-d6b6-c5e5-5b0f-ab37dde2e3e6.png)

「..」はつまり自分自身から見て「１つ上」のフォルダ階層のことであり、test-suiteのフォルダから１つ上のフォルダ階層をパスとして設定しておくと、その状態で

```cpp

#include <ql/foo/bar.hpp>
```

とすることでqlフォルダを参照できるから、これによりqlフォルダ以下にあるヘッダーファイルを参照できる。

次にライブラリディレクトリも以下のように設定されていることを確認する。
構成プロパティ-> リンカー -> 全般
と進み、「追加のライブラリディレクトリ」に「..\lib」と入っていることを確認する。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/3c94087f-2b99-a27d-ae69-e1c51770802c.png)

あとはビルドするだけである。まずはDebugビルドしてみよう。
正常終了すると、デフォルトの設定であれば、
C:\local\QuantLib-1.19\test-suite\bin
に
QuantLib-test-suite-x64-mt-gd.exe
が生成されている。

次にReleaseビルドしてみよう。
正常終了すると、デフォルトの設定であれば、
C:\local\QuantLib-1.19\test-suite\bin
に
QuantLib-test-suite-x64-mt.exe
が生成されている。

##test-suiteを走らせてみる

Debugビルドで生成したexeを走らせてみると、終わるまでに非常に時間がかかる。ずっと以下の画面のままで非常に遅いが、動いていそうである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/7d7af325-9021-ee46-627d-a016203b2a4b.png)

Releaseビルドで生成したexeを走らせてみると、以下の画面がしばらく出てから消えるが、動いていそうである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/8e58dd4b-499c-37b5-0957-c827d14a24e4.png)

いったんは、ビルドで生成したexeが動いているのが確認できればいいだろう。

##Examplesのビルド

Examplesフォルダに入っている各プロジェクトも同様にビルドしてみよう。
Boostのパスが正しく設定されていれば、ビルドは正常終了するはずである。
最初にEquityOptionのプロジェクトを走らせてみるのが良いだろう。

EquityOptionのプロジェクトをDebugビルドして正常終了すると、
C:\local\QuantLib-1.19\Examples\EquityOption\bin
に
EquityOption-x64-mt-gd.exe
が生成される。

##ExamplesのEquityOptionを走らせてみる

EquityOptionのプロジェクトを走らせるには、
・EquityOptionプロジェクトのDebugビルドが正常終了している状態で、
・EquityOptionプロジェクトから右クリックで「スタートアッププロジェクトに設定」を選択する
・F5でデバッグを開始する
すると、計算終了後、以下のような結果が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/74615df2-050e-4ceb-4769-4c838d237aac.png)

EquityOptionプロジェクトでは、バニラペイオフのEuropean Option, Bermudan Option, American Optionを、それぞれ多くのモデルと数値解法の組み合わせで評価し、結果を比較している。

デバッグで走らせているのに終了後、勝手にコンソールが閉じてしまう場合は、
ツール -> オプション -> デバッグ -> 全般
から、「デバッグの停止時に自動的にコンソールを閉じる」にチェックが入っていないか確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/45e03e3c-446f-cd5a-d594-063acaa7f325.png)

##ExamplesのFittedBondCurveを走らせてみる

EquityOptionプロジェクトと同様に、FittedBondCurveプロジェクトをビルドしてデバッグを開始すると、以下のような結果が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/f3989889-ccad-cca4-36ef-56db5f11ae96.png)

FittedBondCurveプロジェクトでは、様々なモデルで債券のイールドカーブを補間してその結果を出力している。

##ExamplesのCallableBondsを走らせてみる

EquityOptionプロジェクトと同様に、CallableBondsプロジェクトをビルドしてデバッグを開始すると、以下のような結果が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/2805d128-9140-8dad-35cb-dc34c5f4a9a3.png)

CallableBondsプロジェクトでは、様々なSigmaパラメーターをHull-Whiteモデルに設定しコーラブル債をプライシングしてその結果をBloombergの結果と比較している。

##ExamplesのBermudanSwaptionを走らせてみる

EquityOptionプロジェクトと同様に、BermudanSwaptionプロジェクトをビルドしてデバッグを開始すると、以下のような結果が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581596/e3db9a8d-914a-fb8f-d4db-f3a86a28ecda.png)

BermudanSwaptionプロジェクトでは、様々なモデルをスワップションにキャリブレーションした後、バミューダンをプライシングしてその結果を出力している。

#おわりに

今回はQuantLib入門の第１回として、インストールの方法を説明した。特に初心者がつまづきやすいパスの設定について詳しく解説した。

次回からは実際にコードを書きながら具体的にQuantLibの使い方を見ていく。また、Pythonからお手軽に使えるラッパー：QuantLib-Python　のインストール方法も別記事で見ていく。

#関連記事

[【QuantLibの使い方】第２回：Black-Scholesとバニラオプション](https://qiita.com/developer_quant/items/e70bb4068afce54005f6)

#ご興味を持って頂いた方は

ファイナンス、金融工学、ファイナンス機械学習関連の情報発信を行っておりますので、一度のぞいてみて下さい。

個人メディア：[Quant College](https://quantcollege.net/)
金融工学、確率解析、『ファイナンス機械学習』本、ファイナンス関連のプログラミング、などを発信中

Twitter：[@developer_quant](https://twitter.com/developer_quant)
Risk.netの記事サマリー、ファイナンス関連のライブラリ、クオンツ就活、勉強方法などを発信中

note：[QuantDeveloper](https://note.com/quantdeveloper)
LIBOR廃止問題のサマリーなどを発信中
（今後はCVA入門やSA-CCR入門などを追加予定）