見出し画像

Quant College レクチャーシリーズ(14)QuantLib-Python チュートリアル(スワップイールドカーブ編その3)

1.はじめに

概要と位置付け:
Pythonの金融商品評価ライブラリQuantLib-Pythonの使い方を解説するシリーズの第4回。今回は「スワップイールドカーブ編その3」として、JPY, USD, EURの3通貨について、RFR-IBORベーシス、IBORテナーベーシスを用いたマルチカーブ構築を取り扱う。ソースコード一式はJupyter Notebook形式でダウンロード可能
当noteの続編(その4以降)では、為替スワップポイントや通貨ベーシスを用いたクロスカレンシーのマルチカーブ構築を取り扱う予定。
債券のイールドカーブ構築についても続編で取り扱う予定。

当noteリリースの背景:
近年のPython人気過熱を受け、ファイナンス理論についてもPythonで計算しながらハンズオンで学びたいというニーズが増えてきている。また、金融実務でもPythonの活用が広がっており、従来であればExcelマクロなどで対応していた計算も、Pythonのライブラリを駆使してできるだけ効率良くツール開発したい、というニーズも生じている。

ファイナンス理論については良質なテキストが日本語で多数出ており(洋書の翻訳版が多いが)、学習者にとって教材に事欠くことは少ない。また、Pythonの文法や機械学習ライブラリの使い方については非常に多くの和書が出ており、どれを選べばいいか悩むほどである。

しかしファイナンス理論をPythonで学ぶ和書はまだ数が少なく、また、それらの多くはスクラッチ実装をベースに学ぶ形式になっている。特に実務家にとっては、スクラッチ実装のような悠長なことは言っておられず、実務で必要な計算ツールを素早く効率的に作りたいはずである。そもそもExcelマクロ等ではなくPythonを使う理由は「多数の便利なライブラリを有効活用したいから」のはずである。

Pythonには実は、QuantLib-Pythonという主に金融商品評価ライブラリが存在し、これを使えば、実務で必要となる計算の大部分は、少ないコードで実装できる。ところがQuantLib-Pythonの解説は、少々マニアックな分野ということもあり、英語で探しても断片的なものしか見つからない。日本語のものに至ってはほぼ皆無という状況であり、初学者の自習にはハードルが高いといえる。さらに、QuantLib-PythonはC++で開発されたライブラリであるQuantLibをPythonから呼び出す形になっており、適切な使い方を自力で把握しようとすると、C++の広範な知識が要求されてしまう

そこで当noteでは:
QuantLib-Pythonの使い方について、簡単なサンプルコードを用いてできるだけ丁寧に日本語でまとめた。関数に与える引数についても、可能な限り一つずつ説明する。これにより、ライブラリのエンドユーザーにとって必要な知識が効率的に得られるはずである。
なお当noteはシリーズ記事の一部であり、スワップイールドカーブとスワップ評価を扱う。このテーマは多くのトピックを含むため、複数回に分けてリリースする。当noteではRFR-IBORベーシス、IBORテナーベーシスを用いたマルチカーブ構築を中心に解説する。
シリーズの続編として「債券イールドカーブ編」「ボラティリティスマイル編」などを予定している。

当noteの特徴:
・ライブラリの使い方を簡単なサンプルコードを通して説明した。
・関数に与える引数の意味をできるだけ平易に解説した。
・Pythonの若干難しめな文法や機能は使わないで説明するよう努めた。
・ファイナンス関連の実務知識もその都度、簡単に補足説明した。
・ソースコード一式をすぐに動かせるよう、Jupyter Notebook形式で配布している。

当noteの著者について:
・クオンツとして新卒入社後、デリバティブ評価関連の実務に長年従事
・評価モデルの調査、ロジック開発、ライブラリ実装の実務を経験
・自身の運営するサイトQuantCollegeでは金融工学関連の記事を多数執筆
・Twitterフォロワー1万9千人超
・note販売実績多数

当noteはこのような方におすすめ:
・QuantLib-Pythonを用いたイールドカーブ構築方法を知りたい
・Pythonで効率的に金融商品評価を行いたい/学びたい
・Pythonのライブラリを活用してイールドカーブを構築したい
・Pythonのライブラリを活用してスワップを評価したい
・QuantLibを使ってみたいが、C++の知識がないので断念した
・英語の文献を読むのはしんどいので、日本語で効率的に学びたい

