2 votos

QuantLib incluye las vacaciones en el precio de la opción

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

3voto

Brad Tutterow Puntos 5628

Sustituir

    day_count = ql.Actual365Fixed()
    calendar = ql.UnitedStates(0)

con

    calendar = ql.UnitedStates(0)
    day_count = ql.Business252(calendar)

para obtener el comportamiento que espera. Si desea que sólo se vea afectada la volatilidad, utilice business/252 para la curva vol y act/365F para las curvas de tipos.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X