2 votos

Quantlib especifica la duración del contrato en lugar de las fechas

Utilizo el siguiente código en Python para fijar el precio de las opciones de venta/compra americanas. Es un código sencillo ya que soy nuevo en el uso de Quantlib. Me gustaría especificar la duración del contrato (es decir T=1 , T=2 etc.) en lugar de especificar las fechas de cálculo y de vencimiento. ¿Es posible hacer esto? Si es así, ¿cómo puedo modificar el código siguiente para conseguirlo?

import QuantLib as ql

def OptionPrices(T, r, sigma, K, S0, TimeSteps):
    maturity_date = ql.Date(31, 12, 2020)
    calculation_date = ql.Date(1, 1, 2020)
    ql.Settings.instance().evaluationDate = calculation_date    

    payoff = ql.PlainVanillaPayoff(ql.Option.Call, K)

    am_exercise = ql.AmericanExercise(calculation_date, maturity_date)
    american_option = ql.VanillaOption(payoff, am_exercise)

    spot_handle = ql.QuoteHandle(ql.SimpleQuote(S0))
    flat_ts = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, r, ql.Actual365Fixed()))
    dividend_yield = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, 0, ql.Actual365Fixed()))
    flat_vol_ts = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(calculation_date, ql.UnitedStates(), sigma, ql.Actual365Fixed()))
    bsm_process = ql.BlackScholesMertonProcess(spot_handle, dividend_yield, flat_ts, flat_vol_ts)

    binomial_engine = ql.BinomialVanillaEngine(bsm_process, "crr", TimeSteps)
    american_option.setPricingEngine(binomial_engine)

    OptionPrices.AmCallPrices = [binomial_price(american_option, bsm_process, step) for step in range(2, TimeSteps+1, 1)]
    OptionPrices.AmCallPrice = american_option.NPV()

    payoff = ql.PlainVanillaPayoff(ql.Option.Put, K)

    american_option = ql.VanillaOption(payoff, am_exercise)

    OptionPrices.AmPutPrices = [binomial_price(american_option, bsm_process, step) for step in range(2, TimeSteps+1, 1)]
    OptionPrices.AmPutPrice = american_option.NPV()

def binomial_price(option, bsm_process, steps):
    binomial_engine = ql.BinomialVanillaEngine(bsm_process, "crr", steps)
    option.setPricingEngine(binomial_engine)
    return option.NPV()

OptionPrices(1, 0.06, 0.15, 100, 90, 200)
print(OptionPrices.AmPutPrice)

Agradecería cualquier ayuda. Gracias

3voto

Chris Mc Puntos 31

¿Qué tal si simplemente se define la fecha de vencimiento como la fecha de hoy (o cualquier otra fecha de inicio) ajustada por un período de T x 365 ¿días? He aquí un ejemplo:

T = 0.5
today = ql.Date().todaysDate()
maturity = today + ql.Period(f"{int(T*365)}d")

0 votos

Hola David. Gracias, funciona perfectamente. Te agradezco tu ayuda.

2 votos

ql.Period(int(T*365), ql.Days) tiene el mismo efecto y puede ser un poco menos críptico.

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