Supplement to the paper "Valuation of volatility-dependent derivatives under decoupled time-changed Lévy process". Implementation of the pricing formula for a target volatility option under some decoupled time-changed finite activity Lévy processes.


In this notebook we have implemented the pricing formula (6.2) for the general model from subsection 7.7.  The dynamics of the underlying stock and volatility processes are given by:

d (Subscript[S, t])=r (Subscript[S, \(t\^_\)])dt+ (Sqrt[(Subscript[v, t])]) (Subscript[S, \(t\^_\)])d (Subscript[(W^1), t])+(Subscript[S, \(t\^_\)]) J d (Subscript[N, t])- κ (Subscript[λ, t ]) (Subscript[S, \(t\^_\)]) dt;
d (Subscript[v, t])=α (θ - (Subscript[v, t])) dt+ η(Sqrt[(Subscript[v, t])])d(Subscript[(W^2), t]);
d (Subscript[λ, t])=(Subscript[α, λ]) ((Subscript[α, λ]) - (Subscript[λ, t])) dt+ (Subscript[η, λ])(Sqrt[(Subscript[λ, t])])d (Subscript[Z, t]).

The processes involved are distibuted as follows: (Subscript[(W^1), t]) and (Subscript[(W^2), t]) are Brownian motions having correlation ρt independent from a third Brownian motion (Subscript[Z, t]). (Subscript[N, t]) is an arrival process that conditional to the process (Subscript[λ, t]) is of Poisson type, and it is independent from the Brownian components. J is a jump size variable normally distrubuted with parameters (Log(1+κ)-(δ^2)/2, (δ^2)) also independent form every other process. 
This model is attributed to Fang [20], but with obvious parameter choices we can extrapolate prices from the models by Heston [26], Merton [41], and Bates [2], which all represent particular cases of Fang's in the DTC theory. By setting :

NULL := 0.00000001;

the Heston model is obtained by (Subscript[λ, 0])=κ=δ=(Subscript[α, λ])=(Subscript[θ, λ])=(Subscript[η, λ])=NULL, Merton from α=θ=η=(Subscript[α, λ])=(Subscript[α, λ])=(Subscript[η, λ])=NULL, and Bates by (Subscript[α, λ])=(Subscript[θ, λ])=(Subscript[η, λ])=NULL.

The following function implements the Laplace Transform for the Square-Root SDE (Dufresne, [16]):

SquareRootModelLaplaceTransform[τ_, 
        v_, α_, θ_, η_, x_] := 
      Module[{P, Y, W, A, B}, 
        P = Sqrt[α^2 + 2 η^2  x]; 
Y = 
          P τ/2; 
W = 
          P Cosh[Y] + α Sinh[
                Y]; 
A = (P Exp[α τ/2]/
                  W)^(2 α θ/η^2); 
B = 
          2 Sinh[Y]/W; 
A Exp[-x v B]]

The characteristic function of the joint distribution of the jumps for the asset price and the realised volatility process is :

JointAssetAndVarianceJumpsCF[κ_, δ_, z_, w_] := 
      Module[{k, d}, 
        d = 1 - 2 I δ^2 w; 
k = 
          Log[1 + κ] - δ^2/
              2; 
Exp[(I k z - δ^2 z^2/2 + 
                  I k^2 w)/d]/Sqrt[d]]

We need to assembly the two former functions into the leverage-risk-neutral characteristic function Φ described in sections 4. This is done by the following:

Off[General::spell]
Off[General::spell1]

LeverageNeutralJointCF[v0_, t0_, 
        t_, α_, θ_, η_, λ0_, αλ_, θλ_, ηλ_, ρ_, κ_, δ_, z_, w_] := 
      Module[{τ, β, αz, θz}, τ = 
          t - t0; 
β = 
          I ρ η z; 
αz = α - β; 
θz = α θ/αz; 
SquareRootModelLaplaceTransform[τ, 
            v0, αz, θz, η, z^2/2 + I z/2 - I w] 
          SquareRootModelLaplaceTransform[τ, λ0, αλ, θλ, ηλ, 
            I z κ - 
              JointAssetAndVarianceJumpsCF[κ, δ, z, w] + 
              1]]

This is in effect the coding of equation (7.35). The Fourier Transform of the TVO payoff is:

TVOFourierTransform[K_, z_, w_] := 
      K^(1 + z I) (1 + I)/((z I - z^2) Sqrt[w])

The inverse Fourier numerical integral of the product of the previous two function yield the main pricing formula:

TVOCallPrice[Target_, St0_, K_, Rv_, r_, t0_, t_, 
        v0_, α_, θ_, η_, ρ_, λ0_, δ_, κ_, αλ_, θλ_, ηλ_, Bound_, 
        im_] := Module[{τ}, τ = 
          t - t0; 
Target Sqrt[t]*
          Exp[-r τ]/(Sqrt[2] 4  Pi^{3/2}) Chop[
            NIntegrate[
              Exp[-I (z + I im) (Log[St0] + r τ) - 
                    I (w + I im) Rv] 
                LeverageNeutralJointCF[v0, t0, 
                  t, α, θ, η, λ0, αλ, θλ, ηλ, ρ, κ, δ, -z - I im, -w - I im] 
                TVOFourierTransform[K, z + I im, w + I im], {z, -Bound, 
                Bound}, {w, -Bound, Bound}, 
              Method -> MultiDimensional]]]

Following we perform the calculations for the figures shown in tables 2 to 6 in Sec.8 for each given model.  The model parameters estimations are found in table 1; the market and contract data are:

