Forma correcta de utilizar la función ARMAResult.predict ()

De acuerdo a esta pregunta¿Cómo obtener un término constante en AR Model con statsmodels y Python?. Ahora estoy tratando de usar el modelo ARMA para ajustar los datos, pero nuevamente no pude encontrar una manera de interpretar el resultado del modelo. Aquí lo que he hecho segúnPredicción ARMA fuera de muestra con modelos de estadísticas yDocumento de API ARMAResults.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()

Aquí el resultado que es muy extraño porque debería ser casi idéntico al resultado de mi última pregunta como menciono en el enlace de arriba. Además, no entiendo por qué hay algunos resultados para un par de primeros puntos de datos, ya que eso no debería ser válido (no hay que calcular ningún valor anterior).

Intento escribir mi propio código de predicción que se muestra a continuación (omití la parte superior que es idéntica al código anterior)

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

Este es el mejor resultado que obtuve

Respuestas a la pregunta(2)

Su respuesta a la pregunta