当noteで前提とする知識:
・Google Colaboratoryを使えること(またはPython環境を構築できること)
・Pythonの基本的な文法の知識
・(必須ではないが)金利スワップの基本的な知識があるとより深く理解しやすい
・(必須ではないが)オブジェクト指向プログラミングの基本的な知識(クラス、オブジェクト/インスタンス、コンストラクタ、メソッド、継承、多態性など)があるとより深く理解しやすい

当noteを読んで得られるメリット:
・QuantLib-Pythonを用いたイールドカーブ構築方法がわかる
・Pythonで具体的に数値を出しながら金融商品評価を学べる
・C++を知らなくても、QuantLibを用いた計算を実装できる
・慣れない英語でQuantLib関連資料を読み込む時間を節約できる
・RFR-IBORベーシスやIBORテナーベーシスによるマルチカーブ構築方法についてPythonで学べる

当noteに書いていない内容:
・Pythonの環境構築、基本文法の解説
・QuantLib-Pythonの背後にある実装の詳細(C++レイヤーでのクラス設計、SWIGを用いたPythonラッパーの生成など)
・イールドカーブの背後にあるファイナンス理論の解説、ディスカウントファクターを求める数式やその導出
・為替スワップポイントやクロスカレンシーベーシスを用いたマルチカーブ構築の実装、クロスカレンシースワップの評価(続編で扱う予定)
・債券イールドカーブ構築の実装、債券の評価(続編で扱う予定)

当noteはこのような方にはおすすめしません:
・Pythonの環境構築、基本文法から教えてほしい
・そもそもの金利、イールドカーブ、金利スワップの概念をゼロから詳しく教えてほしい
・金利スワップ評価の背後にあるファイナンス理論、ディスカウントファクターを求める数式やその導出を学びたい
・イールドカーブ構築の計算をスクラッチで(ライブラリを使わずに)実装したい
・為替スワップポイントやクロスカレンシーベーシスを用いたマルチカーブ構築の実装だけを学びたい
・債券イールドカーブ構築の実装だけを学びたい

ディスクレーマー:
当noteの著作権を含む知的所有権は当note著者に帰属し、事前に当note著者からの承諾を得ることなく、当noteおよびその複製物に修正・加工を施すことを固く禁じます。また、当noteおよびその複製物を転載、共有、配布、送信、転用、譲渡、販売すること、及びそれらに準ずる行為を固く禁じます。
上記の禁止事項が発覚した場合は然るべき対応をとらせて頂きます。
当noteの内容については、正しい情報あるいは十分に信頼できると判断した情報に基づき作成することに最大限努めてはおりますが、情報の正確性、完全性について当note著者は保証せず、いかなる責任を負うものでもありません。当noteの内容及びリンク先から読者様・購入者様へいかなる損失・損害などの被害が発生したとしても、当noteでは責任を負いかねますのでご了承下さい。
当noteはパブリックに公開されている情報、及び広く一般の購入者・購読者に向け発信されている情報を基に作成されたものであり、特定企業に固有の情報・特定企業が占有する情報を含みません。当noteに記載の内容や意見につきましては、当note運営者の個人的見解であり、当note運営者の雇用主の公式見解ではありません。

1.1 当noteの構成

当noteの構成は次の通り。
2章でQuantLib-Pythonの概要とインストールについて簡単に確認する。
3章以降が本編であり、各Notebookのコードを順に解説していく。
3章はJPY(日本円)のマルチカーブ構築のコードを説明する。TONA, ZTIBOR6M, ZTIBOR3M, DTIBOR6M, DTIBOR3Mのカーブを構築する。
4章はUSD(米ドル)のマルチカーブ構築のコードを説明する。SOFR, LIBOR3M, LIBOR6Mのカーブを構築する。
5章はEUR(ユーロ)のマルチカーブ構築のコードを説明する。ESTR, EURIBOR3M, EURIBOR6Mのカーブを構築する。
6章で当noteをまとめる。
ソースコード一式は当note の末尾に掲載しており、Jupyter Notebook形式でダウンロードできる。

2.QuantLib-Pythonの概要とインストール

2.1 概要

まずQuantLibとは、デリバティブや債券など、金融商品のプライシングやリスク計算が行えるライブラリであり、C++で開発されている。

