Curva de descuento frente a la de estimación a futuro
El YieldTermStructureHandle
pasado a BlackCapFloorEngine
corresponde a la curva de descuento, mientras que la pasada a IborIndex
corresponde a la curva de estimación de avance
En el ejemplo al que te refieres dos, resulta que ambos son idénticos, pero podrías perfectamente definir dos asas diferentes en dos curvas diferentes, de la siguiente manera:
disc_term_structure = ql.ZeroCurve(disc_dates, disc_zero_rates, ...)
disc_ts_handle = ql.YieldTermStructureHandle(disc_term_structure)
engine = ql.BlackCapFloorEngine(disc_ts_handle, vols)
Motor de precios de Bachelier
En cuanto a su segunda pregunta, hay un BachelierCapFloorEngine
en QuantLib, véase aquí: https://github.com/lballabio/QuantLib/blob/master/ql/pricingengines/capfloor/bacheliercapfloorengine.hpp
y se expone en Python (estoy usando QuantLib 1.16). Podrías, por ejemplo, sustituir la instanciación del motor Black por esta línea en el ejemplo de Goutham:
engine = ql.BachelierCapFloorEngine(disc_ts_handle, ql.QuoteHandle(ql.SimpleQuote(0.03))