Dans la continuité de la période précédente, nous utiliserons les données historiques TOPIX et les données mensuelles sur les visiteurs étrangers.
Dans les prédictions suivantes, la prédiction qui minimise l'erreur quadratique moyenne (MSE) est la prédiction optimale.
À ce stade, la prévision optimale à un terme est
Ce qui précède est la prédiction ponctuelle du processus AR, mais la prédiction de section est la suivante.
Prenons une prévision de section à 95% une période à venir.
Lorsque $ y \ sim N (\ mu, \ sigma ^ 2) $,
En général, il est difficile de trouver le h-terme MSE de $ AR (p) $, et une méthode qui se rapproche par simulation est utilisée.
S'il y a un nombre infini d'observations, le processus MA inversable est
D'un autre côté, même lorsqu'il n'y a qu'un nombre fini de valeurs observées, les prédictions au-delà de la période $ q $ sont des valeurs attendues du processus et MSE est la dispersion du processus. Pour les prédictions jusqu'à la période $ q $, il est courant de supposer $ \ epsilon = 0 $ avant la période d'échantillonnage.
La prédiction de processus ARMA est une combinaison du processus AR et des prédictions de processus MA.
Ci-dessous, nous tenterons de prédire le processus ARMA en utilisant les données sur le nombre de visiteurs étrangers au Japon qui ont également été utilisées dans la partie 2 (https://qiita.com/asys/items/622594cb482e01411632).
Dans la partie 2, je sais que $ p = 4, q = 1 $ semble bon, je vais donc l'utiliser. Cette fois, sur les 138 données totales, les 100 premières seront utilisées pour la construction du modèle et les 38 autres seront prédites. Vous pouvez facilement obtenir une prédiction en utilisant la fonction de prédiction comme suit.
arma_model = sm.tsa.ARMA(v['residual'].dropna().values[:100], order=(4,1))
result = arma_model.fit()
pred = result.predict(start=0,end=138)
arma_model = sm.tsa.ARMA(v['residual'].dropna().values[:100], order=(4,1))
result = arma_model.fit()
pred = result.predict(start=0,end=138)
pred[:100] = np.nan
plt.figure(figsize=(10,4))
plt.plot(v['residual'].dropna().values, label='residual')
plt.plot(result.fittedvalues, label='ARMA(4,1)')
plt.plot(pred, label='ARMA(4,1) pred', linestyle='dashed', color='magenta')
plt.legend()
plt.grid()
plt.title('ARMA(4,1) prediction')
plt.show()
La prédiction est une combinaison du processus AR et du processus MA, et il est cohérent avec la compréhension intuitive que la précision diminue à mesure que la période de prédiction s'allonge. En revanche, la précision de la prédiction pour les premier et deuxième termes n'est pas mauvaise. La façon d'utiliser les prévisions variera considérablement en fonction de l'objectif, mais par exemple, en bourse, le nombre de visiteurs étrangers mensuels au Japon affectera les mouvements de prix ultérieurs des stocks entrants, alors prévoyez le nombre avant la publication et la position Il peut être utilisé pour prendre. Dans ce cas, tout ce qui est nécessaire est une prédiction une période à l'avance, et nous ne sommes intéressés que par la précision de la prédiction une période à venir. Donc, si vous regardez la précision de la prédiction une période à l'avance,
res_arr = []
for i in range(70,138):
arma_model = sm.tsa.ARMA(v['residual'].dropna().values[:i], order=(4,1))
result = arma_model.fit()
pred = result.predict(i)[0]
res_arr.append([v['residual'].dropna().values[i], pred])
res_arr = np.array(res_arr)
sns.regplot(x=res_arr[:,0], y=res_arr[:,1])
plt.xlabel('observed')
plt.ylabel('predicted')
plt.show()
Donc, bien qu'il y ait une corrélation positive, il y a beaucoup de variation, et c'est un niveau qui hésite à le mettre dans la bataille réelle.
Recommended Posts