正确使用ARMAResult.predict()函数的方法

Nun*_*ong 8 python time-series statsmodels

根据这个问题如何使用statsmodels和Python在AR模型中获得常量项?.我现在正在尝试使用ARMA模型来拟合数据,但我又找不到解释模型结果的方法.这里是我根据ARMA样本预测与statsmodelsARMAResults.predict API文档所做的.

# Parameter

INPUT_DATA_POINT = 200
P = 5
Q = 0

# Read Data

data = []

f = open('stock_all.csv', 'r')
for line in f:
    data.append(float(line.split(',')[5]))
f.close()

# Fit ARMA-model using the first piece of data

result = arma_model(data[:INPUT_DATA_POINT], P, Q)

# Predict using model (fit dimension is len(data) + 1 why?)

fit = result.predict(0, len(data))

# Plot

plt.figure(facecolor='white')
plt.title('ARMA Model Fitted Using ' + str(INPUT_DATA_POINT) + ' Data Points, P=' + str(P) +  ' Q=' + str(Q) + '\n')
plt.plot(data, 'b-', label='data')
plt.plot(range(INPUT_DATA_POINT), result.fittedvalues, 'g--', label='fit')
plt.plot(range(len(data)), fit[:len(data)], 'r-', label='predict')
plt.legend(loc=4)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这里的结果非常奇怪,因为它应该与我在上面的链接中提到的上一个问题的结果几乎相同.此外,我不太明白为什么有几个第一个数据点的结果,因为它不应该是有效的(没有先前的计算值).

在此输入图像描述

我尝试编写自己的预测代码,如下所示(省略了与上面代码相​​同的顶部)

# Predict using model

start_pos = max(result.k_ar, result.k_ma)

fit = []
for t in range(start_pos, len(data)):
    value = 0
    for i in range(1, result.k_ar + 1):
        value += result.arparams[i - 1] * data[t - i]
    for i in range(1, result.k_ma + 1):
        value += result.maparams[i - 1] * data[t - i]
    fit.append(value)

# Plot

plt.figure(facecolor='white')
plt.title('ARMA Model Fitted Using ' + str(INPUT_DATA_POINT) + ' Data Points, P=' + str(P) +  ' Q=' + str(Q) + '\n')
plt.plot(data, 'b-', label='data')
plt.plot(range(INPUT_DATA_POINT), result.fittedvalues, 'r+', label='fit')
plt.plot(range(start_pos, len(data)), fit, 'r-', label='predict')
plt.legend(loc=4)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这是我得到的最好的结果

在此输入图像描述

jse*_*old 2

您在数据子集上训练模型,然后进行样本外预测。AR(MA) 预测快速收敛到数据的平均值。这就是为什么您会看到第一个结果。在第二个结果中,您没有进行样本外预测,而只是获得了样本外拟合值。

前几个观察数据点使用卡尔曼滤波器递归进行拟合(这是完全最大似然估计和条件最大似然估计之间的区别)。

我会拿起一本好的预测教科书并复习它以理解这种行为。

  • 是的,因为 ARMA 报告的是平均值而不是常数。从 ARMA 获取常量的伪代码在另一个答案中,理解其中的区别很重要。我希望将来某个时候将预测功能作为独立功能公开,以使这变得更容易。 (2认同)