In [1]:
import numpy as np
import pandas as pd

import statsmodels
from statsmodels.tsa.stattools import coint
import statsmodels.api as stat
import statsmodels.tsa.stattools as ts

import matplotlib.pyplot as plt
from nsepy import get_history
from datetime import date

In [2]:
S1 = get_history(symbol = "NIFTY",
start = date(2010,1,1),
end = date(2020,9,3), index=True)
S1[['Close']].plot()

Out[2]:
<matplotlib.axes._subplots.AxesSubplot at 0x1112be96730>

A time series can then be characterised in the following manner:

• H < 0.5 : The time series is mean reverting
• H = 0.5 : The time series is a Geometric Brownian Motion
• H > 0.5 : The time series is trending
In [3]:
from numpy import cumsum, log, polyfit, sqrt, std, subtract
from numpy.random import randn

def hurst(ts):
"""Returns the Hurst Exponent of the time series vector ts"""
# Create the range of lag values
lags = range(2, 100)

# Calculate the array of the variances of the lagged differences
tau = [sqrt(std(subtract(ts[lag:], ts[:-lag]))) for lag in lags]

# Use a linear fit to estimate the Hurst Exponent
poly = polyfit(log(lags), log(tau), 1)

# Return the Hurst exponent from the polyfit output
return poly[0]*2.0

In [4]:
# Create a Gometric Brownian Motion
gbm = log(cumsum(randn(100000))+1000)
plt.plot(gbm)
plt.show()

In [5]:
#Calculate Hurst Exponent for GBM
print("Hurst(GBM):   %s" % hurst(gbm))

Hurst(GBM):   0.49734726774168514

In [6]:
# Create a Mean-Reverting Series
mr = log(randn(100000)+1000)
plt.plot(mr)
plt.show()

In [7]:
#Calculate Hurst Exponent for MR
print("Hurst(MR):    %s" % hurst(mr))

Hurst(MR):    -0.0003620954823916043

In [8]:
# Create a Trending Series
tr = log(cumsum(randn(100000)+1)+1000)
plt.plot(tr)
plt.show()

In [9]:
print("Hurst(TR):    %s" % hurst(tr))

Hurst(TR):    0.9559633702762489

In [10]:
print("Hurst(Nifty):    %s" % hurst(S1[['Close']]))

Hurst(Nifty):    [0.47880703]

In [ ]:


In [ ]: