Technical

Merton Jump Diffusion Model: Formula, Pricing and Python

Derive Merton's jump diffusion and Poisson-mixture option price, verify the drift correction, and implement stable call and put pricing in Python.

12 min read·

In 1976 Robert Merton changed one Black-Scholes assumption: the stock could jump. His paper, Option Pricing When Underlying Stock Returns Are Discontinuous, produced a model that remains unusually transparent. Condition on the number of jumps and the option price becomes a sum of Black-Scholes prices.

The transparency comes with a cost. Jump risk cannot generally be hedged with the stock and bond, so the market is incomplete. A risk-neutral jump law must be specified or calibrated; no-arbitrage alone does not identify it.

The Black-Scholes model, volatility smile and Heston model provide useful points of comparison.

Risk-neutral dynamics

Let NtN_t be a Poisson process with intensity λ\lambda per year. At each jump the stock is multiplied by an independent random variable Y>0Y>0, with

log⁡Y∼N(μJ,δ2),κ=E[Y−1]=eμJ+δ2/2−1.\log Y\sim\mathcal N(\mu_J,\delta^2), \qquad \kappa=\mathbb E[Y-1] =e^{\mu_J+\delta^2/2}-1.

Under a chosen risk-neutral measure,

dStSt−=(r−q−λκ)dt+σ dWt+(Y−1)dNt.\frac{dS_t}{S_{t-}} =(r-q-\lambda\kappa)dt+\sigma\,dW_t+(Y-1)dN_t.

St−S_{t-} is the value immediately before a jump. The compensator −λκ-\lambda\kappa is essential:

E[ST]=S0e(r−q)T.\mathbb E[S_T]=S_0e^{(r-q)T}.

Here σ\sigma has units per square root year, λ\lambda, rr and qq have units per year, and μJ\mu_J, δ\delta and κ\kappa are dimensionless.

Merton argued that firm-specific jump risk could be diversified, leaving its physical jump law unchanged for pricing. That assumption is not compelling for index crashes or common macro shocks. Modern calibration treats λ\lambda, μJ\mu_J and δ\delta below as risk-neutral parameters, which need not match estimates from historical returns.

Conditional distribution

Given NT=nN_T=n,

log⁡ST=log⁡S0+(r−q−λκ−12σ2)T+σT Z+∑j=1nlog⁡Yj.\log S_T= \log S_0+ \left(r-q-\lambda\kappa-\frac12\sigma^2\right)T +\sigma\sqrt T\,Z+\sum_{j=1}^{n}\log Y_j.

The final two terms are Gaussian. Conditional log variance is σ2T+nδ2\sigma^2T+n\delta^2, so define

σn2=σ2+nδ2T.\sigma_n^2=\sigma^2+\frac{n\delta^2}{T}.

One direct implementation can use the actual jump-count probabilities e−λT(λT)n/n!e^{-\lambda T}(\lambda T)^n/n! and a shifted conditional spot. The commonly quoted Merton series rewrites the same expectation as

C0=∑n=0∞e−λ′T(λ′T)nn!CBS(S0,K,T,rn,q,σn),C_0=\sum_{n=0}^{\infty} \frac{e^{-\lambda' T}(\lambda'T)^n}{n!} C_{\mathrm{BS}}(S_0,K,T,r_n,q,\sigma_n),

where

λ′=λ(1+κ)=λeμJ+δ2/2,rn=r−λκ+n(μJ+δ2/2)T.\lambda'=\lambda(1+\kappa) =\lambda e^{\mu_J+\delta^2/2}, \qquad r_n=r-\lambda\kappa+ \frac{n(\mu_J+\delta^2/2)}{T}.

The λ′\lambda' weights are a pricing rearrangement. They are not the probabilities of observing nn jumps under the original risk-neutral process; those use λ\lambda.

The rearrangement can be understood without memorising it. Conditional on nn jumps, the terminal stock contains the factor ∏j=1nYj\prod_{j=1}^nY_j. A call's stock term weights a scenario by its terminal stock, not just by its probability. For lognormal jumps,

E ⁣[∏j=1nYj]=(1+κ)n.\mathbb E\!\left[\prod_{j=1}^nY_j\right]=(1+\kappa)^n.

Multiplying the original Poisson mass by this factor gives

