はじめに
オプション価格(プレミアム)に関しては、以下のサイトを参考にさせていただこうと思ったのですが、結果があまり良くなく、海外のサイトから参考にしました。
きっと、私がブラック・ショールズ・モデルを理解できていないから結果が良くなかったのだと思います。
もしくは米国のS&P500だからかも知れません。
以下のサイトを参考にしたのですが、それでもオプション価格(プレミアム)が完全一致という訳ではなく、近似値だったので、利用させていただくことにしました。ギリシャ指数に関しても近似値でした。
やはり私がブラック・ショールズ・モデルを理解できていないからかも知れません。
ブラック・ショールズ・モデルのプログラム
はじめに
PythonのQuantLibという金融系のライブラリーを使っています。なにやら難解です。
標準ライブラリーではありませんので、インストールが必要になります。
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を参照してください。
プログラム
参考サイトのプログラムを少し整理しました。
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
コメント