2017-08-09 4 views

Répondre

0

A partir du graphique, il semble que vous faites des pré-échantillonnages avec forecast(), prédiction de bits dans l'échantillon avec prédiction. D'après la nature des équations ARIMA, les prévisions hors échantillon ont tendance à converger vers la moyenne de l'échantillon pour les longues périodes de prévision.

Afin de découvrir comment fonctionnent forecast() et predict() pour différents scénarios, j'ai comparé divers modèles de la classe ARIMA_results systématiquement. N'hésitez pas à reproduire la comparaison avec statsmodels_arima_comparison.pyin this repository. J'ai regardé dans chaque combinaison de order=(p,d,q), limitant seulement p, d, q à 0 ou 1. Par exemple, un simple modèle autorégressif peut être obtenu avec order=(1,0,0). En un mot, j'ai examiné trois options, en utilisant ce qui suit (stationary) time series:

A. La prévision itérative dans l'échantillon forme un historique. L'histoire a été formée du premier 80% d'une série temporelle, et un ensemble de test a été formé par le dernier 20%. Ensuite, j'ai prévu le premier point de l'ensemble de test, ajouté la vraie valeur à l'histoire, prévu le deuxième point, etc. Cela donnera une évaluation de la qualité prédictive du modèle.

for t in range(len(test)): 
    model = ARIMA(history, order=order) 
    model_fit = model.fit(disp=-1) 
    yhat_f = model_fit.forecast()[0][0] 
    yhat_p = model_fit.predict(start=len(history), end=len(history))[0] 
    predictions_f.append(yhat_f) 
    predictions_p.append(yhat_p) 
    history.append(test[t]) 

B. Ensuite, j'ai regardé dans les prévisions hors échantillon en prédisant itérativement le point suivant de la série d'essais, et annexant cette prédiction à l'histoire.

for t in range(len(test)): 
    model_f = ARIMA(history_f, order=order) 
    model_p = ARIMA(history_p, order=order) 
    model_fit_f = model_f.fit(disp=-1) 
    model_fit_p = model_p.fit(disp=-1) 
    yhat_f = model_fit_f.forecast()[0][0] 
    yhat_p = model_fit_p.predict(start=len(history_p), end=len(history_p))[0] 
    predictions_f.append(yhat_f) 
    predictions_p.append(yhat_p) 
    history_f.append(yhat_f) 
    history_f.append(yhat_p) 

C. I utilisé le paramètre forecast(step=n) et les predict(start, end) paramètres afin de faire des prévisions à plusieurs étapes interne avec ces méthodes.

model = ARIMA(history, order=order) 
    model_fit = model.fit(disp=-1) 
    predictions_f_ms = model_fit.forecast(steps=len(test))[0] 
    predictions_p_ms = model_fit.predict(start=len(history), end=len(history)+len(test)-1) 

Il est apparu que:

A. Prévision et prédire le rendement des résultats identiques pour AR, mais des résultats différents pour ARMA: test time series chart

B. Prévision et prédire des résultats différents de rendement pour les AR et ARMA: test time series chart

C. Prévision et prédire le rendement des résultats identiques pour AR, mais des résultats différents pour ARMA: test time series chart

En outre, en comparant les approches apparemment identiques en B. et C. J'ai trouvé des différences subtiles mais visibles dans les résultats.

Je suggère que les différences résultent principalement du fait que « la prévision se fait dans les niveaux de la variable endogène d'origine » dans forecast() et predict() produit prédiction des différences de niveaux (compare the API reference).En outre, étant donné que je fais plus confiance à la fonctionnalité interne des fonctions statsmodels qu'à ma simple boucle de prévision itérative (c'est subjectif), je recommanderais d'aller avec forecast(step) ou predict(start, end).