PythonのQuantLibでブラック・ショールズ・モデルを使ってオプション価格(プレミアム)やギリシャ指数を算出

スポンサーリンク
スポンサーリンク

はじめに

オプション価格(プレミアム)に関しては、以下のサイトを参考にさせていただこうと思ったのですが、結果があまり良くなく、海外のサイトから参考にしました。

Pythonでオプション・プレミアムの計算(ブラック・ショールズ式による解析解)
プログラミング言語pythonを用いて、ブラック・ショールズ式を実装してみましょう。

きっと、私がブラック・ショールズ・モデルを理解できていないから結果が良くなかったのだと思います。
もしくは米国のS&P500だからかも知れません。

以下のサイトを参考にしたのですが、それでもオプション価格(プレミアム)が完全一致という訳ではなく、近似値だったので、利用させていただくことにしました。ギリシャ指数に関しても近似値でした。
やはり私がブラック・ショールズ・モデルを理解できていないからかも知れません。

Valuing Options on Commodity Futures Using QuantLib Python
Describes how to value options on commodity futures contract using the Black formula in QuantLib Python

ブラック・ショールズ・モデルのプログラム

はじめに

PythonのQuantLibという金融系のライブラリーを使っています。なにやら難解です。

QuantLib, a free/open-source library for quantitative finance
QuantLib, a free/open-source library for quantitative finance
QuantLib-Python
Backward-compatible meta-package for the QuantLib module

標準ライブラリーではありませんので、インストールが必要になります。

pip install QuantLib-Python

システムの設定

ブラック・ショールズ・モデルに必要な値を設定します。

spot       = 3378.5     # 原資産価格
strike     = 3370.0     # 権利行使価格
volatility = 0.22635875427740032  # ボラティリティ
rate       = 0.670   # 金利(リスクフリーレート)*パーセント
now_date   = date(2020,  8, 19) # 今日の日付
last_date  = date(2020, 12, 18) # 満期日

上記のコメントの通りですが、少し補足します。

ボラティリティ

パーセントではありません。パーセントの場合は100で割ってください。

金利(リスクフリーレート)

こちらはパーセントです。
リスクフリーレートというのは、以下の通りです。*参考サイト Growin’ Partners Inc.

    • 日本:日本国債の利回り
    • アメリカ:米国財務省証券(長期国債)の利回り*私は10年物にしました。

満期日までの期間

満期までの期間については、本日の日付と満期日を設定しておけば自動計算されます。
本プログラムはアメリカのカレンダーが元になっています。

5行目:calendar = ql.UnitedStates()

試していませんが、以下のように日本(Japan)もあるようです。

QuantLib: Calendars

満期までの期間を手動で設定する場合は、33行目の変数Tに日数を設定してください。

返り値

主な値として、以下を得ることができます。

  • オプション価格(プレミアム)*コールとプットの区分がないようです。
  • デルタ
  • ガンマ
  • セータ
  • ベガ
  • ロー

その他の値については、以下のBlackCalculator Class Referenceを参照してください。

QuantLib: BlackCalculator Class Reference

プログラム

参考サイトのプログラムを少し整理しました。

from datetime import date
import QuantLib as ql
import math

calendar = ql.UnitedStates()
day_count = ql.ActualActual()

# 設定
spot       = 3378.5     # 原資産価格
strike     = 3370.0     # 権利行使価格
volatility = 0.22635875427740032  # ボラティリティ
rate       = 0.670   # 金利(リスクフリーレート)*パーセント
now_date   = date(2020,  8, 19)
last_date  = date(2020, 12, 18) # 満期日

# 変換
interest_rate = rate / 100
calc_date = ql.Date(now_date.day, now_date.month, now_date.year)
option_maturity_date = ql.Date(last_date.day, last_date.month, last_date.year) 

ql.Settings.instance().evaluationDate = calc_date

flavor = ql.Option.Call

yield_curve = ql.FlatForward(calc_date, 
                             interest_rate,
                             day_count,
                             ql.Compounded,
                             ql.Continuous)

discount = yield_curve.discount(option_maturity_date)
strikepayoff = ql.PlainVanillaPayoff(flavor, strike)
T = yield_curve.dayCounter().yearFraction(calc_date, option_maturity_date) # 満期までの期間(年)
stddev = volatility*math.sqrt(T)

# 算出
black = ql.BlackCalculator(strikepayoff, 
                           spot, 
                           stddev, 
                           discount)

print("%-20s: %4.4f" %("Option Price", black.value() ))
print("%-20s: %4.4f" %("Delta", black.delta(spot) ))
print("%-20s: %4.4f" %("Gamma", black.gamma(spot) ))
print("%-20s: %4.4f" %("Theta", black.theta(spot, T) ))
print("%-20s: %4.4f" %("Vega", black.vega(T) ))
print("%-20s: %4.4f" %("Rho", black.rho( T) ))

# Option Price        : 178.9641
# Delta               : 0.5325
# Gamma               : 0.0009
# Theta               : -262.5823
# Vega                : 770.5092
# Rho                 : 535.5627

 

コメント

タイトルとURLをコピーしました