I'm trying to calibrate Local stochastic volatility model using finite difference method, and I'm mainly following this referece: Tian (2015).

I met a problem when calibrating leverage function - the discritized fokker planck equation with ADI Douglas scheme will generate negative density, which leads to negative value in the integrals of leverage function and this will then break the square root calculation. However, there seems not much discussion in the references about this issue.

So my question is:

  • Is ADI supposed to preserve the positivity of the density function? (If so, this indicates my current implementation is subject to some error.)
  • If not, what should I do to avoid this?

Updates (0401):

I found that applying zero-flux boundary condition (described in QuantLib Document) helps a lot to stabilize the calibration process - no more negative integrals in square root function. The Monte Carlo roundtrip of five-year option has an error of 0.5 (compared to BS price) with ATM strike.

However, It is only stable when the time step is small (dt=1/300). If I try to use a non-uniform temporal grid which has larger time step for longer maturities, the density will lose its structure and calibration then fails. Another concern is I do see the density getting smaller as the calibration proceed in time and currently I'm fixing this by rescaling the density to one in each step.

So my current question is:

  • I implemented the zero-flux boundary condition only on boundary of v and applied a simpler boundary condition over S - assume diminishing second order term in PDE. I'm wondering if this is the correct way to do it. Should I apply zero flux on boundary of S as well? if not, what should I use?

  • How should I deal with the loss of density in calibration?

  • How can I improve the calibration stability for large time step?

Thanks a lot!

Updates (0405):

The calibration process is still not stable. Truncation at zero only helps for small time step. I think there should be something to do with the way I implement ADI scheme. Here is the details about how I deal with Fokker Planck in ADI.

I start from the Fokker Planck equation as follow: \begin{align*} \partial_{t}f = &\frac{1}{2}v\partial_{x}^2L^2f \\ &+ (-r+q)\partial_{x}f + \frac{v}{2}\partial_{x}L^2f\\ &+ \frac{\sigma^2}{2}\frac{1}{v}\partial_{z}^2f \\ &+ ((-\kappa\theta-\frac{\sigma^2}{2})\frac{1}{v} + \kappa)\partial_{z}f + \kappa\theta\frac{1}{v}f\\ &+\rho\sigma\partial_{x}\partial_{z}Lf \end{align*} where $x=log(S/S_0)$ and $z=log(v/v0)$.

Then I rewrite this into matrix form: $$\partial_{t}f = F_0+F_1+F_2 $$ $$F_0 = \sigma*\rho*dx@f@dz$$

\begin{align*} F_1=f @ &[(-\kappa*\theta-0.5*\sigma^2)*dz@Diag(1/v\_vec)\\ &+ \kappa*dz\\ &+ 0.5*\sigma^2*dz2@Diag(1/v\_vec)\\ &+\kappa*\theta*Diag(1/v\_vec)] \end{align*}

for $ j = 1,2,...,Nz:$ \begin{align*} F_2[:,j]=&[-r*dx\\ &+ 0.5*v\_vec[j]*dx@Diag(L^2)\\ &+ 0.5*v\_vec[j]*dx2@Diag(L^2)]@f[:.j] \end{align*}


  • $f$ is an $m\times n$ matrix. $L$ is a vector with length $m$. $v\_vec$ is a vector with length $n$.
  • $dx,dx2,dz,dz2$ are all differential operators (tri-diagonal matrix).
  • $Diag(A)$ represents a square matrix with $A$ being diagonal.
  • $'*'$ represents normal multiplication and $'@'$ represents matrix multiplication.

Then this form can directly fit into the ADI structure described in Tian(2015).

Could anyone see any problem in these ADI steps? Thanks a lot!
Updates (0415):

Problem solved!

The key factor is the range of the variables - especially the variable $z=log(v/v0)$. It needs to be negative enough so $v$ can be close enough to zero.

  • $\begingroup$ May I ask how you incorporated boundary conditions in your code? I am doing something similar and am struggling to incorporate boundary conditions into the ADI scheme. $\endgroup$
    – wang王茹
    Commented Jul 3, 2023 at 5:37

1 Answer 1


Yes it should preserve positivity. However due to numerical noise you may observe very small negative values on the edges of the lattice, that you can truncate to zero.

If you solve using Fokker-Planck you may want to start from $t=\delta t$ using a gaussian approximation for the density on the first step, so as to start from a smooth density.

An alternative to using Fokker-Planck is to use the discrete adjoint of the backward Kolmogorov ADI scheme, which is relatively easy to do because it amounts to reversing the steps of the ADI and using the transposed matrices. In this case you can solve directly for the discrete green functions.

  • $\begingroup$ Thanks for the replies! I'm still focusing on the forward Kolmogorov method for now. I use the bivariate normal distribution to approximate the initial density. I found that by apply no-flux boundary condition the stability of the density function through calibration process improves a lot. However, it is only stable when the time step is small (dt = 1/300). Do you by any chance have a clue about this issue? Thanks a lot! $\endgroup$
    – Dovie Chu
    Commented Apr 1, 2021 at 16:30
  • $\begingroup$ do you get the same behavior when correlation between spot and vol is zero (so that the explicit cross derivative part cancels out) ? that it is only stable when $dt$ is small suggests that the scheme is missing an implicit part. I use a generic zero second derivative condition on the boundaries, but I don't think that would make much of a difference. $\endgroup$ Commented Apr 1, 2021 at 17:02
  • $\begingroup$ Thanks so much for your kind help! I tried the zero correlation and still got the same problem. The calibration process will fail when time step get larger. I think there might be still some problem in my ADI implementation... I have updated the question with more details. I will be most grateful if you have any idea what I have done wrong. $\endgroup$
    – Dovie Chu
    Commented Apr 6, 2021 at 2:32
  • $\begingroup$ what's the SDE for the model ? are you sure the change of variable $z=\log(v/v_0)$ is appropriate ? I see some terms in $1/v$ in the diffusive part of your FP equation, that probably does not help stability. $\endgroup$ Commented Apr 6, 2021 at 7:05
  • $\begingroup$ I can get a relatively stable calibration after carefully choosing the variable range right now. Thanks a lot for all your kind helps!! $\endgroup$
    – Dovie Chu
    Commented Apr 15, 2021 at 16:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.