https://github.com/lrydin/jumpdiff

JumpDiff: Non-parametric estimator for Jump-diffusion processes for Python

https://github.com/lrydin/jumpdiff

Science Score: 23.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
  • .zenodo.json file
  • DOI references
    Found 6 DOI reference(s) in README
  • Academic publication links
    Links to: researchgate.net
  • Committers with academic emails
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (13.1%) to scientific vocabulary

Keywords

conditional-moments diffusion-term estimator jump-amplitude jump-diffusion jump-rate kramers-moyal non-parametric python stochastic-processes
Last synced: 4 months ago · JSON representation

Repository

JumpDiff: Non-parametric estimator for Jump-diffusion processes for Python

Basic Info
  • Host: GitHub
  • Owner: LRydin
  • License: mit
  • Language: Python
  • Default Branch: master
  • Homepage:
  • Size: 612 KB
Statistics
  • Stars: 48
  • Watchers: 1
  • Forks: 8
  • Open Issues: 1
  • Releases: 0
Topics
conditional-moments diffusion-term estimator jump-amplitude jump-diffusion jump-rate kramers-moyal non-parametric python stochastic-processes
Created almost 6 years ago · Last pushed about 3 years ago
Metadata Files
Readme License

README.md

PyPI - License PyPI PyPI - Python Version Build Status codecov Documentation Status

jumpdiff

jumpdiff is a python library with non-parametric Nadaraya─Watson estimators to extract the parameters of jump-diffusion processes. With jumpdiff one can extract the parameters of a jump-diffusion process from one-dimensional timeseries, employing both a kernel-density estimation method combined with a set on second-order corrections for a precise retrieval of the parameters for short timeseries.

Installation

To install jumpdiff, run

pip install jumpdiff

Then on your favourite editor just use

python import jumpdiff as jd

Dependencies

The library parameter estimation depends on numpy and scipy solely. The mathematical formulae depend on sympy. It stems from kramersmoyal project, but functions independently from it3.

Documentation

You can find the documentation here.

Jump-diffusion processes

The theory

Jump-diffusion processes1, as the name suggest, are a mixed type of stochastic processes with a diffusive and a jump term. One form of these processes which is mathematically traceable is given by the Stochastic Differential Equation

which has 4 main elements: a drift term , a diffusion term , and jump amplitude term , which is given by a Gaussian distribution, and finally a jump rate . You can find a good review on this topic in Ref. 2.

Integrating a jump-diffusion process

Let us use the functions in jumpdiff to generate a jump-difussion process, and subsequently retrieve the parameters. This is a good way to understand the usage of the integrator and the non-parametric retrieval of the parameters.

First we need to load our library. We will call it jd python import jumpdiff as jd Let us thus define a jump-diffusion process and use jd_process to integrate it. Do notice here that we need the drift and diffusion as functions.

```python

integration time and time sampling

tfinal = 10000 deltat = 0.001

A drift function

def a(x): return -0.5*x

and a (constant) diffusion term

def b(x): return 0.75

Now define a jump amplitude and rate

xi = 2.5 lamb = 1.75

and simply call the integration function

X = jd.jdprocess(tfinal, delta_t, a=a, b=b, xi=xi, lamb=lamb) ```

This will generate a jump diffusion process X of length int(10000/0.001) with the given parameters.

Using jumpdiff to retrieve the parameters

Moments and Kramers─Moyal coefficients

Take the timeseries X and use the function moments to retrieve the conditional moments of the process. For now let us focus on the shortest time lag, so we can best approximate the Kramers─Moyal coefficients. For this case we can simply employ

python edges, moments = jd.moments(timeseries = X) In the array edges are the limits of our space, and in our array moments are recorded all 6 powers/order of our conditional moments. Let us take a look at these before we proceed, to get acquainted with them.

We can plot the first moment with any conventional plotter, so lets use here plotly from matplotlib

```python import matplotlib.plotly as plt

we want the first power, so we need 'moments[1,...]'

plt.plot(edges, moments[1,...]) `` The first moment here (i.e., the first Kramers─Moyal coefficient) is given solely by the drift term that we have selected-0.5*x`

And the second moment (i.e., the second Kramers─Moyal coefficient) is a mixture of both the contributions of the diffusive term and the jump terms and .

You have this stored in moments[2,...].

Retrieving the jump-related terms

Naturally one of the most pertinent questions when addressing jump-diffusion processes is the possibility of recovering these same parameters from data. For the given jump-diffusion process we can use the jump_amplitude and jump_rate functions to non-parametrically estimate the jump amplitude and jump rate terms.

After having the moments in hand, all we need is

```python

first estimate the jump amplitude

xiest = jd.jumpamplitude(moments = moments)

and now estimated the jump rate

lambest = jd.jumprate(moments = moments) `` which resulted in our case in(xiest) ξ = 2.43 ± 0.17and(lambest) λ = 1.744 * deltat(don't forget to dividelambestbydelta_t`)!

Other functions and options

Include in this package is also the Milstein scheme of integration, particularly important when the diffusion term has some spacial x dependence. moments can actually calculate the conditional moments for different lags, using the parameter lag.

In formulae the set of formulas needed to calculate the second order corrections are given (in sympy).

