Distinguishing pure diffusions from jump-diffusions

One important question when we have some time series – possibly from real-world data – is to be able to discern if this timeseries is a pure diffusion process (a continuous stochastic process) or a jump-diffusion process (a discontinuous stochastic process). For this, jumpdiff has an easy to use function, called q_ratio. The idea behind distinguishing continuous and discontinuous processes is simple: diffusion processes diffuse over time, thus they take time to occupy space; jump-diffusion processes can jump, and thus statistically, they occupy all space very fast.

To analyse this let us design a simple example – with some numerically generated data – that shows the use of q_ratio and how to read it.

Let us generate two trajectories, using jd_process, denoted d_timeseries and j_timeseries, for diffusion timeseries and jumpy timeseries. Naturally the first must not include a jump term. To keep it simple, we will use the same parameters for both, expect for the jumps:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import jumpdiff as jd

# integration time and time sampling
t_final = 10000
delta_t = 0.01

# Drift function
def a(x):
    return -0.5*x

# Diffusion function
def b(x):
    return 0.75

# generate 2 trajectories
d_timeseries = jd.jd_process(t_final, delta_t, a=a, b=b, xi=0, lamb=0)
j_timeseries = jd.jd_process(t_final, delta_t, a=a, b=b, xi=2.5, lamb=1.75)

Note how xi and lamb are different for each process To now examine the rate of diffusion of the processes, we need to generate a time arrow, which we denote lag. This needs to be a integer list >0.

18
19
import numpy as np
lag = np.logspace(0, 3, 25, dtype=int)

Lastly we just need to can the q_ratio for our two timeseries

20
21
d_lag, d_Q = jd.q_ratio(lag, d_timeseries)
j_lag, j_Q = jd.q_ratio(lag, j_timeseries)

And with the help of matplotlib’s plotly, we can visualise the results in a double logarithmic scale

22
23
24
25
import matplotlib.plotly as plt

plt.loglog(d_lag, d_Q, '-', label='diffusion')
plt.loglog(j_lag, j_Q, 'o-', label='jump-diffusion')
Q-ratio of a diffusion and a jump-diffusion process

As we can see, the diffusion process grows with our time arrow lag, where the jump-diffusion is constant (does not depend on lag). Jump processes will show a constant relation with code:lag, where diffusion processes a linear relation.