Я хочу определить, имеет ли временной ряд возврат к среднему или нет, но я сталкиваюсь с некоторыми проблемами при вычислении показателя Херста. Предполагается, что он напечатает 0,5-i sh, но вместо этого я получаю «нан». Любая помощь будет принята с благодарностью.
Я получаю следующую ошибку / предупреждение:
RuntimeWarning: divide by zero encountered in log
poly = polyfit(log(lags), log(tau), 1)
Ниже приведен код, над которым я работаю.
import statsmodels.tsa.stattools as ts
from datetime import datetime
from pandas_datareader import DataReader
security = DataReader("GOOG", "yahoo", datetime(2000,1,1), datetime(2013,1,1))
ts.adfuller(security['Adj Close'], 1)
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"""
lags = range(2, 100)
tau = [sqrt(std(subtract(ts[lag:], ts[:-lag]))) for lag in lags]
poly = polyfit(log(lags), log(tau), 1)
return poly[0]*2.0
gbm = log(cumsum(randn(100000))+1000)
mr = log(randn(100000)+1000)
tr = log(cumsum(randn(100000)+1)+1000)
print ("Hurst(GBM): %s" % hurst(gbm))
print ("Hurst(MR): %s" % hurst(mr))
print ("Hurst(TR): %s" % hurst(tr))
print ("Hurst(SECURITY): %s" % hurst(security['Adj Close']))
print ("Hurst(GBM): %s" % hurst(gbm))
print ("Hurst(MR): %s" % hurst(mr))
print ("Hurst(TR): %s" % hurst(tr))
print ("Hurst(SECURITY): %s" % hurst(security['Adj Close']))
Hurst(GBM): 0.5039604262314196
Hurst(MR): -2.3832407841923795e-05
Hurst(TR): 0.962521148986032
Hurst(SECURITY): nan
__main__:11: RuntimeWarning: divide by zero encountered in log