Estoy intentando añadir un día festivo a mi calendario en QuantLib para que mi modelo de fijación de precios de opciones lo tenga en cuenta en la fijación de precios, donde esperaría que el tiempo hasta el vencimiento disminuyera con la inclusión de un día festivo, y que mi opción redujera su precio. Sin embargo, cuando utilizo la función .addHoliday
añade correctamente las vacaciones al Calendario, pero el precio de la opción no cambia. Parece como si el tiempo hasta el vencimiento de la opción se utilizara desde el objeto DayCounter y no utilizara el Calendario. ¿Sería correcta mi interpretación y, en caso afirmativo, cómo podría añadir un día festivo para que afecte al precio de la opción? Mi expectativa es que el precio de la opción disminuya en la misma cantidad que si redujera la fecha de vencimiento en un día. Ejemplo
import QuantLib as ql
def get_option_price(add_holiday):
calculation_date = ql.Date(18, 1, 2023)
ql.Settings.instance().evaluationDate = calculation_date
expiry = ql.Date(30, 1, 2023)
spot_price = 100.
strike_price = 105.
volatility = 0.50
dividend_rate = 0
option_type = ql.Option.Call
risk_free_rate = 0.001
day_count = ql.Actual365Fixed()
calendar = ql.UnitedStates(0)
if add_holiday:
calendar.addHoliday(ql.Date(24, 1, 2023))
print(add_holiday, ql.Calendar.holidayList(calendar, calculation_date, expiry))
payoff = ql.PlainVanillaPayoff(option_type, strike_price)
exercise = ql.EuropeanExercise(expiry)
european_option = ql.VanillaOption(payoff, exercise)
spot_handle = ql.QuoteHandle(ql.SimpleQuote(spot_price))
flat_ts = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, risk_free_rate, day_count))
dividend_yield = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, dividend_rate, day_count))
flat_vol_ts = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(calculation_date, calendar, volatility, day_count))
bsm_process = ql.BlackScholesMertonProcess(spot_handle, dividend_yield, flat_ts, flat_vol_ts)
european_option.setPricingEngine(ql.AnalyticEuropeanEngine(bsm_process))
print(european_option.NPV(), european_option.delta())
get_option_price(False)
get_option_price(True)
False ()
1.7305073013860064 0.3111915181849204
True (Date(24,1,2023),)
1.7305073013860064 0.3111915181849204