Contributions

We welcome reviews and ideas from everyone. If you want to share your ideas, upgrades, doubts, or simply report a bug, open an issue here on GitHub, or contact us directly. If you need help with the code, the theory, or the implementation, drop us an email. We abide to a Conduct of Fairness.

Changelog

  • Version 0.4 - Designing a set of self-consistency checks, the documentation, examples, and a trial code. Code at PyPi.
  • Version 0.3 - Designing a straightforward procedure to retrieve the jump amplitude and jump rate functions, alongside with a easy sympy displaying the correction.
  • Version 0.2 - Introducing the second-order corrections to the moments
  • Version 0.1 - Design an implementation of the moments functions, generalising kramersmoyal km.

Literature and Support

History

This project was started in 2017 at the neurophysik by Leonardo Rydin Gorjão, Jan Heysel, Klaus Lehnertz, and M. Reza Rahimi Tabar, and separately by Pedro G. Lind, at the Department of Computer Science, Oslo Metropolitan University. From 2019 to 2021, Pedro G. Lind, Leonardo Rydin Gorjão, and Dirk Witthaut developed a set of corrections and an implementation for python, presented here.

Funding

Helmholtz Association Initiative Energy System 2050 - A Contribution of the Research Field Energy and the grant No. VH-NG-1025 and STORM - Stochastics for Time-Space Risk Models project of the Research Council of Norway (RCN) No. 274410.


Bibliography

1 Tabar, M. R. R. Analysis and Data-Based Reconstruction of Complex Nonlinear Dynamical Systems. Springer, International Publishing (2019), Chapter Stochastic Processes with Jumps and Non-vanishing Higher-Order Kramers–Moyal Coefficients.

2 Friedrich, R., Peinke, J., Sahimi, M., Tabar, M. R. R. Approaching complexity by stochastic methods: From biological systems to turbulence, Physics Reports 506, 87–162 (2011).

3 Rydin Gorjão, L., Meirinhos, F. kramersmoyal: Kramers–Moyal coefficients for stochastic processes. Journal of Open Source Software, 4(44) (2019).

Extended Literature

You can find further reading on SDE, non-parametric estimatons, and the general principles of the Fokker–Planck equation, Kramers–Moyal expansion, and related topics in the classic (physics) books

  • Risken, H. The Fokker–Planck equation. Springer, Berlin, Heidelberg (1989).
  • Gardiner, C.W. Handbook of Stochastic Methods. Springer, Berlin (1985).

And an extensive review on the subject here

Owner

  • Name: Rydin
  • Login: LRydin
  • Kind: user
  • Location: Oslo, Norway
  • Company: OsloMet

I had cereals for breakfast

GitHub Events

Total
  • Issues event: 1
  • Watch event: 5
  • Issue comment event: 3
  • Fork event: 2
Last Year
  • Issues event: 1
  • Watch event: 5
  • Issue comment event: 3
  • Fork event: 2

Committers

Last synced: 5 months ago

All Time
  • Total Commits: 77
  • Total Committers: 2
  • Avg Commits per committer: 38.5
  • Development Distribution Score (DDS): 0.013
Past Year
  • Commits: 0
  • Committers: 0
  • Avg Commits per committer: 0.0
  • Development Distribution Score (DDS): 0.0
Top Committers
Name Email Commits
LRydin l****n@g****m 76
Rydin 4****n@u****m 1

Issues and Pull Requests

Last synced: 7 months ago

All Time
  • Total issues: 5
  • Total pull requests: 3
  • Average time to close issues: 6 days
  • Average time to close pull requests: 36 minutes
  • Total issue authors: 5
  • Total pull request authors: 1
  • Average comments per issue: 2.4
  • Average comments per pull request: 0.33
  • Merged pull requests: 3
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 1
  • Pull requests: 0
  • Average time to close issues: 4 days
  • Average time to close pull requests: N/A
  • Issue authors: 1
  • Pull request authors: 0
  • Average comments per issue: 2.0
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • funfwo (1)
  • jaeminSon (1)
  • sebglom (1)
  • kyrgeorgiou (1)
  • JChonpca (1)
Pull Request Authors
  • LRydin (3)
Top Labels
Issue Labels
Pull Request Labels

Packages

  • Total packages: 1
  • Total downloads:
    • pypi 32 last-month
  • Total dependent packages: 0
  • Total dependent repositories: 1
  • Total versions: 3
  • Total maintainers: 1
pypi.org: jumpdiff

JumpDiff: Non-parametric estimators for jump-diffusion processes for Python.

  • Versions: 3
  • Dependent Packages: 0
  • Dependent Repositories: 1
  • Downloads: 32 Last month
Rankings
Dependent packages count: 10.0%
Stargazers count: 10.5%
Forks count: 15.3%
Average: 16.9%
Dependent repos count: 21.7%
Downloads: 26.8%
Maintainers (1)
Last synced: 5 months ago

Dependencies

requirements.txt pypi
  • numpy *
  • scipy *
  • sympy *
setup.py pypi
  • numpy *
  • scipy *
  • sympy *
.github/workflows/CI.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite
  • codecov/codecov-action v1 composite