Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_specfun_opt_jumpdiff_merton_price (s30ja)

## Purpose

nag_specfun_opt_jumpdiff_merton_price (s30ja) computes the European option price using the Merton jump-diffusion model.

## Syntax

[p, ifail] = s30ja(calput, x, s, t, sigma, r, lambda, jvol, 'm', m, 'n', n)
[p, ifail] = nag_specfun_opt_jumpdiff_merton_price(calput, x, s, t, sigma, r, lambda, jvol, 'm', m, 'n', n)

## Description

nag_specfun_opt_jumpdiff_merton_price (s30ja) uses Merton's jump-diffusion model (Merton (1976)) to compute the price of a European option. This assumes that the asset price is described by a Brownian motion with drift, as in the Black–Scholes–Merton case, together with a compound Poisson process to model the jumps. The corresponding stochastic differential equation is,
 (dS)/(S) = (α − λk) dt + σ̂ dWt + dqt . $dS S = (α-λk) dt + σ^ dWt + dqt .$
Here α$\alpha$ is the instantaneous expected return on the asset price, S$S$; σ̂2${\stackrel{^}{\sigma }}^{2}$ is the instantaneous variance of the return when the Poisson event does not occur; dWt${dW}_{t}$ is a standard Brownian motion; qt${q}_{t}$ is the independent Poisson process and k = E[Y1]$k=E\left[Y-1\right]$ where Y1$Y-1$ is the random variable change in the stock price if the Poisson event occurs and E$E$ is the expectation operator over the random variable Y$Y$.
This leads to the following price for a European option (see Haug (2007))
 ∞ Pcall = ∑ ( e − λT (λT)j )/(j ! )Cj(S,X,T,r,σj′), j = 0
$Pcall = ∑ j=0 ∞ e-λT (λT)j j! Cj ( S, X, T, r, σj′ ) ,$
where T$T$ is the time to expiry; X$X$ is the strike price; r$r$ is the annual risk-free interest rate; Cj(S,X,T,r,σj)${C}_{j}\left(S,X,T,r,{\sigma }_{j}^{\prime }\right)$ is the Black–Scholes–Merton option pricing formula for a European call (see nag_specfun_opt_bsm_price (s30aa)).
 σj′ = sqrt( z2 + δ2 (j/T) ) , z2 = σ2 − λ δ2 , δ2 = (γ σ2)/(λ) ,
$σj′ = z2 + δ2 ( j T ) , z2 = σ2 - λ δ2 , δ2 = γ σ2 λ ,$
where σ$\sigma$ is the total volatility including jumps; λ$\lambda$ is the expected number of jumps given as an average per year; γ$\gamma$ is the proportion of the total volatility due to jumps.
The value of a put is obtained by substituting the Black–Scholes–Merton put price for Cj (S,X,T,r,σj)${C}_{j}\left(S,X,T,r,{\sigma }_{j}^{\prime }\right)$.

## References

Haug E G (2007) The Complete Guide to Option Pricing Formulas (2nd Edition) McGraw-Hill
Merton R C (1976) Option pricing when underlying stock returns are discontinuous Journal of Financial Economics 3 125–144

## Parameters

### Compulsory Input Parameters

