Python
使用 QuantLib 和 Python 計算具有離散股息的美式期權的價格和希臘字母的問題
我在使用 QuantLib 和 Python 計算具有離散股息的美式期權時遇到了問題。我正在使用 Anaconda、Spyder、Python 3.6 和最新版本的 QuantLib。我在pricingfunctions.py 中創建了函式,它根據此網頁上的程式碼簡化了定價選項和希臘語的建構過程 - http://www.bnikolic.co.uk/blog/ql-american-disc-dividend.html:
import QuantLib as ql #%% def create_american_process(valuation_date, rf_rate, spot, ivol): #set calendar & day count calendar = ql.UnitedStates() day_counter = ql.ActualActual() #set evaluation date ql.Settings.instance().evaluation_date = valuation_date #set rate & vol curves rate_ts = ql.FlatForward(valuation_date, ql.QuoteHandle(rf_rate), day_counter) vol_ts = ql.BlackConstantVol(valuation_date, calendar, ql.QuoteHandle(ivol), day_counter) #create process process = ql.BlackScholesProcess(ql.QuoteHandle(spot), ql.YieldTermStructureHandle(rate_ts), ql.BlackVolTermStructureHandle(vol_ts)) return process #%% def american_px_greeks(valuation_date, expiry, call_or_put, strike, div_dates, div_values, time_steps, process): #create instance as call or put if call_or_put.lower() == 'call': option_type = ql.Option.Call elif call_or_put.lower() == 'put': option_type = ql.Option.Put else: raise ValueError("The call_or_put value must be call or put.") #set exercise and payoff exercise = ql.AmericanExercise(valuation_date, expiry) payoff = ql.PlainVanillaPayoff(option_type, strike) #create option instance option = ql.DividendVanillaOption(payoff, exercise, div_dates, div_values) #set mesh size for finite difference engine grid_points = time_steps - 1 #create engine engine = ql.FDDividendAmericanEngine(process, time_steps, grid_points) option.setPricingEngine(engine) return option #%% def print_option_results(option): print("NPV: ", option.NPV()) print("Delta: ", option.delta()) print("Gamma: ", option.gamma()) return None
然後我執行下面的腳本,但是 NPV、Delta 和 Gamma 的輸出都是 0.0,這是錯誤的。NPV 應該在 12 到 13 範圍內,Delta 接近 0.50,而 Gamma 可以忽略不計。我不確定出了什麼問題。非常感謝任何見解。謝謝
import QuantLib as ql from pricingfunctions import create_american_process from pricingfunctions import american_px_greeks from pricingfunctions import print_option_results #%% #parameters vol = 0.25 strike = 100 spot = ql.SimpleQuote(100) rf_rate = ql.SimpleQuote(0.01) ivol = ql.SimpleQuote(vol) call_or_put = 'call' div_dates = [ql.Date(14, 5, 2014), ql.Date(14, 8, 2014), ql.Date(14, 11, 2014)] div_values = [1.0, 1.0, 1.0] expiry = ql.Date(15, 1, 2016) valuation_date = ql.Date(17, 4, 2014) time_steps = 456 process_test = create_american_process(valuation_date, rf_rate, spot, ivol) option_test = american_px_greeks(valuation_date, expiry, call_or_put, strike, div_dates, div_values, time_steps, process_test) print_option_results(option_test)
您沒有設置全域評估日期。如果您不這樣做,那麼您在 2017 年 12 月,並且您的選項已經過期很久了。
添加
ql.Settings.instance().evaluationDate = valuation_date
之前的計算會給你預期的結果。