見出し画像

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

1.はじめに

概要と位置付け:
Pythonの金融商品評価ライブラリQuantLib-Pythonの使い方を解説するシリーズの第5回。今回は「スワップイールドカーブ編その4」として、JPY, EUR, TRY(トルコリラ)の3通貨について、対USDの為替フォワードおよび(元本変動型 or 元本一定型)通貨ベーシスを用いたクロスカレンシーカーブ構築を取り扱う。ソースコード一式はJupyter Notebook形式でダウンロード可能
当noteの続編では、債券のイールドカーブ構築について取り扱う予定。

当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では為替フォワードおよび(元本変動型 or 元本一定型)通貨ベーシスを用いたクロスカレンシーカーブ構築を中心に解説する。
シリーズの続編として「債券イールドカーブ編」「ボラティリティスマイル編」などを予定している。

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

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

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

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

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

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

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

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

1.1 当noteの構成

当noteの構成は次の通り。

2章でQuantLib-Pythonの概要とインストールについて簡単に確認する。
3章以降が本編であり、各Notebookのコードを順に解説していく。

3章はJPY(日本円)のクロスカレンシーカーブ構築のコードを説明する。USD担保JPY割引カーブを構築する方法について以下2通りを見ていく。
・為替フォワードのみを用いる方法
・元本変動型(Mark-to-Market型)通貨ベーシスのみを用いる方法
さらに、JPY担保USD割引カーブを構築し、JPY担保のUSDJPY通貨スワップを評価する。

4章はEUR(ユーロ)のクロスカレンシーカーブ構築のコードを説明する。為替フォワードと元本変動型(Mark-to-Market型)通貨ベーシスの両方を用いて、USD担保EUR割引カーブを構築する。さらに、JPY担保EUR割引カーブを構築し、JPY担保のEURJPY通貨スワップを評価する。

5章はエマージング通貨の例として、TRY(トルコリラ)のクロスカレンシーカーブ構築のコードを説明する。為替フォワードと元本一定型(Constant Notional型)通貨ベーシスの両方を用いて、USD担保TRY割引カーブを構築する。さらに、JPY担保TRY割引カーブを構築し、JPY担保のTRYJPY通貨スワップを評価する。

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.27である。
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のクロスカレンシーカーブ構築

本章のソースコードは以下ファイルを参照。
11_swap_yield_8_xccy_curve_jpy_ver1.0.ipynb

本章ではマルチカーブ体系において、JPYに関連するクロスカレンシーカーブを構築する。

  • USD担保JPY割引カーブ

  • JPY担保USD割引カーブ

加えて、JPY担保USD割引カーブの使用例として、JPY担保のUSDJPY通貨スワップをプライシングする。

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(25, ql.September, 2019)
ql.Settings.instance().evaluationDate = today

営業日を求めるのに参照する休日(カレンダー)を準備する。

usd_calendar = ql.UnitedStates()
jpy_calendar = ql.Japan()
usd_jpy_calendar = ql.JointCalendar(
    usd_calendar, jpy_calendar
)

本章ではドルと円を扱うので米国と日本のCalendar、およびそれらの両方を参照するJointCalendarを作っておく。

スワップの利払スケジュールを作るのに用いる設定を準備する。

spot_lag = 2
convention = ql.ModifiedFollowing
end_of_month = False
date_generation_rule = ql.DateGeneration.Backward

各変数の意味は次の通り。
・基準日からスポット日までのラグ日数
・営業日を求める際の休日調整方法
・利払スケジュールを月末ロールで作るか否か
・利払スケジュールの作成方法(Backwardは満期日から後ろ向きに利払日を求める)

スポット日を求める。

spot_date = usd_jpy_calendar.advance(
    today, spot_lag, ql.Days
)
print(spot_date)
September 27th, 2019

イールドカーブのオブジェクト生成時に必要なDayCounterを作っておく。DayCounterの種類は何でもよいが、ここではAct/365(Fixed)とする。

curve_day_counter = ql.Actual365Fixed()

ベーシスポイント単位のマーケットレートを実数値に直すための定数を準備する。

basis_point = 1e-4

3.2 所与とするイールドカーブを準備

ここから先は

80,703字 / 7画像 / 3ファイル

¥ 1,480

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