2014-06-20 15 views
7

In base a questa domanda How to get constant term in AR Model with statsmodels and Python?. Ora sto cercando di utilizzare il modello ARMA per adattarlo ai dati, ma di nuovo non sono riuscito a trovare un modo per interpretare il risultato del modello. Ecco cosa ho fatto secondo ARMA out-of-sample prediction with statsmodels e ARMAResults.predict API document.Modo corretto per utilizzare la funzione 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() 

Ecco il risultato che è molto strano perché dovrebbe essere quasi identico al risultato dalla mia ultima domanda, come ho detto nel link qui sopra. Inoltre non capisco perché ci sono alcuni risultati per un paio di primi punti di dati, poiché ciò non dovrebbe essere valido (nessun valore precedente da calcolare).

enter image description here

provo a scrivere il mio codice predizione che è mostrata sotto (omessa la parte superiore che è identico al codice sopra)

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

Questo è il miglior risultato ottenuto

enter image description here

risposta

0

Si è addestrato il modello su un sottoinsieme di dati e quindi si preannuncia il campione. La predizione AR (MA) converge rapidamente nella media dei dati. Ecco perché vedi i primi risultati. Nei tuoi secondi risultati, non stai facendo la previsione del campione, stai solo ottenendo valori adattati fuori dal campione.

I primi punti di dati di osservazione vengono adattati utilizzando le ricorsioni del filtro di Kalman (questa è la distinzione tra le stime di massima verosimiglianza e le stime di massima verosimiglianza condizionale).

Vorrei prendere un buon libro di previsione e rivederlo per comprendere questo comportamento.

+0

Grazie. Sì, voglio solo un valore adeguato fuori dal campione. Il mio codice è corretto in particolare l'istruzione 'value = 0' dovrebbe essere' value = result.params [0] '? Se il mio codice è corretto, i primi 200 punti dati dovrebbero essere uguali al risultato di 'result.fittedvalues' giusto? Ma in questo caso non lo è. Per favore correggimi se sbaglio. – PalmRobotZ

+0

Mi sembra che tu stia omettendo la costante. Vedi il mio codice e commenta media vs costante nella tua ultima domanda. – jseabold

+0

Ho provato ma non so come ottenere il termine costante. Usando 'value = result.params [0]' piaciuto la mia domanda precedente non funziona qui. – PalmRobotZ

0

Un'altra possibile soluzione e, probabilmente, più corta:

for i in range(0,len(data)): 
    fit.append(result.forecast()[0]) 
    numpy.append(result.data.endog.data[i]) 
Problemi correlati