Stochastic Volatility

Models of Heston Type

Prof William Shaw
King's College London
[2009 update for Mathematica 7 and yet another branch cut discussion]

Coupled SDEs for Stochastic Volatility

We begin by writing down the usual Geometric Brownian Motion SDE where the volatility σ is written as the square root of a variance v:

d S= S μ d t+S (Sqrt[v]) d (Subscript[Z, 1])

The variance v is constant in the original Black-Scholes model. Now it is assumed to follow its own SDE in the form

d v=(ω-θ v)d t+ ϵ (v^γ)d (Subscript[Z, 2])

This representation models mean-reversion in the volatility or variance. We allow for a correlation ρ between d (Subscript[Z, 1])and d (Subscript[Z, 2]).

Applying Ito to the Hedging Portfolio

We cannot hold or "short" volatility as is, but we can hold a position in a second option to do the hedging. So if we consider the valuation of a volatility dependent instrument V, we shall assume that we can take long or short positions in a second (vol dep't) instrument U as well as in the underlying S. So our candidate for an instantaneously risk-neutral portfolio Π is (θ is just the "vol delta" here)

Π=V-ϕ S-θ U

As is by now standard, we apply Ito's Lemma to this portfolio to obtain:

d Π=a d S+b d v+c d t

where, with D the yield on the asset S.

a=((∂V)/(∂S))-ϕ-θ ((∂U)/(∂S))

b=((∂V)/(∂v))-θ ((∂U)/(∂v))

c=((∂V)/(∂t)) +(1/2) v  (S^2)(((∂^2)V)/(∂(S^2)))+ϵ ρ  S   (v^(γ+(1/2)))(((∂^2)V)/( ∂S ∂v))+(1/2) (ϵ^2) (v^(2 γ))(((∂^2)V)/(∂(v^2))) -ϕ D S
- θ (((∂U)/(∂t))+(1/2) v (S^2) (((∂^2)U)/(∂(S^2)))+ϵ ρ  S (v^(γ+(1/2)))(((∂^2)U)/(∂S ∂v)) +(1/2) (ϵ^2) (v^(2 γ))(((∂^2)U)/(∂(v^2))))

Risk-Neutralization and No-Arbitrage

Clearly we wish to eliminate the stochastic component of risk by setting a = b = 0, so we obtain the hedge parameters in the form:

θ=((∂V)/(∂v))/((∂U)/(∂v))

ϕ=((∂V)/(∂S))-θ ((∂U)/(∂S))

Note that ϕ is the net delta once both options are taken into account.

The avoidance of arbitrage, once these choices of θ, ϕ are made, is the condition:

d Π=r Π dt

These last 3 equations in combination result in a superficially messy equation, which (after some cleaning up!) results in a condition we write as:

(((∂V)/(∂t)) +(1/2) v  (S^2)(((∂^2)V)/(∂(S^2)))+ϵ ρ  S   (v^(γ+(1/2)))(((∂^2)V)/( ∂S ∂v))+(1/2) (ϵ^2) (v^(2 γ))(((∂^2)V)/(∂(v^2))) +(r-D) S((∂V)/(∂S))-r V)/((∂V)/(∂v))=(((∂U)/(∂t)) +(1/2) v  (S^2)(((∂^2)U)/(∂(S^2)))+ϵ ρ  S   (v^(γ+(1/2)))(((∂^2)U)/( ∂S ∂v))+(1/2) (ϵ^2) (v^(2 γ))(((∂^2)U)/(∂(v^2))) +(r-D) S((∂U)/(∂S))-r U)/((∂U)/(∂v))

Now V, U are an arbitrary pair of derivative contracts, so both sides of this equation are equal to some function depending only on S, v, t. So we write both sides as -f(S, v, t), where f is the real-world drift term less the market price of risk:

f=ω-v θ-Λ

This results in the following partial differential equation for V:

((∂V)/(∂t)) +(1/2) v  (S^2)(((∂^2)V)/(∂(S^2)))+ϵ ρ  S   (v^(γ+(1/2)))(((∂^2)V)/( ∂S ∂v))+(1/2) (ϵ^2) (v^(2 γ))(((∂^2)V)/(∂(v^2))) +(r-D) S((∂V)/(∂S))+((ω-v θ)-Λ) ((∂V)/(∂v))-r V=0

The Heston Model

This is a special case of this scheme where γ = 1/2, and the market price of risk function Λ = λ v. Furthermore, the real-world volatility drift is re-parametrized in the form

ω-v θ = κ (θ - v)

Heston's paper (see the Risk book on Volatility) argues there is evidence for this choice of Λ. The Heston PDE is then

((∂V)/(∂t)) +(1/2) v  (S^2)(((∂^2)V)/(∂(S^2)))+ϵ ρ  S   v(((∂^2)V)/( ∂S ∂v))+(1/2) (ϵ^2) (v^2)(((∂^2)V)/(∂(v^2))) +(r-D) S((∂V)/(∂S))+(κ θ - (κ+λ) v) ((∂V)/(∂v))-r V=0

The SDEs for Simulation and the general PDE:

If one wishes to use a Monte Carlo scheme to calculate risk-neutral expectations, we can now write it down the relevant SDEs as the pair, (with correlation ρ between the noise terms):

d S= S (r-D) d t+S (Sqrt[v]) d (Subscript[Z, 1])

d v=(κ (θ - v)-Λ)d t+ ϵ (v^γ)d (Subscript[Z, 2])

We abbreviate the second of these in the form

d v=b(v) d t+ a(v) d (Subscript[Z, 2])

In doing so we are following the notation established in the book by Lewis. In this notation the PDE is

((∂V)/(∂t)) +(1/2) v  (S^2)(((∂^2)V)/(∂(S^2)))+ρ  S   (Sqrt[v])a(v)(((∂^2)V)/( ∂S ∂v))+(1/2) (a^2)(v)(((∂^2)V)/(∂(v^2))) +(r-D) S((∂V)/(∂S))+b(v) ((∂V)/(∂v))-r V=0

This allows us to consider how to solve without reference to the particular volatility SDE - in practice we shall be driven back to the Heston class for tractability, but (see e.g. Lewis again) we can establish the principle of solution for this more general case.

Transformation of the PDE

A Preliminary Change of Variables

With regard to discounting and its S-dependence, there is a lot of similarity between this PDE and the original Black-Scholes PDE. So we begin by applying a similar set of transformations. We let, with T the maturity of the contract:

τ=T-t

x=log(S)+(r-D) (T-t)

V=W(x,v, τ) (e^(-r (T-t)))

Some routine calculus using the chain rule leads to a PDE for Win the form:

(1/2) v  ((((∂^2)W)/(∂(x^2)))-((∂W)/(∂x)) )+ρ √va(v)(((∂^2)W)/( ∂x ∂v))+(1/2) (a^2)(v)(((∂^2)W)/(∂(v^2))) +b(v) ((∂W)/(∂v))=((∂W)/(∂τ))

Fourier Transformation

We introduce the Fourier Transform (FT) in the form

W(x,v,τ)=(1/(2 π))(∫_(-∞)^∞)(e^(-i ω x)) (OverTilde[W])(ω,v,τ)dω

(OverTilde[W])(ω,v,τ)=    (∫_(-∞)^∞)(e^(i ω x)) W(x,v,τ)dx

At maturity, where τ = 0, we have

(OverTilde[W])(ω,v,0)=    (∫_(-∞)^∞)(e^(i ω x)) W(x,v,0)dx = (∫_(-∞)^∞)(e^(i ω x)) V(x,v,0)dx

which is the FT of the payoff expressed in terms of the log of the asset price.

The Transforms of some useful payoffs

We will need to be able to deal with a few common types of payoff, so it is a good idea to see how these are calculated. Their role in generating solutions to the PDE will be considered shortly.

The Vanilla Call

Here the payoff is Max[S-K, 0] in terms of our original variables. In terms of our logarithmic variables we have

V(x,v,0)=Max((e^x)-K,0)

so the Fourier transform of the payoff is of the form:

(OverTilde[(Subscript[W, C])])(ω,v,0) = (∫_(-∞)^∞)(e^(i ω x)) V(x,v,0)dx  = (∫_(-∞)^∞)(e^(i ω x)) Max((e^x)-K,0)dx 
= (∫_(Log[K])^∞)(e^(i ω x)) ((e^x)-K)dx= (∫_(Log[K])^∞)((e^((1+i ω) x)) -K (e^(i ω x)))dx

We need to check when this integral actually converges, and bear in mind that ω can be any complex number. We need the exponentials to decay as x becomes large so that the integral converges. This will ONLY happen if Im(ω) > 1. When this is true we can evaluate the integral, some simplification of which (exercise) gives:

(OverTilde[(Subscript[W, C])])(ω,v,0) = ((K^((1+i ω)))/(i ω-(ω^2)))

The Vanilla Put

Here matters go through very similarly, except that this time the integral converges only if Im(ω) < 0. When this is true we find we get an identical transform:

(OverTilde[(Subscript[W, P])])(ω,v,0) = ((K^((1+i ω)))/(i ω-(ω^2)))

The difference in this approach between the Call and the Put is in where the transform is defined, and hence where the inversion contour lies.

Digital Calls and Puts

For a Digital Call the transformed payoff is

(Subscript[(OverTilde[W]), DC])(ω,v,0) = ((-(K^(i ω)))/(i ω))

subject to Im(ω) > 0. For a digital put we have

(Subscript[(OverTilde[W]), DP])(ω,v,0) = ((+(K^(i ω)))/(i ω))

subject to the condition Im(ω) < 0.

Transformed PDE

Recall that the (x, v, τ) PDE for W was

(1/2) v  ((((∂^2)W)/(∂(x^2)))-((∂W)/(∂x)) )+ρ (Sqrt[v])a(v)(((∂^2)W)/( ∂x ∂v))+(1/2) (a^2)(v)(((∂^2)W)/(∂(v^2))) +b(v) ((∂W)/(∂v))=((∂W)/(∂τ))

We now have:

W(x,v,τ)=(1/(2 π))(∫_(-∞)^∞)(e^(-i ω x)) (OverTilde[W])(ω,v,τ)dω

so that differentiation w.r.t x bcomes multiplication by -i ω in the transform.

(1/2) (a^2)(v)(((∂^2)(OverTilde[W]))/(∂(v^2))) +(b(v) - i ω ρ (Sqrt[v])a(v))((∂(OverTilde[W]))/(∂v))-(1/2) v ((ω^2)-i ω) (OverTilde[W])=((∂(OverTilde[W]))/(∂τ))

The Fundamental Solution

Suppose that we can find a solution of this PDE, say G(ω, v, τ), with the property that G(ω, v, 0) = 1. Then the solution to the transformed PDE with payoff condition (OverTilde[W])(ω, v, 0)  (which does NOT in fact depend on v) is just the product of this with G. Then the solution to our original PDE is just the discounted value of this with our various coordinate changes unwound:

V=(1/(2 π))(e^(-r (T-t))) (∫_(i c-∞)^(i c+∞))(e^(-i ω x)) (OverTilde[W])(ω,v,0) G(ω,v,T-t)dω

where

x=log(S)+(r-D) (T-t)

Greeks for free(-ish)

Before figuring out G, we should point out that this is a remarkably useful representation! If you want to differentiate V with respect to S to obtain Δ you merely multiply the integrand by

-(i ω)/S

and for Γ the integrand is multiplied by

-((ω^2)/(S^2))

This representation also makes obvious the link between ρ and Δ. (Check it by noting that r appears in two places).

Finding the Fundamental Solution

So far we have done a lot of fancy analysis without yet solving a PDE. Now we really do have to. We need to find G. The book by Lewis discusses how to do this with more general market price of risk functions, but here we will stick to Heston specification in this regard. Keeping γ general for a moment longer, but otherwise inserting the forms of a and b specific to Heston's model, we now have:

((∂G)/(∂τ))=(1/2) (ϵ^2)(v^(2γ))(((∂^2)G)/(∂(v^2))) -(1/2) v ((ω^2)-i ω) G+(κ (θ-v)-λ v - i ω ϵ ρ (v^(γ+1/2)))((∂G)/(∂v))

subject to the condition G(ω, v, 0) = 1.

So far as your lecturer is aware, it is only known how to solve this in the case γ = 1/2. In this case the PDE coefficients all become linear in v:

((∂G)/(∂τ))=(1/2) (ϵ^2)v(((∂^2)G)/(∂(v^2))) -(1/2) v ((ω^2)-i ω) G+(κ (θ-v)-λ v - i ω ϵ ρ v)((∂G)/(∂v))

What Heston did (though he did not quite present things this way, doing instead an analysis of vanilla calls in detail) was to try to find a solution in the form

G=(e^(C[τ,ω]+v D[τ,ω]))

You may recall such a device was used to deal with bond-pricing equations in affine models. Here it works just as neatly. We also demand that

C[0,ω]=0=D[0,ω]

in order to satisfy the condition that G=1 at maturity. If we substitute this assumption for the form of G into the PDE we obtain the condition (the dots denote the τ-derivative):

(OverDot[C])+v (OverDot[D])=(1/2) (D^2) v (ϵ^2)+D ((θ-v) κ-λ v-i ω ϵ ρ v)-(1/2) v ((ω^2)-i ω)

This must be true for all v so we separately equate the terms that are independent of v and linear in v, to obtain the pair of ODEs

(OverDot[C])=θ κ D

(OverDot[D])=(1/2) (D^2) (ϵ^2)-D ( κ+λ+i ω ϵ ρ )-(1/2) ((ω^2)-i ω)

The second of these must be solved first, for D; then the first must be solved for C. The solutions are most easily expressed in terms of some auxiliary functions d, g defined as follows:

d=√(((ω^2)-i ω) (ϵ^2)+(((κ+λ+i ϵ ρ ω))^2))

g=(κ+λ+i ϵ ρ ω+d)/(κ+λ+i ϵ ρ ω-d)

The function D is then given by

D = (κ+λ+i ϵ ρ ω+d) /(ϵ^2) (1-(e^(d τ)))/ (1-g (e^(d τ)))

and a further integration leads to the anlaytical representation of C in the form:

C = (κ θ)/(ϵ^2)((κ+λ+i ϵ ρ ω+d) τ - 2 Log[ (1-g (e^(d τ)))/ (1-g)])

It is however, better, if slower to do direct numerical integration of the ODE for C as you avoid the branch cut difficulties arising from the choice of the branch of the complex log. Alternatively one can rewrite the solution to manage the log in a different way. This concludes the solution of the model. All that remains, to price instruments, is to work out the inverse transform integrals.

Implementation

How you implement these things depends a LOT on how complex-number-friendly your computing environment is. If the system can cope with complex functions and their integrals, you just get on with it. 

First we do the reliable but slow version where the Log is avoided in favour of a numerical integration:

GFundTrans[τ_, ω_, v_, κ_, λ_, θ_, ϵ_, ρ_] := 
Module[{s, d = Sqrt[(κ+λ + ρ*ϵ*I*ω )^2 +ϵ^2 (ω^2 - I*ω)], g, DD, CC},
g = (κ+λ + ρ*ϵ*I*ω + d)/(κ+λ + ρ*ϵ*I*ω - d);
DD[s_] := ((κ+λ + ρ*ϵ*I*ω + d)/ϵ^2)*(1 - Exp[d*s])/(1-g*Exp[d*s]);
CC := κ*θ*NIntegrate[DD[s], {s, 0, τ}];
Exp[CC+DD[τ]*v]]

HestonCall[S_, K_, σ_, r_, D_, t_, T_, κ_, θ_, ϵ_, ρ_, λ_, trunc_]:= 
Module[{v = σ^2, τ = T-t, im = 2}, 
Exp[-r*(T-t)]/(2*Pi)Chop[NIntegrate[Exp[-I*(w+I*im)*(Log[S]+(r-D)*τ)]*GFundTrans[τ, w+I*im, v, κ, λ, θ, ϵ, ρ]*K^(1+I*(w+I*im))/(I*(w+I*im)-(w+I*im)^2), {w, -trunc, trunc}, MaxRecursion -> 16, Compiled -> False]]]

HestonPut[S_, K_, σ_, r_, D_, t_, T_, κ_, θ_, ϵ_, ρ_, λ_, trunc_]:= 
Module[{v = σ^2, τ = T-t, im = -1/4}, 
Exp[-r*(T-t)]/(2*Pi)Chop[NIntegrate[Exp[-I*(w+I*im)*(Log[S]+(r-D)*τ)]*GFundTrans[τ, w+I*im, v, κ, λ, θ, ϵ, ρ]*K^(1+I*(w+I*im))/(I*(w+I*im)-(w+I*im)^2), {w, -trunc, trunc}, MaxRecursion -> 30, WorkingPrecision -> 20, Compiled -> False]]]

Mathematica 6 and 7 are increasingly fussy and spew out some complaints about convergence that can generally be ignored, so we suppress them as follows.

Off[NIntegrate::inumr]
Off[NIntegrate::slwcon]

hcbase = HestonCall[1, 1, 0.183, Log[1.0375], Log[1.035], 0, 2, 1.29, 0.223^2, 0.431, -0.514, 0, 250]

Let's explore the "branch cut problem", first using direct numerical integration, which works well:

numheston = Table[HestonCall[100, 100, 0.2, 0.05, 0, 0, t, 2, 0.09, 1, -0.3,0, 500] , {t, 4, 20, 1}]

ListPlot[%]

On the other hand, if we just use the orginal formula, analytically:

GFundTransAnalBad[τ_, ω_, v_, κ_, λ_, θ_, ϵ_, ρ_] := 
Module[{s, d = Sqrt[(κ+λ + ρ*ϵ*I*ω )^2 +ϵ^2 (ω^2 - I*ω)], g, DD, CC},
g = (κ+λ + ρ*ϵ*I*ω + d)/(κ+λ + ρ*ϵ*I*ω - d);
DD[s_] := ((κ+λ + ρ*ϵ*I*ω + d)/ϵ^2)*(1 - Exp[d*s])/(1-g*Exp[d*s]);
CC[s_] := ((κ*θ)/ϵ^2)*((κ + λ + I*ϵ*ρ*ω+d)*s - 2*Log[(g*Exp[d*s]-1)/(g - 1)]);
Exp[CC[τ]+DD[τ]*v]]

HestonCallBad[S_, K_, σ_, r_, D_, t_, T_, κ_, θ_, ϵ_, ρ_, λ_, trunc_]:= 
Module[{v = σ^2, τ = T-t, im = 2}, 
Exp[-r*(T-t)]/(2*Pi)Chop[NIntegrate[Exp[-I*(w+I*im)*(Log[S]+(r-D)*τ)]*GFundTransAnalBad[τ, w+I*im, v, κ, λ, θ, ϵ, ρ]*K^(1+I*(w+I*im))/(I*(w+I*im)-(w+I*im)^2), {w, -trunc, trunc}, MaxRecursion -> 16, WorkingPrecision -> 16,Compiled -> False]]]

Off[NIntegrate::ncvb]

Table[HestonCallBad[100, 100, 0.2, 0.05, 0, 0, t, 2, 0.09, 1, -0.3,0, 500] , {t, 4, 20, 1}]

ListPlot[Abs[%]]

That is clearly rubbish. The Appled Mathematical Finance paper by Guo and Hung proposed (as indeed did others, notably Lord) that instead of the closed-form integral

CC[τ_] := ((κ*θ)/ϵ^2)*((κ + λ + I*ϵ*ρ*ω+d)*τ - 2*Log[(g*Exp[d*τ]-1)/(g - 1)])

we use instead the form:

CCnew[τ_] := ((κ*θ)/ϵ^2)*((κ + λ + I*ϵ*ρ*ω-d)*τ - 2*Log[(g-Exp[-d*τ])/(g - 1)])

These are mathematically equivalent, as you can see by factoring out the Log of Exp[-d τ], or using the computer:

Simplify[PowerExpand[CC[t]-CCnew[t]]]

We redefine the analytical implementation then as follows

GFundTransNew[τ_, ω_, v_, κ_, λ_, θ_, ϵ_, ρ_] := 
Module[{s, d = Sqrt[(κ+λ + ρ*ϵ*I*ω )^2 +ϵ^2 (ω^2 - I*ω)], g, DD, CC},
g = (κ+λ + ρ*ϵ*I*ω + d)/(κ+λ + ρ*ϵ*I*ω - d);
DD[s_] := ((κ+λ + ρ*ϵ*I*ω + d)/ϵ^2)*(1 - Exp[d*s])/(1-g*Exp[d*s]);
CCnew[s_] := ((κ*θ)/ϵ^2)*((κ + λ + I*ϵ*ρ*ω-d)*s - 2*Log[Exp[-d*s]*(g*Exp[d*s]-1)/(g - 1)]);
Exp[CCnew[τ]+DD[τ]*v]]

HestonCallNew[S_, K_, σ_, r_, D_, t_, T_, κ_, θ_, ϵ_, ρ_, λ_, trunc_]:= 
Module[{v = σ^2, τ = T-t, im = 2}, 
Exp[-r*(T-t)]/(2*Pi)Chop[NIntegrate[Exp[-I*(w+I*im)*(Log[S]+(r-D)*τ)]*GFundTransNew[τ, w+I*im, v, κ, λ, θ, ϵ, ρ]*K^(1+I*(w+I*im))/(I*(w+I*im)-(w+I*im)^2), {w, -trunc, trunc}, MaxRecursion -> 16, WorkingPrecision -> 16,Compiled -> False]]]

newanaldata = Table[HestonCallNew[100, 100, 0.2, 0.05, 0, 0, t, 2, 0.09, 1, -0.3,0, 500] , {t, 4, 20}]

To compare with the robust numerical integration.

newanaldata - numheston

which is good, and could be made even smaller if we fiddle with the integration parameters. A lot of ink has been spilled on the branch cut issue. If people had consistently worked out the complex log by a proper integration there would never have been a problem.

Generating a Skew

We can work out the Black-Scholes implied volatility by applying an implied calculator to the Heston price data, for fixed S and various strikes (or indeed maturity)

Ncdf[(z_)?NumberQ] := N[0.5*Erf[z/Sqrt[2]] + 0.5];
Ncdf[x_] := (1 + Erf[x/Sqrt[2]])/2

done[s_, σ_, k_, t_, r_, q_] := 
((r - q)*t + Log[s/k])/(σ*Sqrt[t]) + (σ*Sqrt[t])/2; 
dtwo[s_, σ_, k_, t_, r_, q_] := 
((r - q)*t + Log[s/k])/(σ*Sqrt[t]) - (σ*Sqrt[t])/2;

BlackScholesCall[s_, k_, v_, r_, q_, t_] := 
s*Exp[-q*t]*Ncdf[done[s, v, k, t, r, q]]-k*Exp[-r*t]*Ncdf[dtwo[s, v, k, t, r, q]]; 
BlackScholesPut[s_, k_, v_, r_, q_, t_] := 
k*Exp[-r*t]*Ncdf[-dtwo[s, v, k, t, r, q]]-s*Exp[-q*t]*Ncdf[-done[s, v, k, t, r, q]]

BlackScholesCallImpVol[s_,k_,r_,q_,t_,optionprice_]:=sd /. FindRoot[BlackScholesCall[s,k, sd, r, q, t]== optionprice,{sd,0.2}];

BlackScholesPutImpVol[s_,k_,r_,q_,t_,optionprice_] :=sd /. FindRoot[BlackScholesPut[s,k, sd, r, q, t]== optionprice,{sd,0.2}];

ivdata = Table[{K, BlackScholesCallImpVol[1, K, Log[1.0375], Log[1.035], 2.0,HestonCallNew[1, K, 0.183, Log[1.0375], Log[1.035], 0, 2.0, 1.29, 0.223^2, 0.431, -0.514, 0, 250]]}, {K,0.7, 1.3, 0.02}] ;

ivplotw=ListPlot[ivdata,PlotRange->All,PlotStyle->PointSize[0.015`]]

Calibration Issues

The selection on the non-trivial parameters can be time-consuming. Ideally one selects some market data and fits the various relevant numbers. This can be time-consuming witih the full transform model. The temptation is to use an analytic expansion, e.g. in terms of volatility - this is discussed by Lewis. My recent experience is that this tracks the full Heston model well (for 20%- ish class vols) for a narrow range of moneyness and times up to about 2 years.

Simulation Issues for Exotics

If you want to do Heston with exotics, where there is not just a simple European payoff, but there is no early exercise, then Monte Carlo simulation is called for. In sharp contrast to ordinary Black-Scholes, the coupled pair of SDEs

d S= S (r-D) d t+S (Sqrt[v]) d (Subscript[Z, 1])

d v=(κ (θ - v)-Λ)d t+ ϵ (v^(1/2))d (Subscript[Z, 2])

cannot readily be treated in terms of long jumps between dates relevant to the contract. With a simple Euler scheme

Δ S= S (r-D) Δ t+S (Sqrt[v]) Δ (Subscript[Z, 1])

Δ v=(κ (θ - v)-Λ)Δ t+ ϵ (v^(1/2))Δ (Subscript[Z, 2])

The paths have to be very finely sampled to get agreement with the exact transform solution. A full vector Milstein scheme can be written down, but it involves non-trivial double stochastic integrals, the main issue being the computation of the "Levy Stochastic Area". The second SDE is not a poblem. The first one is the hard one, because v varies stochastically during the one-time-step evolution of S. Computation of the Levy Area can be done by sub-sampling, but then you may be on safer ground going back to Euler with finer paths! See Kloeden and Platen.section 10.3 if you want to be clever with a scheme with O(Δ (t^(3/2))) error. It is a lot less hairy working with Euler, with an O(Δ t) error, and just making Δ t small.

References

P.E. Kloeden and E. Platen, Numerical Solution of Stochastic Differential Equations, Springer 1999.

Guo, J-H. and M.-W. Hung (2007). “A note on the discontinuity problem in Heston’s stochastic volatility model”, Applied Mathematical Finance, vol. 14, no. 4, pp. 339-345.

See also, Lord, AMF forthcoming (last word?)

S.L. Heston, Closed-Form Solution for Options with Stochastic Volatility, most easily found in "Volatility", ed. R. Jarrow, RISK books. 

A.L. Lewis, Option Valuation Under Stochastic Volatility, Finance Press.