Necesito orientación para valorar opciones FX estilo americano (spot y forwards) usando quantlib en Python. Dados los siguientes parámetros:
- Tipos nacionales y extranjeros sin riesgo
- Puntos al contado y a plazo actuales del mercado para el activo subyacente (vencimiento en la fecha de ejercicio de la opción más tenor) - aparte, ¿se adelanta el vencimiento en caso de ejercicio anticipado de la opción?
- Volatilidad aproximada del subyacente (utilizando precios históricos)
- Precio de ejercicio
- Fecha de expiración
- Fecha de vencimiento
Esto es lo que he probado hasta ahora:
# QuantLib date settings
todayDate = ql.Date().todaysDate()
ql.Settings.instance().evaluationDate = todayDate
dayCount = ql.ActualActual()
volatilityHandle = ql.BlackVolTermStructureHandle(
ql.BlackConstantVol(todayDate, ql.NullCalendar(), ql.QuoteHandle(ql.SimpleQuote(req.Volatility)), dayCount)
)
# define the option
option = ql.VanillaOption(
ql.PlainVanillaPayoff(ql.Option.Call, req.StrikePrice), ql.AmericanExercise(req.ExpirationDate)
)
# build the process
localInterestRateHandle = ql.YieldTermStructureHandle(
ql.FlatForward(todayDate, req.LocalInterestRate / 100, dayCount)
)
# this is the one big issue - for FX options, both the domestic and
# foreign risk-free rates have to be considered, but the
# BlackScholesProcess does not cater for this.
# foreignInterestRateHandle = ql.YieldTermStructureHandle(
# ql.FlatForward(todayDate, req.ForeignInterestRate / 100, dayCount)
# )
process = ql.BlackScholesProcess(
ql.QuoteHandle(ql.SimpleQuote(req.SpotPrice + req.ForwardPoints)),
localInterestRateHandle,
volatilityHandle,
)
# set the pricing engine
option.setPricingEngine(ql.MCAmericanEngine(process, "pseudorandom", timeSteps=100, requiredSamples=1000))
return GetOptionValueResponse(OptionValue=option.NPV())
El mayor problema es que (como se ha comentado), el BlackScholesProcess
no tiene en cuenta las RFR nacionales y extranjeras. El sitio GarmanKohlagenProcess
funciona para las opciones europeas, pero no he visto un proceso similar para las opciones americanas.
Para mayor claridad, esta es la clase de solicitud que se pasa a la función:
@dataclass
class GetOptionValueRequest:
"""The request parameters of the GetEuropeanOptionValue service."""
SpotPrice: float
"""The latest spot price of the underlying asset."""
ForwardPoints: float
"""The latest forward points of the underlying asset."""
StrikePrice: float
"""The strike price of the option."""
ExpirationDate: date
"""The expiration date of the option in days."""
LocalInterestRate: float
"""The risk-free interest rate of the local currency as a percentage"""
ForeignInterestRate: float
"""The risk-free interest rate of the foreign currency as a percentage"""
Volatility: float
"""The volatility of the underlying asset"""