The characteristic function of the VGSA model is defined as a specific parameterization of the characteristic function of the CIR (Cox-Ingersol-Ross mean reverting process) time-change:

$ \mathbb{E}e^{iuY(t)} = \varphi_{VGSA}(u,t,y(0),\kappa, \eta, \lambda) = A(u,t,\kappa,\eta,\lambda)e^{B(u,t,\kappa,\lambda)y(0)} $

Where \begin{align*} A(u,t,\kappa,\eta,\lambda) &= \frac{\exp\Big( \frac{\kappa^2\eta t}{\lambda^2} \Big) }{\Big( \cosh(\gamma t/2) + \frac{\kappa}{\gamma}\sinh(\gamma t/2) \Big)^{\frac{2\kappa\eta}{\lambda^2}}}\\ B(u,t,\kappa,\lambda) &= \frac{2iu}{\kappa + \gamma\coth(\gamma t/2)}\\ \gamma &= \sqrt{\kappa^2-2\lambda^2iu} \end{align*}

The VGSA characteristic function is given by: $ \mathbb{E}e^{iuZ_{VGSA}(t)} = \varphi_{VGSA}(-i\Psi_{VG}(u), t, \nu^{-1}, \kappa, \eta, \lambda) $

Where $\Psi_{VG}(u)$ is the log characteristic function of Variance Gamma at unit time:

$ \Psi_{VG}(u) = -\frac{1}{\nu}\log(1-iu\nu\theta + \sigma^2\nu u^2/2) $

The cumulant generating function satisfies:

$ G(w) = \ln \mathbb{E}e^{wX} = \ln(\varphi_{VGSA}(-iw)) $

Its $n$-th cumulant is the $n$-th derivative of the cumulant generating function evaluated at zero: $ c_n = G^{(n)}(0) = \frac{-i\varphi_{VGSA}^{(n)}(0)}{\varphi_{VGSA}(0)} $

I need the first, second, and fourth cumulants in order to price VGSA using the Fourier-cosine method.

Does anyone have these cumulants or know if they even exist in closed form?

  • $\begingroup$ Hi Stavros Soutis, welcome to Quant.SE! $\endgroup$
    – Bob Jansen
    Dec 23, 2015 at 6:32

1 Answer 1


I recently came across the same problem, though for different asset dynamics. I usually use one of two approaches:

1) Symbolic Differentiation

Use a compute algebra system such as Mathematica or SymPy to get analytic expressions for the higher-order cumulants. The advantage is that you get exact expressions with no approximation errors. These can however get very lengthy and potentially lead to inefficient code. The fourth cumulant of the Heston model for example already spans half a page at 11pt.

2) Automatic Differentiation

Use an automatic differentiation (AD) library that supports complex numbers. In C++ for example I use CppAD from the COIN-OR project. You make your code AD-ready by templating the complex data type in your cumulant generating function implementation, i.e.

template<typename Type>
Type cumulantFunction(double maturity,
                      Type omega) const
    // your implementation

The AD library can then compute exact derivatives of any order without you having to explicitly implement anything. See also this blog post for some more details.


I prefer to use the analytic derivatives for performance-critical production code when feasible as I found that these are usually computed faster than via AD. For higher-order derivatives and/or relatively involved expressions I resort to AD. I also found that AD serves as a great tool for unit-testing hand-coded analytical derivatives.


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.