En continuant de la fois précédente, nous utiliserons les données historiques TOPIX. De plus, j'ai senti qu'il y avait des données qui semblaient avoir une autocorrélation, j'ai donc préparé des données sur le nombre de visiteurs étrangers au Japon chaque mois. J'ai utilisé celui sur le site Web de JTB Research Institute lié ci-dessous. https://www.tourism.jp/tourism-database/stats/inbound/ À première vue, les données sont saisonnières et le yen se déprécie dans les Abenomics, donc la tendance générale est à la hausse.
wn = np.random.randn(50)
mu = 0.0
theta_1 = 1.0
map = mu + wn[1:] + theta_1 * wn[:-1]
Les données ont été générées comme ça.
En considérant la ligne verte $ \ theta_1 = 0.0 $ comme référence, il est facile de comprendre l'influence du signe et de la valeur de $ \ theta_1
Les principales statistiques sont les suivantes.
mean :
Vérifiez le cholérogramme. Dans le graphique ci-dessus, le nombre de données est de 50, mais ici il est créé avec 1000 données.
Jusqu'à présent, c'est une image intuitive. Seule l'autocorrélation du premier ordre est significative, et lorsque $ \ theta_1 <0 $, l'autocorrélation est une valeur négative.
Ensuite, regardons une généralisation du processus MA.
Les principales statistiques sont les suivantes.
[Supplément] Qu'est-ce que la stationnarité?
Si moins de $ \ quad $ tient, le processus est une stationnarité faible.
Tracons-le. Ici, $ y_0 = 0 $, $ c = 1 $ et $ \ sigma ^ 2 = 1 $.
AR1 = []
y = 0
c = 1
phi_1 = 0.5
for i in range(200):
AR1.append(y)
y = c + phi_1*y + np.random.randn()
Les principales statistiques sont les suivantes. cependant,
Vient ensuite le processus de RA généralisé.
Les principales statistiques sont les suivantes.
Le cholérogramme est le suivant.
$ ARMA (p, q) $ a les propriétés suivantes.
Tracons en fait $ ARMA (3,3) $. Les paramètres sont les suivants.
arma = [0,0,0]
wn = [0,0,0]
c = 1.5
phi_1 = -0.5
phi_2 = 0.5
phi_3 = 0.8
theta_1 = 0.8
theta_2 = 0.5
theta_3 = -0.5
for i in range(1000):
eps = np.random.randn()
y = c + phi_1*arma[-1] + phi_2*arma[-2] + phi_3*arma[-3] + eps + theta_1*wn[-1] + theta_2*wn[-2] + theta_3*wn[-3]
wn.append(eps)
arma.append(y)
La constance
(C'est la même chose que l'état stable du processus AR.)
AR characteristic equation :
Réversibilité
Le processus MA est réversible lorsque le processus MA peut être réécrit en un processus AR (∞).
MA characteristic equation :
Carrés minimum (OLS: moindres carrés ordinaires)
OLS sélectionne les paramètres du modèle ARMA pour minimiser la somme des carrés des résidus (SSR) entre les valeurs réellement observées et les valeurs estimées par le modèle ARMA.
Vous pouvez résoudre l'équation normale qui est partiellement différenciée par le paramètre de chaque paramètre.
Estimation du maximum de vraisemblance (MLE)
La méthode la plus probable est l'approche consistant à sélectionner le paramètre qui maximise la vraisemblance logarithmique.
À partir de là, estimons les paramètres pour $ ARMA (3,3) $ réellement créés en 5. Comme il est compliqué de calculer à la main, utilisez la bibliothèque statsmodels. Pour plus de détails, accédez à l'URL suivante. https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima_model.ARMA.html Il semble que si vous donnez l'échantillon échantillon et l'ordre du modèle avec order = (p, q) à l'argument d'ARMA, le paramètre sera calculé par l'estimation la plus probable.
arma_model = sm.tsa.ARMA(arma, order=(3,3))
result = arma_model.fit()
print(result.summary())
ARMA Model Results
==============================================================================
Dep. Variable: y No. Observations: 1003
Model: ARMA(3, 3) Log Likelihood -1533.061
Method: css-mle S.D. of innovations 1.113
Date: Sun, 08 Dec 2019 AIC 3082.123
Time: 14:51:34 BIC 3121.409
Sample: 0 HQIC 3097.052
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const 6.8732 0.410 16.773 0.000 6.070 7.676
ar.L1.y -0.4986 0.024 -21.149 0.000 -0.545 -0.452
ar.L2.y 0.5301 0.019 27.733 0.000 0.493 0.568
ar.L3.y 0.8256 0.020 41.115 0.000 0.786 0.865
ma.L1.y 0.7096 0.036 19.967 0.000 0.640 0.779
ma.L2.y 0.3955 0.039 10.176 0.000 0.319 0.472
ma.L3.y -0.4078 0.033 -12.267 0.000 -0.473 -0.343
Roots
=============================================================================
Real Imaginary Modulus Frequency
-----------------------------------------------------------------------------
AR.1 1.0450 -0.0000j 1.0450 -0.0000
AR.2 -0.8436 -0.6689j 1.0766 -0.3933
AR.3 -0.8436 +0.6689j 1.0766 0.3933
MA.1 -0.6338 -0.8332j 1.0469 -0.3535
MA.2 -0.6338 +0.8332j 1.0469 0.3535
MA.3 2.2373 -0.0000j 2.2373 -0.0000
-----------------------------------------------------------------------------
Etc. Il est possible d'estimer une valeur raisonnablement proche du paramètre d'origine. Quelques notes, S.D. des innovations représente la dispersion du bruit blanc, et pour trouver la valeur de c à partir de const,
print(result.params[0] * (1-result.arparams.sum()))
0.9824998883509097
Besoin de faire comme.
Pour sélectionner $ ARMA (p, q) $, commencez par réduire de manière conservatrice les valeurs de $ p, q $ à partir des valeurs d'autocorrélation et d'autocorrélation partielle, puis déterminez le modèle optimal en fonction de la quantité d'informations. prendre.
Premièrement, l'autocorrélation partielle d'ordre k supprime l'influence de $ y_ {t-1}, \ cdots, y_ {t-k + 1} $ de $ y_t $ et $ y_ {tk} $. Il est défini comme la corrélation des choses.
Compte tenu de la définition ci-dessus, les propriétés indiquées dans le tableau ci-dessous sont claires.
modèle | Autocorrélation | 偏Autocorrélation |
---|---|---|
Pourriture | ||
Pourriture | ||
Pourriture | Pourriture |
Cela permet d'affiner dans une certaine mesure le modèle en examinant la structure de l'autocorrélation de l'échantillon et de l'autocorrélation partielle de l'échantillon.
Vient ensuite le critère d'information (IC).
Nous avons préparé des données sur TOPIX et le nombre de visiteurs étrangers au Japon, mais les deux sont en train de ne pas être stables. Par conséquent, je n'avais pas d'autre choix que de créer des données qui excluent les tendances en soustrayant la moyenne mobile pour la partie 1996-2007 du nombre de visiteurs étrangers au Japon.
visit.head(3)
month | visits | |
---|---|---|
0 | 1996-01-01 | 276086 |
1 | 1996-02-01 | 283667 |
2 | 1996-03-01 | 310702 |
visit['trend'] = visit['visits'].rolling(window=13).mean().shift(-6)
visit['residual'] = visit['visits'] - visit['trend']
v = visit[visit['month']<'2008-01-01']
plt.plot(v['month'].values, v['visits'].values, label='original')
plt.plot(v['month'].values, v['trend'].values, label='trend')
plt.plot(v['month'].values, v['residual'].values, label='residual')
plt.legend()
plt.grid()
plt.title('Foreign Visitors')
plt.show()
Comme tendance, j'ai décidé de prendre une moyenne mobile de 6 mois avant et après. Ceci est traité en roulant (window = 13) .mean () et shift (-6).
Tout d'abord, examinons l'autocorrélation et l'autocorrélation partielle. Très facile avec la bibliothèque.
fig = plt.figure(figsize=(8,5))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(v['residual'].dropna().values, lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(v['residual'].dropna().values, lags=40, ax=ax2)
plt.tight_layout()
fig.show()
Il existe une forte saisonnalité qui ne peut être cachée. .. .. La corrélation tous les 12 mois est très forte. Vous pouvez utiliser arma_order_select_ic de statsmodels pour estimer l'ordre optimal de votre modèle ARMA. Pour plus de détails, accédez à ce lien (https://www.statsmodels.org/dev/generated/statsmodels.tsa.stattools.arma_order_select_ic.html)
sm.tsa.arma_order_select_ic(v['residual'].dropna().values, max_ar=4, max_ma=2, ic='aic')
Ici, pour $ ARMA (p, q) $, la norme AIC est utilisée avec la valeur maximale de $ p $ étant de 4 et la valeur maximale de $ q $ étant de 2.
0 | 1 | 2 | |
---|---|---|---|
0 | 3368.221521 | 3363.291271 | 3350.327397 |
1 | 3365.779849 | 3348.257023 | 3331.293926 |
2 | 3365.724955 | 3349.083663 | 3328.831252 |
3 | 3361.660853 | 3347.156390 | 3329.447773 |
4 | 3332.100417 | 3290.984260 | 3292.800604 |
Je pense qu'aucun d'entre eux ne change beaucoup, mais le résultat est que $ p = 4, q = 1 $ est bon.
arma_model = sm.tsa.ARMA(v['residual'].dropna().values, order=(4,1))
result = arma_model.fit()
plt.figure(figsize=(10,4))
plt.plot(v['residual'].dropna().values, label='residual')
plt.plot(result.fittedvalues, label='ARMA(4,1)')
plt.legend()
plt.grid()
plt.title('ARMA(4,1)')
plt.show()
C'est comme ça. Personnellement, je sentais qu'il faisait de son mieux malgré le fait qu'il était un modèle relativement simple.
Recommended Posts