QuantLib-Pythonとは、QuantLibをPythonから呼び出すラッパーである。C++を呼び出す部分のソースコードは、SWIGというツールで自動生成されている。内部的にはQuantLibを呼ぶ出しているだけなので、QuantLib-Pythonに入っているがQuantLibには入っていないという機能は無い。逆にQuantLibには入っているがQuantLib-Pythonには入っていない機能は存在する点に注意。ロジックの核心部分がPythonで書かれているわけではないので、計算方法の実装を知りたい場合はQuantLibのC++コードを読みに行く必要がある。

2.2 インストール

方法としては、ビルド済みのものをインストールするか、自力でビルドするかのどちらかである。自力でビルドするにはC++の環境構築などが必要になるので特別な事情がない限りはおすすめしない。Pythonの他のライブラリと同様、ビルド済みのものをインストールすればよい。

2.2.1 コマンド

ビルド済みのものをインストールする方法もまた、Pythonの他のライブラリと同様であり、QuantLib-Pythonに特有のプロセスは必要ない。コマンドは

python -m pip install QuantLib

である。

なお注意として、上記コマンドでQuantLibではなくQuantLib-Pythonを指定すると、古いバージョン(バージョン1.18以前)しかインストールできない。2022年7月現在、QuantLib、およびQuantLib-Python(のもとになっているQuantLib-SWIG)の最新バージョンはいずれも1.26である。
QuantLibのPython版をインストールする際に指定する名前が、以前はQuantLib-Pythonだったが、バージョン1.19以降はQuantLibに変更された。以前に古いバージョンをQuantLib-Pythonとしてインストールしている場合は、改めてQuantLibとしてインストールし直しておこう。

当noteではC++で開発されたQuantLib本体と区別するために、QuantLib-Pythonと表記している。

2.2.2 Jupyter Notebook / Google Colaboratory上でインストール

Jupyter NotebookやGoogle Colaboratory上でインストールする場合は

!pip install QuantLib

とすればよい。

Google Colaboratory上でインストールした場合の様子は以下の通り。

2.2.3 関連リンク

QuantLib-Pythonのインストール方法についてはこちらの記事で解説しているので参照されたい(内容が若干古くなっているかもしれないが)。

念のためにQuantLib公式のインストール方法のページ(英語)をリンクしておく。

QuantLib公式サイト(Windows)
QuantLib公式サイト(Mac OS)
QuantLib公式サイト(Linux)

3.JPYのマルチカーブ構築

本章のソースコードは08_swap_yield_5_multi_curve_jpy_ver1.0.ipynbファイルを参照。

本章ではマルチカーブ体系において、JPYの以下のイールドカーブを構築する。

  • TONAカーブ(OISカーブ)

  • ZTIBOR6Mカーブ

  • ZTIBOR3Mカーブ

  • DTIBOR6Mカーブ

  • DTIBOR3Mカーブ

3.1 準備

3.1.1 インポート

必要なモジュールをインポートする。

import QuantLib as ql

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

3.1.2 基準日等の設定

計算の基準日を設定する。

today = ql.Date(27, 4, 2022)
ql.Settings.instance().evaluationDate = today

様々な箇所で使用する変数を準備しておく。

spot_lag = 2
currency = ql.JPYCurrency()
calendar = ql.Japan()
convention = ql.ModifiedFollowing
end_of_month = False

各変数の意味は次の通り。
・spot_lagは基準日から、標準的なスワップ開始日までのラグ日数
・currencyはキャッシュフロー通貨
・calendarはスワップの利払日を営業日ベースで求める際に参照する休日
・conventionはスワップの利払日を営業日ベースで求める際に用いる休日調整方法
・end_of_monthは利払日のスケジュールを求める際、各利払日を月末営業日にするか否か

スポット日を求めておく。

spot_date = calendar.advance(today, spot_lag, ql.Days)
print(spot_date)
May 2nd, 2022

イールドカーブのオブジェクト生成にはDayCounterが必要だが、DayCounterの種類は何でもよい。

curve_day_counter = ql.Actual365Fixed()

3.2 TONAカーブ構築

本節ではTONAカーブを構築する。ここでは大まかな流れだけ説明する。

OISレート等からOISカーブを構築する方法の詳細は前回のnote
「スワップイールドカーブ編その2」を参照。

3.2.1 変動金利指標

まずカーブに対応する金利指標のオブジェクトを生成する。

ここから先は

66,414字 / 5画像 / 3ファイル

¥ 1,480

この記事が気に入ったらサポートをしてみませんか?