Экспонента Херста превращается в nan - Python 3 - PullRequest
1 голос
/ 08 мая 2020

Я хочу определить, имеет ли временной ряд возврат к среднему или нет, но я сталкиваюсь с некоторыми проблемами при вычислении показателя Херста. Предполагается, что он напечатает 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

1 Ответ

0 голосов
/ 02 августа 2020

У меня была такая же проблема при отправке Series в качестве аргумента ts. Все, что вам нужно сделать, это отправить список, а не серию или:

def hurst(ts):
    """Returns the Hurst Exponent of the time series vector ts"""
    ts = ts if not isinstance(ts, pd.Series) else ts.to_list()
    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

Значения NaN также могут быть проблемой, я бы проверил, можно ли dropna () перед to_list ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...