The Merton Jump Diffusion Model for Option Pricing

January 12, 2025

The Merton Jump Diffusion (MJD) model was introduced in a previous article (link). It is an extension of the Black-Scholes model adding a jump part in addition to the diffusion part to model the diffusion of asset prices. We showed how to simulate the asset price, and we analysed the probability density function of the log returns under the MJD model. Particularly we analysed how jump parameters impact the moments of the distribution which is no more gaussian.

In this article we will see how to price vanilla options with the MJD model and how the different parameters impact the implied volatility smile.

The Python code is available at the end of the article.

Merton in 1976 proposed the following stochastic differential equation (SDE) for the asset price St:


dS_t=S_t*((mu-lambda*k)*dt+sigma*dW_t+dQ_t)

It contains:

  • A diffusion part with a standard wiener process W(t) (link):

μ: annualised expected return on the asset price, σ: annualised volatility of the asset price, Wt: Brownian motion.

  • A jump part with a compound Poisson process Q(t):

Qt: compound Poisson process

Q_t=sum_{i=1}^{N_t}(Y_i-1)

Yi: price ratio associated with the i-th jump happening at the random time ti. (Yi) are i.i.d, following a lognormal distribution, and are independent of Wt and Nt, Nt being a Poisson process (link) with intensity λ. E(Qt) = λ.k.t, so Qt – λ.k.t is a martingale.

Y_i=S_{t_i}/S_{t_i^-}

ln(Y_i)~N(m,delta^2)

k=E(Y_i-1)=e^{m+1/2*delta^2}-1

There is an explicit solution of this SDE:

S_t=S_0*e^((mu-1/2*sigma^2)*t+sigma*W_t)*e^(-lambda*k*t)*prod_{i=1}^{N_t}Y_i

S_t=S_0*e^{(mu-1/2*sigma^2)*t+sigma*W_t}*e^{-lambda*k*t+sum_{i=1}^{N_t}y_i}

y_i=ln(Y_i)~N(m,delta^2)

In its reference paper, Merton assumed that jumps are pure non systemic risks and are uncorrelated with market.

In this framework the risk-neutral probability used to price option will not change the jump measure. It will only impact the continuous part.

Under the risk-neutral probability (which does not change the jump measure) the discounted expectation of the asset price is a martingale if and only if μ = r (proof in Addendum 1).

So under the risk neutral probability, the asset price St follows the SDE:

The logarithm of the asset price knowing the number of jumps follows a normal distribution:

The price of a call option expiring at T with strike price K is the discounted expectation of the final payoff under the risk neutral probability.

C_0=e^{-r*T}*E^{QQ}((S_T-K)^+)

In the MJD model, it can be expressed as following:

With

CBS the Black-Scholes price of a call option,

C_{BS}(S,K,T,sigma,r)=S*N(d_1)-K*e^{-r*T}*N(d_2)

d_2={ln(S/K)-(r-sigma^2/2)*T}/{sigma*sqrt(T)}

d_1=d_2+sigma*sqrt(T)

N(x)=1/{sqrt(2*\pi)}*\int_{-oo}^xe^{-u^2/2}du

\tildeS_n=S_0*e^{-lambda*k*T+m*n+1/2*n*delta^2}

