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