2014-06-20 17 views
7

Zgodnie z tym pytaniem How to get constant term in AR Model with statsmodels and Python?. Teraz próbuję użyć modelu ARMA do dopasowania danych, ale znowu nie mogłem znaleźć sposobu na zinterpretowanie wyniku modelu. Oto co zrobiłem zgodnie z ARMA out-of-sample prediction with statsmodels i ARMAResults.predict API document.Prawidłowy sposób korzystania z funkcji 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() 

Tutaj wynik jest bardzo dziwny, ponieważ powinien być prawie identyczny z wynikiem z mojego ostatniego pytania, jak wspomniałem w powyższym linku. Również nie do końca rozumiem, dlaczego istnieje kilka wyników dla kilku pierwszych punktów danych, ponieważ nie powinno być ważne (brak wcześniejszej wartości do obliczenia).

enter image description here

próbuję napisać własny kod predykcji, który jest pokazany poniżej (pominięto górną część, która jest identyczna z powyższym kodzie)

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

Jest to najlepszy wynik mam

enter image description here

Odpowiedz

0

Wyszkoliłeś model na podzbiorze danych, a następnie przewidziałeś poza próbą. Prognozy AR (MA) szybko zbiegają się ze średnią danych. Właśnie dlatego widzisz pierwsze wyniki. W twoich drugich wynikach, nie robisz z przykładowego prognozowania, właśnie dostajesz out-of-sample dopasowane wartości.

Pierwsze kilka punktów danych obserwacji jest dopasowanych przy użyciu rekursji filtru Kalmana (jest to rozróżnienie między pełnymi oszacowaniami największej wiarygodności a oszacowaniami maksymalnej wiarygodności warunkowej).

Chciałbym wybrać dobry podręcznik do prognozowania i przejrzeć go, aby zrozumieć to zachowanie.

+0

Dzięki. Tak, chcę tylko mieć dopasowaną wartość poza próbą. Czy mój kod jest poprawny, a zwłaszcza wyrażenie 'value = 0' powinno być' value = result.params [0] '? Jeśli mój kod zostanie poprawiony, pierwsze 200 punktów danych powinno być równe wynikowi z 'result.fittedvalues' w prawo? Ale w tym przypadku tak nie jest. Proszę popraw mnie jeżeli się mylę. – PalmRobotZ

+0

Wygląda na to, że pomijasz stałą. Zobacz mój kod i komentarz na temat średniej vs stałej w ostatnim pytaniu. – jseabold

+0

Próbowałem, ale nie wiem, jak uzyskać stały termin. Używanie "value = result.params [0]" lubił moje poprzednie pytanie tutaj nie działa. – PalmRobotZ

0

Innym możliwym rozwiązaniem i prawdopodobnie krócej:

for i in range(0,len(data)): 
    fit.append(result.forecast()[0]) 
    numpy.append(result.data.endog.data[i]) 
Powiązane problemy