python arma拟合跑得太慢?

时间:2015-02-18 21:20:31

标签: python for-loop time-series statsmodels autoregressive-models

我正在做这个任务,我试图运行这个程序5000次,并且AR(1)和AR(2)适合模型。首先,我定义了一个生成时间序列的函数,如下所示:

def ts_gen_ar1(size,sigma,alpha1):
    wt = np.random.normal(0,sigma**2,size=size)
    x = np.zeros(size)
    for i in np.arange(1,size):
        x[i] = 0.2 + alpha1*x[i-1] + wt[i]
return x

然后我执行了以下需要很长时间才能工作的陈述

sample_ar1 = []
sample_ar2 = []
for i in range(0,5000):
    rt = ts_gen_ar1(2500,1,0.8)
    coeff_ar1 = sm.tsa.ARMA(rt,order=(1,0)).fit().params[1]
    coeff_ar2 = sm.tsa.ARMA(rt,order=(2,0)).fit().params[1:]
    sample_ar1.append(coeff_ar1)
    sample_ar2.append(coeff_ar2)

有人可以建议如何加快速度吗?我的程序说MLE在某些迭代中无法收敛,我也得到了错误。

由于

1 个答案:

答案 0 :(得分:1)

普通Python中时间序列分析的递归循环很慢。

在这种情况下生成示例的最简单的解决方案是在statsmodels scipy.signal.lfilter http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_process.arma_generate_sample.html

中使用arma_generate_sample或其包装器

加速随机数生成的另一种可能性是对许多样本运行矢量化,例如在100个进程的块上运行它。您仍然有时间循环,但您可以减少复制循环的数量,但代价是使用更多内存。

sm.tsa.ARMA使用用cython编写的卡尔曼滤波器并且运行速度很快,但它适用于一般的ARMA过程,它比估算AR模型所需的工作更多。 sm.ts.AR在平稳性假设下(默认情况下)通过完全最大似然估计AR过程的参数。

最简单,最快的是通过OLS估算AR过程,不需要非线性优化,或使用Yule-Walker statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.yule_walker.html

最后两个可以根据初始观测值估计参数,但不会具有AR和ARMA模型所具有的完整的估计后特征,如预测。