2014-06-20 71 views
7

根据这个问题How to get constant term in AR Model with statsmodels and Python?。我现在试图使用ARMA模型来拟合数据,但我再也找不到解释模型结果的方法。这里我根据ARMA out-of-sample prediction with statsmodelsARMAResults.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() 

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

enter image description here

我尝试写这将在下面示出自己的预测代码(省略顶部部分是与上述相同的代码)

# 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() 

这是我得到

最好的结果

enter image description here

回答

0

您在一部分数据上训练了模型,然后预测出样本。 AR(MA)预测迅速收敛于数据的均值。这就是为什么你看到第一个结果。在第二个结果中,你没有做出样本预测,你只是得到样本外的拟合值。使用卡尔曼滤波递归(这是完全最大似然估计和条件最大似然估计之间的区别),前几个观测数据点是拟合的。

我会选择一个好的预测教科书,并检查它来理解这种行为。

+0

感谢。是的,我只想要一个超出样本的拟合值。我的代码是否正确,特别是'value = 0'的语句应该是'value = result.params [0]'?如果我的代码得到纠正,那么前200个数据点应该等于'result.fittedvalues'的结果?但在这种情况下并非如此。如果我错了,请纠正我。 – PalmRobotZ

+0

它看起来像你在省略常数。在你的最后一个问题中查看我的代码和评论关于平均值和常数。 – jseabold

+0

我试过了,但不知道如何获得常数项。使用'value = result.params [0]'喜欢我以前的问题在这里不起作用。 – PalmRobotZ

0

另一种可能,也许更短的解决方案:

for i in range(0,len(data)): 
    fit.append(result.forecast()[0]) 
    numpy.append(result.data.endog.data[i]) 
相关问题