2 votos

Optimizar los cálculos de los swaps de tipos de interés en la simulación de Montecarlo

Estoy realizando una simulación en la que quiero calcular el VAN de 100 swaps sobre 1000 (o incluso mucho más) curvas de tipos de interés diferentes.

Parece que Quantlib no es realmente rápido en la realización de estos cálculos o simplemente mi código no es óptimo.

El script hace lo siguiente (para todas las curvas):

  • Crear objetos de la curva Quantlib (basados en estas curvas de tipos de interés simuladas)
  • Crear objeto de intercambio por intercambio
  • Establecer swappriceEngine por objeto de intercambio
  • Calcular el VAN por swap

Ejemplo de código para cada swap sobre todas las curvas de tipos de interés simuladas:

fixed_schedule = ql.Schedule(settle_date, maturity_date,
                         fixed_leg_tenor, calendar,
                         ql.ModifiedFollowing, ql.ModifiedFollowing,
                         ql.DateGeneration.Forward, False
float_schedule = ql.Schedule (settle_date, maturity_date,
                          float_leg_tenor, calendar,
                          ql.ModifiedFollowing, ql.ModifiedFollowing,
                          ql.DateGeneration.Forward, False
swap = ql.VanillaSwap(ql.VanillaSwap.Payer, notional, fixed_schedule,
                     fixed_rate, fixed_leg_daycount, float_schedule,
                     6M_index, float_spread, float_leg_daycount)
swap.setPricingEngine(DiscountingSwapEngine(YieldTermStructureHandle(discount_curve)))
swap.NPV()

Me pregunto si es posible crear sólo 100 objetos swap diferentes y sólo actualizar las curvas de tipos de interés necesarias para calcular el VAN en lugar de crear objetos swap en cada bucle. Así que sólo actualizar el 6M_index en el objeto swap y actualizar la curva de descuento en swap.setPricingEngine.

¿Es eso posible?

5voto

Brad Tutterow Puntos 5628

Sí, es posible. Puedes crear los 100 canjes y sus motores de antemano y sólo cambiar las curvas. Si utilizas la misma curva de descuento para todos los intercambios, puedes incluso crear un solo motor y compartirlo entre los intercambios.

Puedes escribir algo así:

forecast_handle = ql.RelinkableYieldTermStructureHandle()
discount_handle = ql.RelinkableYieldTermStructureHandle()

index_6M = ql.SomeIndex(..., forecast_handle)
engine = ql.DiscountingSwapEngine(discount_handle)

y luego para cada intercambio:

fixed_schedule = ...
float_schedule = ...
swap = ...
swap.setPricingEngine(engine)

Después de esta fase de configuración, para cada escenario se puede fijar el precio de los intercambios con:

forecast_handle.linkTo(forecast_curve)
discount_handle.linkTo(discount_curve)
for s in swaps:
    s.NPV()

Seguirás gastando tiempo en la fijación de precios, y puede que se pierda algo de tiempo en las notificaciones entre objetos, pero al menos te ahorrarás el tiempo de construcción de objetos. Hazme saber cómo funciona esto.

1 votos

Hola Luigi, ¡parece que funciona! Gracias

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