I create a vol surface from the market and do smoothing(interpolation and extrapolation), and explicitly correct for any total variance decreasing on a given strike as we increase maturity. I create a ql.BlackVarianceSurface surface with my grid and am able to price using most quantlib engines. When I use my surface to create Monte Carlo paths using ql.BlackScholesMertonProcess and ql.GaussianMultiPathGenerator,however, I invariably get an error of the type: "RuntimeError: negative local vol^2 at strike 2167.82 and time 0.138889; the black vol surface is not smooth enough". If I create an Andreasen Huge surface using ql.AndreasenHugeVolatilityAdapter, then I get a local vol surface I can use for Monte Carlo paths. However, I want to have more control about how the surface is created so I am trying to create my own surface from the data, rather than running AH. If I poll the Ql vol surface using vol_process.blackVol(expiry, strike), I don’t find any decreasing total variance violations, so I believe something else is leading QL to say the surface is not smooth enough.
Does anyone know why QL may find the surface unsatisfactory, and anything I can do/ check for/ or change? Note I check the QL surface for both falling variance and for butterfly variations (along expiries).
thank you very much for the help