根据这个问题How to get constant term in AR Model with statsmodels and Python?。我现在试图使用ARMA模型来拟合数据,但我再也找不到解释模型结果的方法。这里我根据ARMA out-of-sample prediction with statsmodels和ARMAResults.predict API document完成了。使用ARMAResult.predict()函数的正确方法
# 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()
这是我得到
最好的结果
感谢。是的,我只想要一个超出样本的拟合值。我的代码是否正确,特别是'value = 0'的语句应该是'value = result.params [0]'?如果我的代码得到纠正,那么前200个数据点应该等于'result.fittedvalues'的结果?但在这种情况下并非如此。如果我错了,请纠正我。 – PalmRobotZ
它看起来像你在省略常数。在你的最后一个问题中查看我的代码和评论关于平均值和常数。 – jseabold
我试过了,但不知道如何获得常数项。使用'value = result.params [0]'喜欢我以前的问题在这里不起作用。 – PalmRobotZ