ARMAResult.predict()函数的正确用法
根据这个问题 如何在AR模型中使用statsmodels和Python获取常数项?,我现在尝试使用ARMA模型来拟合数据,但我还是找不到理解模型结果的方法。以下是我根据 使用statsmodels进行ARMA模型的样本外预测 和 ARMAResults.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()
这里的结果很奇怪,因为它应该和我在上面链接中提到的上一个问题的结果几乎相同。而且我不太明白为什么前几个数据点会有一些结果,因为那样不应该有效(没有之前的值可以计算)。
我尝试写自己的预测代码,下面是代码(省略了与上面代码相同的部分)
# 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()
这是我得到的最佳结果
2 个回答
0
还有一种可能性更高、而且可能更简短的解决方案:
for i in range(0,len(data)):
fit.append(result.forecast()[0])
numpy.append(result.data.endog.data[i])
2
你在一部分数据上训练了模型,然后进行预测。AR(MA)预测很快就会趋向于数据的平均值。这就是你看到的第一个结果的原因。在你的第二个结果中,你并不是在进行样本外的预测,而只是得到了样本外的拟合值。
前面几个观察数据点是通过卡尔曼滤波器的递归方法来拟合的(这就是完全最大似然估计和条件最大似然估计之间的区别)。
我建议你找一本好的预测教材来复习一下,以理解这种行为。