我试图在python中计算时间序列的赫斯特指数,这个值决定了定量金融时间序列的一些均值回归特征。我取了一个任意长度的时间序列,并选择将其分割成数据块,这个过程是计算赫斯特指数(几种方法之一)的一部分。我把它写成函数。想象一下,我把时间序列(证券的价格)设为"y",我想要的区块数量设为"n":
def hurst(y,n):
y = array_split(y,n)
问题是,现在数组被分割成块,其中一个块的大小与其他块的大小不相等。我想找到平均值,标准差,以平均值为中心的序列,以平均数为中心的系列的累积和,以及每个区块的累积和的范围。但由于数组的大小不一致,我还没有找到实现这一点的方法。基本上,当我试图通过时
mean(y,axis=0)
或者1或2,对于轴,我得到一个错误。当使用n=20时,阵列的形状被给定为
(20,)
我想也许"矢量化"可以帮助我?但我还没有完全弄清楚如何使用它。我正在努力避免在数据中循环。
拆分后的样本数据:
[array([[ 1.04676],
[ 1.0366 ],
[ 1.0418 ],
[ 1.0536 ],
[ 1.0639 ],
[ 1.06556],
[ 1.0668 ]]), array([[ 1.056 ],
[ 1.053 ],
[ 1.0521 ],
[ 1.0517 ],
[ 1.0551 ],
[ 1.0485 ],
[ 1.05705]]), array([[ 1.0531],
[ 1.0545],
[ 1.0682],
[ 1.08 ],
[ 1.0728],
[ 1.061 ],
[ 1.0554]]), array([[ 1.0642],
[ 1.0607],
[ 1.0546],
[ 1.0521],
[ 1.0548],
[ 1.0647],
[ 1.0604]])
数据类型list
要列出平均值,只需使用列表理解:
[mean(x[axis]) for axis in range(len(x))]
它遍历轴并计算每个部分的平均值。
对于任何遇到这个问题的人,我已经解决了这个问题,并决定使用Pandas数据帧。。。
def hurst(y,n):
y = prices.as_matrix()
y = array_split(y,n)
y = pd.DataFrame.from_records(y).transpose()
y = y.dropna()
# Mean Centered Series
m = y.mean(axis='columns')
Y = y.sub(m,axis = 'rows')
# Standard Deviation of Series
S = y.std(axis='columns')
# Cumulative Sum Series
Z = Y.cumsum()
# Range Series
R = Z.max(axis='columns')-Z.min(axis='columns')
# Rescale Range
RS = R/S
RS = RS.sort_values()
# Time Period
s = shape(y)
t = linspace(1,s[0],s[0])
# Log Scales
logt = log10(t)
logRS = log10(RS)
print len(t),len(logRS)
# Regression Fit
slope, intercept, r_value, p_value, std_err = stats.mstats.linregress(logt, logRS)
# Hurst Exponent
H = slope/2
return H, logt, logRS