2014-06-20 128 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]) 
相關問題