1:     calput – string (length ≥ 1)
Determines whether the option is a call or a put.
calput = 'C'${\mathbf{calput}}=\text{'C'}$
A call. The holder has a right to buy.
calput = 'P'${\mathbf{calput}}=\text{'P'}$
A put. The holder has a right to sell.
Constraint: calput = 'C'${\mathbf{calput}}=\text{'C'}$ or 'P'$\text{'P'}$.
2:     x(m) – double array
m, the dimension of the array, must satisfy the constraint m1${\mathbf{m}}\ge 1$.
x(i)${\mathbf{x}}\left(i\right)$ must contain Xi${X}_{\mathit{i}}$, the i$\mathit{i}$th strike price, for i = 1,2,,m$\mathit{i}=1,2,\dots ,{\mathbf{m}}$.
Constraint: x(i)z ​ and ​ x(i) 1 / z ${\mathbf{x}}\left(\mathit{i}\right)\ge z\text{​ and ​}{\mathbf{x}}\left(\mathit{i}\right)\le 1/z$, where z = x02am () $z=\mathbf{x02am}\left(\right)$, the safe range parameter, for i = 1,2,,m$\mathit{i}=1,2,\dots ,{\mathbf{m}}$.
3:     s – double scalar
S$S$, the price of the underlying asset.
Constraint: sz ​ and ​s1.0 / z${\mathbf{s}}\ge z\text{​ and ​}{\mathbf{s}}\le 1.0/z$, where z = x02am()$z=\mathbf{x02am}\left(\right)$, the safe range parameter.
4:     t(n) – double array
n, the dimension of the array, must satisfy the constraint n1${\mathbf{n}}\ge 1$.
t(i)${\mathbf{t}}\left(i\right)$ must contain Ti${T}_{\mathit{i}}$, the i$\mathit{i}$th time, in years, to expiry, for i = 1,2,,n$\mathit{i}=1,2,\dots ,{\mathbf{n}}$.
Constraint: t(i)z${\mathbf{t}}\left(\mathit{i}\right)\ge z$, where z = x02am () $z=\mathbf{x02am}\left(\right)$, the safe range parameter, for i = 1,2,,n$\mathit{i}=1,2,\dots ,{\mathbf{n}}$.
5:     sigma – double scalar
σ$\sigma$, the annual total volatility, including jumps.
Constraint: sigma > 0.0${\mathbf{sigma}}>0.0$.
6:     r – double scalar
r$r$, the annual risk-free interest rate, continuously compounded. Note that a rate of 5% should be entered as 0.05.
Constraint: r0.0${\mathbf{r}}\ge 0.0$.
7:     lambda – double scalar
λ$\lambda$, the number of expected jumps per year.
Constraint: lambda > 0.0${\mathbf{lambda}}>0.0$.
8:     jvol – double scalar
The proportion of the total volatility associated with jumps.
Constraint: 0.0jvol < 1.0$0.0\le {\mathbf{jvol}}<1.0$.

### Optional Input Parameters

1:     m – int64int32nag_int scalar
Default: The dimension of the array x.
The number of strike prices to be used.
Constraint: m1${\mathbf{m}}\ge 1$.
2:     n – int64int32nag_int scalar
Default: The dimension of the array t.
The number of times to expiry to be used.
Constraint: n1${\mathbf{n}}\ge 1$.

ldp

### Output Parameters

1:     p(ldp,n) – double array
ldpm$\mathit{ldp}\ge {\mathbf{m}}$.
The leading m × n${\mathbf{m}}×{\mathbf{n}}$ part of the array p contains the computed option prices.
2:     ifail – int64int32nag_int scalar
${\mathrm{ifail}}={\mathbf{0}}$ unless the function detects an error (see [Error Indicators and Warnings]).

## Error Indicators and Warnings

