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).
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
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
Wygląda na to, że pomijasz stałą. Zobacz mój kod i komentarz na temat średniej vs stałej w ostatnim pytaniu. – jseabold
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