Я написал функцию для расчета цены опциона с использованием QuantLib, однако для одного опциона я получаю ошибку «отрицательная вероятность». Я попытался выделить точку в коде, откуда возникает ошибка, она исходит из строки, где я вычисляю NPV. Кто-нибудь может помочь решить проблему? Код работает для другого варианта, который я попробовал.
def calc_scn_price(p_und_price,p_strike,p_imp_vol,p_op_type,p_exp_date,p_und_bbg_tckr,p_div_yield):
print("Input to pricer :::",806.7105365495364,p_und_price,' Strike: ',1600.0,' Implied Vol: ',57.82902561325027,' Option Type: ','Call'," Exp Date: ","2021-09-17 00:00:00"," Underlier Ticker: ","TSLA US Equity")
# Settings for evaluation
ql.Settings.instance().evaluationDate = calculation_date
# Risk free rate
v_rfr = 0.0169
v_matur_dt = ql.Date(p_exp_date.day, p_exp_date.month, p_exp_date.year)
# Option Type
if p_op_type == 'Call':
v_op_type = ql.Option.Call
elif p_op_type == 'Put':
v_op_type = ql.Option.Put
else:
raise ValueError("Option Type must be only Call or Put")
# Setup the option
payoff = ql.PlainVanillaPayoff(v_op_type, float(p_strike))
settlement = calculation_date # Assume the transaction happens today since it is an American option
am_excercise = ql.AmericanExercise(settlement, v_matur_dt)
american_option = ql.VanillaOption(payoff, am_excercise)
# ***********Setup Black Scholes Process*********#
S = ql.QuoteHandle(ql.SimpleQuote(p_und_price)) # Underlier Spot Price
r = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, v_rfr, day_count)) # Risk free rate
v_div_yield = p_div_yield
dividend_yield = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, float(v_div_yield), day_count))
sigma = ql.BlackVolTermStructureHandle(
ql.BlackConstantVol(calculation_date, calendar, p_imp_vol, day_count))
bsm_process = ql.BlackScholesMertonProcess(S, dividend_yield, r, sigma)
# Use derived implied vol to calculate scenario Option price
am_steps = 800
# Run the engine
binomial_engine = ql.BinomialVanillaEngine(bsm_process, "crr", am_steps)
american_option.setPricingEngine(binomial_engine)
v_op_price = american_option.NPV()
print(v_op_price)
return v_op_price