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

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
)もあるようです。
満期までの期間を手動で設定する場合は、33行目の変数Tに日数を設定してください。
返り値
主な値として、以下を得ることができます。
- オプション価格(プレミアム)*コールとプットの区分がないようです。
- デルタ
- ガンマ
- セータ
- ベガ
- ロー
その他の値については、以下のBlackCalculator Class Referenceを参照してください。
![]()
QuantLib: BlackCalculator Class Reference
プログラム
参考サイトのプログラムを少し整理しました。
from datetime import date
calendar = ql.UnitedStates()
day_count = ql.ActualActual()
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
yield_curve = ql.FlatForward(calc_date,
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,
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
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
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
コメント