[英]Hurst Exponent turns nan - Python 3
我想确定时间序列是否是均值回复的,但是在计算赫斯特指数时遇到了一些问题。 它应该打印 0.5-ish,但我得到一个“nan”。 所有帮助将不胜感激。
我收到以下错误/警告:
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
发送 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 值也可能是一个问题,我会在 to_list() 之前检查 dropna() 是否可以
根本原因是Series[<slice>]
语法为每个切片返回相应的索引,而-
运算符适用于每个索引相等(不是实际位置)。
例子:
s = pd.Series(range(5))
s[2:] - s[:-2]
=>
0 NaN
1 NaN
2 0.0
3 NaN
4 NaN
dtype: float64
显然,这不是我们所期望的。 要了解为什么我们可以使用 concat 分别创建s[2:], s[:-2]
的逐行 dataframe 。
pd.concat([s[2:], s[:-2]], axis=1)
=>
0 1
0 NaN 0.0
1 NaN 1.0
2 2.0 2.0
3 3.0 NaN
4 4.0 NaN
鉴于此输入, hurst function 中的tau =
方程的结果是(大部分)nan 值的列表。
原生使用 Series 的解决方案是使用Series.shift()
而不是数组切片:
def hurst(ts):
...
# Calculate the array of the variances of the lagged differences
tau = [sqrt((ts - ts.shift(-lag)).std()) for lag in lags]
...
或者,将Series.values
传递给原始 function,后者传递一个 numpy 数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.