Creo una superficie de volatilidad a partir del mercado y la suavizo (interpolación y extrapolación), y corrijo explícitamente cualquier varianza total que disminuya en una huelga determinada a medida que aumentamos el vencimiento. Creo una superficie ql.BlackVarianceSurface con mi cuadrícula y soy capaz de fijar precios utilizando la mayoría de los motores quantlib. Sin embargo, cuando utilizo mi superficie para crear trayectorias Monte Carlo utilizando ql.BlackScholesMertonProcess y ql.GaussianMultiPathGenerator, invariablemente obtengo un error del tipo: "RuntimeError: negative local vol^2 at strike 2167.82 and time 0.138889; the black vol surface is not smooth enough". Si creo una superficie Andreasen Huge utilizando ql.AndreasenHugeVolatilityAdapter, entonces obtengo una superficie vol local que puedo utilizar para las trayectorias de Monte Carlo. Sin embargo, quiero tener más control sobre cómo se crea la superficie, así que estoy tratando de crear mi propia superficie a partir de los datos, en lugar de ejecutar AH. Si sondeo la superficie vol Ql usando vol_process.blackVol(expiry, strike), no encuentro ninguna violación de varianza total decreciente, así que creo que algo más está llevando a QL a decir que la superficie no es lo suficientemente suave.
¿Alguien sabe por qué QL puede encontrar la superficie insatisfactoria, y algo que pueda hacer / comprobar / o cambiar? Tenga en cuenta que compruebo la superficie de QL tanto para la varianza descendente como para las variaciones de la mariposa (a lo largo de los vencimientos).
muchas gracias por la ayuda