Errors or warnings detected by the function:
ifail = 1${\mathbf{ifail}}=1$
On entry, calput = 'C'${\mathbf{calput}}=\text{'C'}$ or 'P'$\text{'P'}$.
ifail = 2${\mathbf{ifail}}=2$
On entry, m0${\mathbf{m}}\le 0$.
ifail = 3${\mathbf{ifail}}=3$
On entry, n0${\mathbf{n}}\le 0$.
ifail = 4${\mathbf{ifail}}=4$
On entry, x(i) < z${\mathbf{x}}\left(\mathit{i}\right) or x(i) > 1 / z${\mathbf{x}}\left(\mathit{i}\right)>1/z$, where z = x02am()$z=\mathbf{x02am}\left(\right)$, the safe range parameter.
ifail = 5${\mathbf{ifail}}=5$
On entry, s < z${\mathbf{s}} or s > 1.0 / z${\mathbf{s}}>1.0/z$, where z = x02am()$z=\mathbf{x02am}\left(\right)$, the safe range parameter.
ifail = 6${\mathbf{ifail}}=6$
On entry, t(i) < z${\mathbf{t}}\left(\mathit{i}\right), where z = x02am()$z=\mathbf{x02am}\left(\right)$, the safe range parameter.
ifail = 7${\mathbf{ifail}}=7$
On entry, sigma0.0${\mathbf{sigma}}\le 0.0$.
ifail = 8${\mathbf{ifail}}=8$
On entry, r < 0.0${\mathbf{r}}<0.0$.
ifail = 9${\mathbf{ifail}}=9$
On entry, lambda0.0${\mathbf{lambda}}\le 0.0$.
ifail = 10${\mathbf{ifail}}=10$
On entry, jvol < 0.0${\mathbf{jvol}}<0.0$ or jvol1.0${\mathbf{jvol}}\ge 1.0$.
ifail = 12${\mathbf{ifail}}=12$
On entry, ldp < m$\mathit{ldp}<{\mathbf{m}}$.

## Accuracy

The accuracy of the output is dependent on the accuracy of the cumulative Normal distribution function, Φ$\Phi$, occurring in Cj${C}_{j}$. This is evaluated using a rational Chebyshev expansion, chosen so that the maximum relative error in the expansion is of the order of the machine precision (see nag_specfun_cdf_normal (s15ab) and nag_specfun_erfc_real (s15ad)). An accuracy close to machine precision can generally be expected.

None.

## Example

```function nag_specfun_opt_jumpdiff_merton_price_example
put = 'C';
lambda = 3;
s = 45;
sigma = 0.25;
r = 0.1;
jvol = 0.4;
x = [55.0];
t = [0.25];

[p, ifail] = nag_specfun_opt_jumpdiff_merton_price(put, x, s, t, sigma, r, lambda, jvol);

fprintf('\nMerton Jump-Diffusion Model\n European Call :\n');
fprintf('  Spot       =   %9.4f\n', s);
fprintf('  Volatility =   %9.4f\n', sigma);
fprintf('  Rate       =   %9.4f\n', r);
fprintf('  Jumps      =   %9.4f\n', lambda);
fprintf('  Jump Vol   =   %9.4f\n\n', jvol);

fprintf('   Strike    Expiry   Option Price\n');
for i=1:1
for j=1:1
fprintf('%9.4f %9.4f %9.4f\n', x(i), t(j), p(i,j));
end
end
```
```

Merton Jump-Diffusion Model
European Call :
Spot       =     45.0000
Volatility =      0.2500
Rate       =      0.1000
Jumps      =      3.0000
Jump Vol   =      0.4000

Strike    Expiry   Option Price
55.0000    0.2500    0.2417

```
```function s30ja_example
put = 'C';
lambda = 3;
s = 45;
sigma = 0.25;
r = 0.1;
jvol = 0.4;
x = [55.0];
t = [0.25];

[p, ifail] = s30ja(put, x, s, t, sigma, r, lambda, jvol);

fprintf('\nMerton Jump-Diffusion Model\n European Call :\n');
fprintf('  Spot       =   %9.4f\n', s);
fprintf('  Volatility =   %9.4f\n', sigma);
fprintf('  Rate       =   %9.4f\n', r);
fprintf('  Jumps      =   %9.4f\n', lambda);
fprintf('  Jump Vol   =   %9.4f\n\n', jvol);

fprintf('   Strike    Expiry   Option Price\n');
for i=1:1
for j=1:1
fprintf('%9.4f %9.4f %9.4f\n', x(i), t(j), p(i,j));
end
end
```
```

Merton Jump-Diffusion Model
European Call :
Spot       =     45.0000
Volatility =      0.2500
Rate       =      0.1000
Jumps      =      3.0000
Jump Vol   =      0.4000

Strike    Expiry   Option Price
55.0000    0.2500    0.2417

```