Mi objetivo es fijar el precio de las opciones de venta de la cesta americana utilizando el algoritmo Least squares Monte Carlo, o Longstaff-Schwartz.
Actualmente tengo el caso unidimensional trabajando con el archivo Python de abajo (estoy usando el paquete SWIG), pero me gustaría cambiar el número de funciones base usadas por el AmericanBasketEngine para asegurarme de que el precio es preciso. ¿Cómo puedo hacerlo?
Mirando el código fuente de C++, encontré el polynomOrder
argumento de palabra clave con valor por defecto 2
de la clase AmericanBasketPathPricer
. Sin embargo, no sé cómo está conectada esta clase con el MCAmericanBasketEngine
que no tiene ese argumento de palabra clave. (Nunca he programado en C
o C++
por lo que estoy bastante perdido en la fuente).
Tal vez el orden del polinomio se determine automáticamente, basándose en el requiredTolerance
? Eso sería lo ideal, pero no pude encontrar una descripción de lo que el MCAmericanBasketEngine
hace exactamente en cualquier lugar.
from QuantLib import *
d=1 #To be increased...
todaysDate = Date(15,May,1998)
Settings.instance().evaluationDate = todaysDate
settlementDate = Date(17,May,1998)
riskFreeRate = FlatForward(settlementDate, 0.05, Actual365Fixed())
payoff = PlainVanillaPayoff(Option.Put, 100.0)
underlying1 = SimpleQuote(100.0)
volatility1 = BlackConstantVol(todaysDate, TARGET(), 0.30, Actual365Fixed())
dividendYield1 = FlatForward(settlementDate, 0.00, Actual365Fixed())
process1 = BlackScholesMertonProcess(QuoteHandle(underlying1),
YieldTermStructureHandle(dividendYield1),
YieldTermStructureHandle(riskFreeRate),
BlackVolTermStructureHandle(volatility1))
procs = StochasticProcessVector()
procs.push_back(process1)
matrix = Matrix(1,1)
matrix[0][0] = 1.0
process = StochasticProcessArray(procs, matrix)
american_exercise = AmericanExercise(Date(17,May,1998),Date(17,May,1999))
basketoption = BasketOption(AverageBasketPayoff(payoff,d),american_exercise)
basketoption.setPricingEngine(
MCAmericanBasketEngine(
process,
'pseudorandom',
polynomOrder = 2,#keyword does not exist
timeStepsPerYear = 100,
requiredTolerance = 0.01,
#seed = 42))
)
)
print(basketoption.NPV())