首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >赫斯特指数转向nan - Python 3

赫斯特指数转向nan - Python 3
EN

Stack Overflow用户
提问于 2020-05-08 11:10:41
回答 2查看 268关注 0票数 1

我想确定一个时间序列是否是均值回归的,但在计算赫斯特指数时遇到了一些问题。它应该打印0.5左右,但我得到了一个"nan“。所有的帮助都将不胜感激。

我得到以下错误/警告:

代码语言:javascript
运行
复制
RuntimeWarning: divide by zero encountered in log
  poly = polyfit(log(lags), log(tau), 1)

下面是我正在编写的代码。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2021-05-31 23:25:54

根本原因是Series[<slice>]语法为每个片返回相应的索引,而-操作符处理每个索引相等(而不是实际位置)。

示例:

代码语言:javascript
运行
复制
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]的逐行数据帧。

代码语言:javascript
运行
复制
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

给定这一输入,赫斯特函数中的tau =方程的结果是一个(主要)NaN值的列表。

本机使用Series的解决方案是使用Series.shift()而不是数组切片:

代码语言:javascript
运行
复制
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传递给原始函数,该函数传递一个numpy数组。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61671380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档