sigma_n=sqrt(sigma^2+n*delta^2/T

Proof in addendum 2.


Jumps add volatility and smile

Option prices and so Black-Scholes implied volatilities are always higher with the MJD model compared to the Black-Scholes model when using a similar volatility parameter σ as jumps create an additional source of randomness.

Moreover, as illustrated on the chart below, the implied volatility curve is no more flat in the MJD model, jumps create a smile.

In order to draw the Black-Scholes volatility smile implied by a set of parameters of the MJD model, we fix the parameters, we calculate for a range of strike prices the call option price, and then we deduce the Black-Scholes implied volatility with numerical method (link).

Volatility Smile with the MJD Model

Parameters: asset price S0 = 100, time to maturity T = 1yrs, risk-free interest rate r = 5%, volatility sigma = 20%, jump intensity lambda = 10%, average jump size m = -0.1, jump volatility delta = 0.3.

This is in line with the implied return distribution when using the MJD model. We showed in a previous article (link), that in addition to an increase of the standard deviation of the log-returns, jumps adds tail-risk (kurtosis) and asymmetry (skewness), positive or negative depending on the sign of the average jump.

Impact of the asset volatility level

As expected, the asset volatility level sigma impact the level of the implied volatility curve.

Impact of asset volatility level on the volatility smile with the MJD model

Parameters: asset price S0 = 100, time to maturity T = 1yrs, risk-free interest rate r = 5%, volatility sigma = 20%, 22%, 24%, jump intensity lambda = 10%, average jump size m = -0.1, jump volatility delta = 0.3.

Impact of the jump size

The sign of the average jump size impacts the sign of the skewness of the volatility smile. A positive (resp. negative) average jump size would lead to more tail risk on the upside (resp. downside), leading to higher implied volatilites on the right-hand side (resp. left side), i.e. a positive (resp. negative) skewness.

The size of the jumps in absolute value will impact the level of the skewness negative, or positive, depending on the sign of the average jump.

Impact of the jump size on the volatility smile with the MJD model

Parameters: asset price S0 = 100, time to maturity T = 1yrs, risk-free interest rate r = 5%, volatility sigma = 20%, jump intensity lambda = 10%, average jump size m = -0.1, 0, 0.1, jump volatility delta = 0.3.

Impact of the jump volatility

A higher volatility of jumps will increase the volatility of the asset, as it will increase the probability to have important movements of the asset price on the downside and on the upside before the expiry of the option. It will increase as well the smile of volatility with more tail risk on both sides.

Impact of the jump volatility on the volatility smile with the MJD model

Parameters: asset price S0 = 100, time to maturity T = 1yrs, risk-free interest rate r = 5%, volatility sigma = 20%, jump intensity lambda = 10%, average jump size m = -0.1, jump volatility delta = 0.3, 0.5, 0.7.

The MJD allows to incorporate jumps in the asset price diffusion, which allows for a more realistic representation of market behaviour, and can be an interesting feature particularly for the pricing of very short term options.

It gives as well more flexibility with three additional parameters compared to the Black-Scholes model to control the frequency of jumps, the average of the standard deviation of jumps.

However, more flexibility comes in general with more complexity.

Several parameters can have similar effects on the volatility smile leading to potential difficulties to estimate parameters in an accurate and stable manner.

Moreover, contrary to the Heston model for example (link), the Merton model is unable to control the term structure of the volatility smile, with limited possible shapes of the volatility surfaces.

Merton, R. C. (1976) “Option Pricing When underlying stock returns are discontinuous”, Journal of Financial Economics, 3, 125-144

K. Matsuda (2004) “Introduction to merton jump diffusion model”, Department of Economics. The Graduate Center, The City University of New York.

Import libraries

import numpy as np
from scipy.stats import norm
import math

Call price with Black-Scholes model

def CallPriceBS(S, sigma, K, T, r):
    d1 = (math.log(S / K) + (r + .5 * sigma**2) * T) / (sigma * T**.5)
    d2 = d1 - sigma * T**0.5
    n1 = norm.cdf(d1)
    n2 = norm.cdf(d2)
    DF = math.exp(-r * T)
    price=S * n1 - K * DF * n2
    return price

Call price with Merton Jump Diffusion model

def CallPriceMJD(S, sigma, K, T, r, lambda_, m, delta, N=50):

    price = 0.0
    k_ = np.exp(m + .5 * delta**2) - 1
    for n in range(N):
        # Adjusted parameters for n jumps
        sigma_n = np.sqrt(sigma ** 2 + (n / T) * delta ** 2)
        S_n = S * np.exp(-lambda_ * k_ * T + (m + .5 * delta**2) * n)
        
        # Poisson probability of n jumps
        poisson_proba = np.exp(-lambda_ * T) * (lambda_ * T) ** n / np.math.factorial(n)
        
        # Black-Scholes price with jump-adjusted parameters
        priceBS = CallPriceBS(S_n, sigma_n, K, T, r)
        
        # Summing up the weighted price by Poisson probability
        price += poisson_proba * priceBS
        
    return price

# Parameters
S = 100      # Underlying stock price
K = 100      # Strike price
T = 1.0      # Time to maturity (in years)
r = .05     # Risk-free rate
sigma = .2  # Volatility
lambda_ = .1   # Jump intensity (average jumps per year)
m = -.1  # Average jump size
delta = .3  # Jump volatility

call_price = CallPriceMJD(S, sigma, K, T, r, lambda_, m, delta)
print("Call Price (Merton Jump Diffusion):", call_price)


Addendum 1

Let’s demonstrate that with μ = r we have:

E^{QQ}(e^{-r*t}*S_t)=S_0

Addendum 2

Using the conditional expectation of the price of the final payoff we have:

C_0=e^{-r*T}*sum_{n=1}^{+oo}E^{QQ}((S_T-K)^+|N_T=n)*P(N_T=n)

With:

Q(N_t=n)=e^{-lambda*T}*(lambda*T)^n/{n!}

the probability to have n jumps.

ln(ST)|NT=n follows a normal distribution and ST|NT=n can be written as:

S_T|_{N_T=n}=S_0*e^{-lambda*k*T+m*n}*e^{(r-1/2*sigma^2)*T}*e^{sqrt(sigma^2+n*delta^2/T)*W_T^QQ}

It can be rewritten as:

S_T|_{N_T=n}=\tildeS_n*e^{(r-1/2*sigma_n^2)*T}*e^{sigma_n*W_T^{QQ}}

With

\tildeS_n=S_0*e^{-lambda*k*T+m*n+1/2*n*delta^2}

sigma_n=sqrt(sigma^2+n*delta^2/T

We obtain for the asset price at T an expression similar to the one in the Black-Scholes framework with an initial price equal to:

\tildeS_n

and a volatility parameter equal to

sigma_n


To go further...