\(\(\ \ \ \ \)\(Table\ 2 : S\_\(t\_0\) = 100, \ K = 80, 
      t\_0 = 1, t = 2.5, r = 0.06, \ 
      TV\_\(t\_0\) = 0.23, 
\ \ \ \ Table\ 3 : S\_\(t\_0\) = 100, \ K = 120, 
      t\_0 =  .5, t = 4, r = 0.039, \ 
      TV\_\(t\_0\) = 0.08, 
\ \ \ \ Table\ 4 : S\_\(t\_0\) = 100, \ 
      K = 100, \ t\_0 = 1.2, t = 1.5, r = 0.072, \ 
      TV\_\(t\_0\) = 0.31, 
\ \ \ \ Table\ 5 : S\_\(t\_0\) = 100, \ 
      K = 60, \ t\_0 = 3, t = 6, r = 0.0225, 
      TV\_\(t\_0\) = 0.71, 
\ \ \ \ Table\ 6 : S\_\(t\_0\) = 100, \ K = 140, 
      t\_0 = 0.75, t = 5, r = 0.09, 
      TV\_\(t\_0\) = \(\(0.19\)\(.\)\(
\)\)\)\)

The target volatility parameter has set to be constant to 0.1 across every market environment.

Off[NIntegrate::slwcon]
Off[NIntegrate::ncvb]

Heston model, tables 2 to 6:

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 80, 0.23, 0.06, 1, 2.5,  .15^2, 
        4.57,  .0306,  .48, - .82, NULL, NULL, NULL, NULL, NULL, NULL, 
        500, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 120, 0.08, 0.039,  .5, 4,  .15^2, 
        4.57,  .0306,  .48, - .82, NULL, NULL, NULL, NULL, NULL, NULL, 
        600, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 100, 0.31, 0.072, 1.2, 1.5,  .15^2, 
        4.57,  .0306,  .48, - .82, NULL, NULL, NULL, NULL, NULL, NULL, 
        1800, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 60, 0.71, 0.0225, 3, 6,  .15^2, 
        4.57,  .0306,  .48, - .82, NULL, NULL, NULL, NULL, NULL, NULL, 
        800, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 140, 0.19, 0.09,  .75, 5,  .15^2, 
        4.57,  .0306,  .48, - .82, NULL, NULL, NULL, NULL, NULL, NULL, 
        800, 2]]

Merton model, tables 2 to 6:

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 80, 0.23, 0.06, 1, 2.5,   .12^2, NULL, NULL, 
        NULL, NULL, 1.42, 0.0894, -0.075, NULL, NULL, NULL, 1200, 
        2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 120, 0.08, 0.039,  .5, 4,   .12^2, NULL, NULL, 
        NULL, NULL, 1.42, 0.0894, -0.075, NULL, NULL, NULL, 800, 
        2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 100, 0.31, 0.072, 1.2, 1.5,   .12^2, NULL, 
        NULL, NULL, NULL, 1.42, 0.0894, -0.075, NULL, NULL, NULL,  2550, 
        2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 60, 0.71, 0.0225, 3, 6,   .12^2, NULL, NULL, 
        NULL, NULL, 1.42, 0.0894, -0.075, NULL, NULL, NULL,  1050, 
        2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 140, 0.19, 0.09,  .75, 5,   .12^2, NULL, NULL, 
        NULL, NULL, 1.42, 0.0894, -0.075, NULL, NULL, NULL,  550, 
        2]]

Bates model, tables 2 to 6:

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 80, 0.23, 0.06, 1, 2.5,  .15^2, 
        8.93,  .0167,  .22, - .58, 0.39, 0.1049, -0.11, NULL,  
        NULL,  NULL, 1000, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 120, 0.08, 0.039,  .5, 4,  .15^2, 
        8.93,  .0167,  .22, - .58, 0.39, 0.1049, -0.11, NULL,  
        NULL,  NULL, 700, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 100, 0.31, 0.072, 1.2, 1.5,  .15^2, 
        8.93,  .0167,  .22, - .58, 0.39, 0.1049, -0.11, NULL,  
        NULL,  NULL, 1600, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 60, 0.71, 0.0225, 3, 6,  .15^2, 
        8.93,  .0167,  .22, - .58, 0.39, 0.1049, -0.11, NULL, NULL, 
        NULL, 500, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 140, 0.19, 0.09,  .75, 5,  .15^2, 
        8.93,  .0167,  .22, - .58, 0.39, 0.1049, -0.11, NULL, NULL, 
        NULL, 500, 2]]

Fang model, tables 2 to 6:

AbsoluteTiming[
        TVOCallPrice[ .1, 100, 80, 0.23, 0.06, 1, 2.5,  .14^2, 
          6.5,  .0104,  .2, - .48, 0.41,  .2168, -0.21, 5.06, 0.13, 
          1.069, 1500, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 120, 0.08, 0.039,  .5, 4,  .14^2, 
        6.5,  .0104,  .2, - .48, 0.41,  .2168, -0.21, 5.06, 0.13, 
        1.069, 900, 2]]

AbsoluteTiming[
        TVOCallPrice[ .1, 100, 100, 0.31, 0.072, 1.2, 1.5,  .14^2, 
          6.5,  .0104,  .2, - .48, 0.41,  .2168, -0.21, 5.06, 0.13, 
          1.069, 2900, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 60, 0.71, 0.0225, 3, 6,  .14^2, 
        6.5,  .0104,  .2, - .48, 0.41,  .2168, -0.21, 5.06, 0.13, 
        1.069, 900, 2]]

AbsoluteTiming[
      TVOCallPrice[ .1, 100, 140, 0.19, 0.09,  .75, 5,  .14^2, 
        6.5,  .0104,  .2, - .48, 0.41,  .2168, -0.21, 5.06, 0.13, 
        1.069, 780, 2]]