Python

使用 QuantLib 和 Python 計算具有離散股息的美式期權的價格和希臘字母的問題

  • December 6, 2017

我在使用 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

之前的計算會給你預期的結果。

引用自:https://quant.stackexchange.com/questions/37237