4

我正在做这个任务,我试图运行这个程序 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 无法在某些迭代中收敛时,我也遇到了拟合错误。

谢谢

4

1 回答 1

2

在纯 Python 中用于时间序列分析的递归循环很慢。

在这种情况下,生成样本的最简单解决方案是在 statsmodels http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_process.arma_generate_sample.htmlscipy.signal.lfilter中使用或包装它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 模型所具有的完整的估计后特征,如预测。

于 2015-02-19T14:45:56.803 回答