Hurst exponent evaluation and R/S-analysis in Python
hurst is a small Python module for analysing random walks and evaluating the Hurst exponent (H).
H = 0.5 — Brownian motion,
0.5 < H < 1.0 — persistent behavior,
0 < H < 0.5 — anti-persistent behavior.
Install hurst module with
pip install hurst
pip install -e git+https://github.com/Mottl/hurst#egg=hurst
import numpy as np import matplotlib.pyplot as plt from hurst import compute_Hc, random_walkUse random_walk() function or generate a random walk series manually:
series = random_walk(99999, cumprod=True)
np.random.seed(42) random_changes = 1. + np.random.randn(99999) / 1000. series = np.cumprod(random_changes) # create a random walk from random changes
Evaluate Hurst equation
H, c, data = compute_Hc(series, kind='price', simplified=True)
Plot
f, ax = plt.subplots() ax.plot(data[0], c*data[0]**H, color="deepskyblue") ax.scatter(data[0], data[1], color="purple") ax.set_xscale('log') ax.set_yscale('log') ax.set_xlabel('Time interval') ax.set_ylabel('R/S ratio') ax.grid(True) plt.show()
print("H={:.4f}, c={:.4f}".format(H,c))
H=0.4964, c=1.4877
The
kindparameter of the
compute_Hcfunction can have the following values:
'change': a series is just random values (i.e.
np.random.randn(...))
'random_walk': a series is a cumulative sum of changes (i.e.
np.cumsum(np.random.randn(...)))
'price': a series is a cumulative product of changes (i.e.
np.cumprod(1+epsilon*np.random.randn(...))
You can generate random walks with
random_walk()function as following:
brownian = random_walk(99999, proba=0.5)
persistent = random_walk(99999, proba=0.7)
antipersistent = random_walk(99999, proba=0.3)