Jump-Diffusion and Stochastic Differential Equation Models (Concept Note)

Summary

Concept note, no raw source. A jump-diffusion adds a compound-Poisson process to a Brownian SDE. For constant coefficients the transition density of the log-return over an interval is an exact Poisson mixture of normals (Merton 1976), so the likelihood is available by summing out the jump count; Euler discretization of the SDE is only an approximation and misattributes jumps to volatility. This is the pattern behind PyMC example E49 (S&P 500 jumps).

Overview

A pure diffusion cannot produce the heavy tails of daily returns (excess kurtosis far above 0). Adding rare large jumps does, and the mixture structure makes inference tractable. The same idea (a latent count summed out of a mixture likelihood) reappears for clone counts in Luria-Delbruck and Telegraph Models as Compound Count Likelihoods (Concept Note).

Main Content

Merton jump-diffusion for log-prices

jump intensity (per unit time), jump-size mean and sd. (Written as the log-price process without the compensator for the mean jump.)

Poisson-mixture transition density

The log-return has density

Reason: conditional on jumps in the interval, the return is the Brownian increment plus a sum of independent normal jumps, which is normal with the stated mean and variance; weight by the Poisson probability of .

In practice truncate at -30 (the Poisson tail beyond is negligible when is small), or use pm.Mixture / logsumexp over so the discrete jump count is summed out and NUTS sees only continuous parameters.

AspectEuler-Maruyama on a daily gridExact Poisson mixture
LikelihoodNormal increments plus a Bernoulli jump per stepPoisson-weighted sum of normals
BiasAt most one jump per step, and large jumps appear as volatilityNone in constant-coefficient case
Latent jumpsNeeded (discrete, hard for HMC)Summed out
IdentificationJump size and volatility trade off, especially with daily dataSame, but via tails: governed by kurtosis

Identification. With small, a few big returns identify ; if jumps are frequent and small the model collapses to a diffusion with larger (the “jumps absorbing volatility” issue). Priors that enforce and help.

Extensions. Kou (2002): double-exponential jumps (asymmetry); stochastic volatility and jumps in volatility (Eraker, Johannes & Polson 2003) require latent-state methods (particle filters, MCMC data augmentation).

Examples

Density check and kurtosis (runs; verified).

import numpy as np
from scipy import stats
mu, sig, lam, muJ, sJ, dt = 0.0004, 0.01, 0.05, -0.02, 0.04, 1.0     # daily
def merton_pdf(x, nmax=30):
    n = np.arange(nmax); w = stats.poisson.pmf(n, lam*dt)
    m = (mu - 0.5*sig**2)*dt + n*muJ; s = np.sqrt(sig**2*dt + n*sJ**2)
    return (w[:, None]*stats.norm.pdf(x[None, :], m[:, None], s[:, None])).sum(0)
x = np.linspace(-0.4, 0.4, 40001); f = merton_pdf(x)
print(np.trapezoid(f, x))                                   # 1.0
rng = np.random.default_rng(0); N = rng.poisson(lam*dt, 400000)
r = (mu-0.5*sig**2)*dt + sig*np.sqrt(dt)*rng.normal(size=N.size) + N*muJ + np.sqrt(N)*sJ*rng.normal(size=N.size)
print(stats.kurtosis(r))                                    # about 14: heavy tails from 5% jump days

Simulation mean/variance (-0.00064, 0.00020) match the density’s moments (-0.00065, 0.00020).

PyMC sketch (untested).

with pm.Model() as jd:
    mu, sig = pm.Normal("mu", 0, 0.01), pm.HalfNormal("sig", 0.02)
    lam, muJ, sJ = pm.Beta("lam", 1, 20), pm.Normal("muJ", 0, 0.05), pm.HalfNormal("sJ", 0.05)
    n = np.arange(15)
    comps = pm.Normal.dist((mu-0.5*sig**2)+n*muJ, pt.sqrt(sig**2 + n*sJ**2))
    pm.Mixture("r", w=pt.exp(pm.logp(pm.Poisson.dist(lam), n)), comp_dists=comps, observed=returns)

Relevance to marketing measurement

Heavy-tailed daily series (viral spikes, outages, stock-outs) are better modelled with a jump component than by inflating Gaussian variance, which would otherwise make credible intervals for ordinary days far too wide. Jump days also contaminate adstock and elasticity estimates if left as Gaussian noise; the mixture lets those days be down-weighted automatically. Related: robust likelihoods in Tail Behavior and Prior-Likelihood Conflict.

Connections

Linear-Gaussian State-Space Models, Chaos, Rough Likelihoods and Data Assimilation (Concept Note) (process noise), Monsters and Mixtures (mixture likelihoods and identification).

See Also

Likelihoods Built on Differential Equations (Concept Note), Chen 2018 - Latent ODE Time-Series Model.