e−λT(λT)nn!(1+κ)n=e−λT(λ′T)nn!.e^{-\lambda T}\frac{(\lambda T)^n}{n!}(1+\kappa)^n =e^{-\lambda T}\frac{(\lambda'T)^n}{n!}.

The remaining exponential factor is absorbed into the effective Black-Scholes carry, and normalising the weights produces e−λ′Te^{-\lambda'T}. This is an algebraic change of measure inside the payoff calculation, not a change in the model's observed jump count. Deriving the series this way is a useful defence against accidentally combining λ′\lambda' weights with an unadjusted conditional drift.

Put-call parity remains

P0=C0−S0e−qT+Ke−rT.P_0=C_0-S_0e^{-qT}+Ke^{-rT}.

Tails and smile

Let J=log⁡Y∼N(μJ,δ2)J=\log Y\sim\mathcal N(\mu_J,\delta^2). For the continuously compounded return, the compound-Poisson contribution has cumulants λTE[Jm]\lambda T\mathbb E[J^m] for orders m≥2m\geq2. In particular,

Var⁡(log⁡(ST/S0))=T[σ2+λ(μJ2+δ2)],\operatorname{Var}(\log(S_T/S_0)) =T\left[\sigma^2+\lambda(\mu_J^2+\delta^2)\right], κ3=λT(μJ3+3μJδ2),\kappa_3=\lambda T(\mu_J^3+3\mu_J\delta^2), κ4=λT(μJ4+6μJ2δ2+3δ4).\kappa_4=\lambda T(\mu_J^4+6\mu_J^2\delta^2+3\delta^4).

Standardised skew scales roughly as T−1/2T^{-1/2} and excess kurtosis as T−1T^{-1}. This is why a finite-activity jump model is particularly effective at creating steep short-dated smiles. Negative μJ\mu_J usually produces downside skew, although the exact skew depends on the third raw jump moment, not on μJ\mu_J alone.

Recomputed option price

Take S0=100S_0=100, K=90K=90, T=0.5T=0.5, r=3%r=3\%, q=0q=0, σ=20%\sigma=20\%, λ=0.5\lambda=0.5, μJ=−0.10\mu_J=-0.10 and δ=0.15\delta=0.15. Then

κ=e−0.08875−1=−0.0849257,λ′=0.457537.\kappa=e^{-0.08875}-1=-0.0849257, \qquad \lambda'=0.457537.

The first four series weights are 0.7955130.795513, 0.1819880.181988, 0.0208170.020817 and 0.0015870.001587. By contrast, the actual probabilities of zero and one jumps are e−0.25=0.778801e^{-0.25}=0.778801 and 0.25e−0.25=0.1947000.25e^{-0.25}=0.194700.

Summing the series gives a call value of 13.5346813.53468. Put-call parity gives 2.194762.19476 for the K=90K=90 put. The corresponding Black-Scholes put with 20%20\% volatility costs 1.459371.45937, so this parameter set raises the put price by 50.4%50.4\%, not a token few per cent.

The partial sums also validate truncation. Terms n=0n=0 through 33 produce 13.5341413.53414 and leave series mass 9.51×10−59.51\times10^{-5}. Adding n=4n=4 gives 13.5346613.53466; through n=6n=6 the value is 13.5346822213.53468222 with only 5.33×10−95.33\times10^{-9} mass left. A tolerance should be applied to a price-error bound rather than blindly to the last term. The omitted Poisson mass times S0e−qTS_0e^{-qT} is a simple conservative bound for omitted call value.

Stable Python series

The recurrence for Poisson weights avoids factorial overflow and makes the truncation error observable.

import numpy as np from scipy.stats import norm def bs_call(S, K, T, r, q, vol): if T == 0: return max(S - K, 0.0) if vol == 0: return np.exp(-r*T) * max(S*np.exp((r - q)*T) - K, 0.0) root_t = np.sqrt(T) d1 = (np.log(S / K) + (r - q + 0.5*vol**2)*T) / (vol*root_t) return S*np.exp(-q*T)*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d1-vol*root_t) def merton_call(S, K, T, r, q, vol, lam, mu_j, delta, tol=1e-12): if T == 0: return max(S - K, 0.0) kappa = np.exp(mu_j + 0.5*delta**2) - 1 lam_p = lam * (1 + kappa) weight, mass, price = np.exp(-lam_p*T), 0.0, 0.0 for n in range(1000): vol_n = np.sqrt(vol**2 + n*delta**2/T) r_n = r - lam*kappa + n*(mu_j + 0.5*delta**2)/T price += weight * bs_call(S, K, T, r_n, q, vol_n) mass += weight if 1 - mass < tol: return price weight *= lam_p*T / (n + 1) raise RuntimeError("Poisson series did not converge")

Obtain the put through parity rather than coding a second series. Test the limits λ→0\lambda\to0 and δ,μJ→0\delta,\mu_J\to0 against Black-Scholes, verify parity and increase the truncation point until the price stops moving.

Calibration is less tidy than pricing. Diffusion variance, jump frequency and jump-size variance can substitute for one another over a limited strike range. Multiple maturities help, but a constant-parameter model still struggles to fit an entire equity surface. Weight errors by liquid bid-ask spreads or vegas and inspect parameter stability across dates. A tight fit with wildly moving λ\lambda and δ\delta is not a stable risk model.

Delta and gamma can be summed from the component Black-Scholes values because the weights do not depend on spot. Sensitivities to jump parameters require differentiating weights, rnr_n and σn\sigma_n as well. Calling every such sensitivity “vega” hides material terms.

Calibration decisions and diagnostics

Each parameter controls more than one visible feature. Increasing λ\lambda raises the chance of jumps, but the drift compensator changes at the same time. Increasing δ\delta fattens both tails and changes κ\kappa. Making μJ\mu_J more negative usually steepens downside skew, yet it also raises the compensating continuous drift when κ<0\kappa<0. The diffusion volatility can absorb central smile curvature that might otherwise be assigned to frequent small jumps. These interactions explain why unconstrained calibrations often produce economically different parameter sets with similar vanilla prices.

A practical calibration should use several maturities and enough strikes to expose both central curvature and tails. Even then, impose bounds that reflect the intended interpretation. If λT\lambda T is tiny for every quoted expiry, jump-size parameters are weakly identified. If λ\lambda is very large while δ\delta is very small, the model is approximating extra diffusion and the jump decomposition may not be meaningful. Profile the objective by fixing one jump parameter over a grid and reoptimising the others. A flat profile is more informative than a small reported optimiser standard error.

Residuals need financial units. Equal weighting in dollars gives expensive in-the-money options disproportionate influence. Equal weighting in implied volatility can overemphasise options with negligible vega. Common choices are inverse bid-ask variance in price space or vega-normalised price errors, followed by reporting both price and volatility residuals. Do not calibrate to stale deep in-the-money calls when their corresponding out-of-the-money puts are more liquid.

The following numerical checks catch most implementation failures:

  • verify κ=eμJ+δ2/2−1\kappa=e^{\mu_J+\delta^2/2}-1 directly by Gaussian integration or simulation;
  • confirm E[ST]=S0e(r−q)T\mathbb E[S_T]=S_0e^{(r-q)T} with the analytic moment and Monte Carlo;
  • compare actual Poisson probabilities with simulated jump counts, never with λ′\lambda' weights;
  • recover Black-Scholes as λ→0\lambda\to0 and when Y→1Y\to1;
  • check put-call parity across strikes and maturities;
  • compare the series with characteristic-function quadrature or an FFT implementation;
  • halve the series tolerance and require prices and Greeks to remain stable.

Monte Carlo deserves a separate drift test. Simulate

ST=S0exp⁡ ⁣[(r−q−λκ−12σ2)T+σTZ+∑j=1NTJj],S_T=S_0\exp\!\left[ \left(r-q-\lambda\kappa-\frac12\sigma^2\right)T +\sigma\sqrt T Z+\sum_{j=1}^{N_T}J_j \right],

with Jj∼N(μJ,δ2)J_j\sim\mathcal N(\mu_J,\delta^2). A frequent coding error applies both the exponential jump eJje^{J_j} and an additional additive (Y−1)(Y-1) adjustment. Another uses StS_t rather than St−S_{t-} at a jump in a time-stepping implementation. Exact terminal simulation avoids both discretisation and jump-timing error for European payoffs.

For practitioner use, decide whether jumps represent rare news, market-wide crashes or merely a flexible return density. That choice determines plausible intensity bounds, whether historical evidence is relevant and which risks should be stressed. A risk-neutral calibration may price vanillas well while implying jump frequencies unlike realised data. That is not automatically an error, because jump risk carries a premium, but it should be explicit in model governance and scenario design.

Where Merton falls short

Finite jump activity means short intervals usually contain no jump at all. That is a useful model of discrete news but a poor description of markets where many small jumps contribute to variation. Constant jump parameters also imply independent increments and no volatility clustering.

The model's incomplete-market assumption is more fundamental. Different choices of risk-neutral jump intensity and size law can be consistent with the same physical process. Calibration chooses one from option prices; the drift correction does not remove that choice.

Dupire local volatility can fit today's complete vanilla surface, while Heston adds persistent stochastic variance. Bates' 1996 specification combines Heston variance with price jumps when both effects matter.

Frequently Asked Questions

What is the Merton jump diffusion model?

It is geometric Brownian motion plus lognormal price jumps arriving through a Poisson process, with a compensating drift that preserves the risk-neutral forward price.

Why is the drift reduced by lambda times kappa?

Jumps contribute expected proportional return λκ dt\lambda\kappa\,dt. Subtracting it from the continuous drift leaves total expected growth at r−qr-q under the pricing measure.

Are the adjusted lambda-prime weights jump probabilities?

No. The actual count NTN_T is Poisson with mean λT\lambda T. The weights with λ′=λ(1+κ)\lambda'=\lambda(1+\kappa) arise after rearranging the conditional option values into standard Black-Scholes terms.

Does Merton's model uniquely price jump risk?

No. Jumps make the stock-and-bond market incomplete. Merton imposed a diversifiability assumption; in practice, risk-neutral jump parameters are calibrated to traded options.

How many model parameters are calibrated?

There are four beyond deterministic market inputs: diffusion volatility σ\sigma, jump intensity λ\lambda, mean log jump μJ\mu_J and log-jump volatility δ\delta.

What is the canonical citation?

Merton's 1976 Journal of Financial Economics paper, pages 125 to 144, is the original source. The series is elegant. Identifying jump risk is the hard part.

Skip the £25k programme - try the alternative

Master's programmes are slow and expensive. Quantt is a self-paced alternative. Start free with a real lesson and interview practice, then unlock 50+ courses and your personalised plan.

Free to start · No credit card required