使用statsmodels

时间:2017-02-13 14:43:19

标签: python statsmodels

我正在几个(~500)时间序列上进行ADF测试以测试平稳性。因此,我需要一种定量的方法来为每一个选择正确的滞后数。一种可能的方法是使用我的样本的80%用于测试并获得回归的参数并计算ssr(平方和回​​归)并搜索最小值。然而,这可能导致过度拟合并且为了避免它,然后可以将该回归应用于剩余的20%并计算该子样本的ssr。导致第二个ssr最小值的滞后数应该是正确的。

问题是statsmodels文档不完整(至少对像我这样的新手来说!)。例如,给定行

res = ts.adfuller(dUs, maxlag=max_lag_, autolag=None, regression='ct', store=True, regresults=True)

回归系数存储在res [3] .resols.params中,但顺序未知。我不得不请某人在我的R中的一个时间序列上运行测试(它给出了使用的公式和相应的系数

R-output)。

参数的Python顺序似乎是(对于'ct'回归)滞后1,滞后差异1,滞后差异2,...滞后差异N,截距,时间趋势。然后,我用以下代码重新构建拟合系列:

xFit[0:max_lag_ + 1] = dUs[0:max_lag_ + 1]
for i in range (max_lag_ + 1,xFit.size):
    xFit[i] = xFit[i-1] + res[3].resols.params[0] * xFit[i-1] + res[3].resols.params[res[3].resols.params.size - 2] +  res[3].resols.params[res[3].resols.params.size - 1] * t[i]
    for j in range(1,max_lag_ +1):
        xFit[i] = xFit[i] + res[3].resols.params[j] * lag[i-1-j]

请注意,滞后变量是由我的dUs变量构建的,如此

lag = dUs[1:]-dUs[:-1]

问题是xFit系列和res [3] .resols.fittedvalues是不同的!我认为它可能与我对第一个max_lag_数据点的初始化有关(事实上,注意res [3] .resols.fittedvalues比原始系列短了max_lag_ + 1):我选择它们是相等的到原来的系列。但我无法弄清楚到底发生了什么。 xFit和res [3] .resols.params之间的区别是巨大的: time-series-comparison。另请注意,增加滞后数会使我的拟合更好,达到某个值,然后系列爆炸。拟合值不会发生这种情况!

作为最终测试,我在xFit上运行了ADF测试;我明白这应该导致res [3] .resols.params我已经得到了。

给定行

res2 = ts.adfuller(xFit, maxlag=max_lag_, autolag=None, regression='ct', store=True, regresults=True)

res2 [3] .resols.params的输出是

[-1.60231256e + 00 4.23814175e-02 -4.15837300e-02 4.99642618e-02   -6.92483339e + 02 3.89141878e + 00]

而res [3] .resols.params是

[-1.29269094e + 00 2.11857016e-02 -5.82679110e-02 -2.09614163e-02   -5.44413351e + 02 2.69502722e + 00]

我知道很多人会建议搬到R但是,a)我从来没有使用它(虽然我可以学习)和b)在工作中安装软件并不容易,它可能需要我很多宝贵的时间。

有什么想法吗?我错过了什么错误?

提前致谢,

C

1 个答案:

答案 0 :(得分:0)

我解决了这个问题(虽然我之前没有时间发布它!)。 事情是R适合差异系列,而Python适合时间序列本身。这与错误相结合(xFit应该在时间序列的重建中用dU替换!)如上所述使得一切都变得奇怪。 正确的代码是

import subprocess
subprocess.call("python scripts/webkit2png -h", shell=True)