In Anlehnung an die vorherige Zeit werden wir historische TOPIX-Daten verwenden. Außerdem hatte ich das Gefühl, dass es Daten gab, die eine Autokorrelation zu haben schienen, und so bereitete ich jeden Monat Daten über die Anzahl ausländischer Besucher in Japan vor. Ich habe die auf der Website des JTB Research Institute unten verlinkte verwendet. https://www.tourism.jp/tourism-database/stats/inbound/ Auf den ersten Blick sind die Daten saisonabhängig und der Yen wertet in Abenomics ab, sodass der Gesamttrend nach oben tendiert.
wn = np.random.randn(50)
mu = 0.0
theta_1 = 1.0
map = mu + wn[1:] + theta_1 * wn[:-1]
Die Daten wurden so generiert.
Wenn man die grüne Linie $ \ theta_1 = 0.0 $ als Referenz betrachtet, ist der Einfluss des Vorzeichens und des Werts von $ \ theta_1 $ leicht zu verstehen. Die blaue Linie ($ \ theta_1 = 1,0
Die Hauptstatistiken lauten wie folgt.
mean :
Überprüfen Sie das Cholerogramm. In der obigen Darstellung beträgt die Anzahl der Daten 50, hier wird sie jedoch mit 1.000 Daten erstellt.
Bis zu diesem Punkt ist es ein intuitives Bild. Nur die Autokorrelation erster Ordnung ist signifikant, und wenn $ \ theta_1 <0 $ ist, ist die Autokorrelation ein negativer Wert.
Schauen wir uns als nächstes eine Verallgemeinerung des MA-Prozesses an.
Die Hauptstatistiken lauten wie folgt.
[Ergänzung] Was ist Stationarität?
Wenn weniger als $ \ quad $ gilt, ist der Prozess eine schwache Stationarität.
Lassen Sie es uns planen. Hier ist $ y_0 = 0 $, $ c = 1 $ und $ \ 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()
Die Hauptstatistiken lauten wie folgt. Jedoch,
Als nächstes folgt der verallgemeinerte AR-Prozess.
Die Hauptstatistiken lauten wie folgt.
Das Cholerogramm ist wie folgt.
$ ARMA (p, q) $ hat die folgenden Eigenschaften.
Zeichnen wir tatsächlich $ ARMA (3,3) $. Die Parameter sind wie folgt.
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)
Konstanz
(Dies entspricht dem stationären Zustand des AR-Prozesses.)
AR characteristic equation :
Reversibilität
Der MA-Prozess ist reversibel, wenn der MA-Prozess in einen AR (∞) -Prozess umgeschrieben werden kann.
MA characteristic equation :
Minimale Quadrate (OLS: gewöhnliche kleinste Quadrate)
OLS wählt die Parameter des ARMA-Modells aus, um die Summe der quadratischen Residuen (SSR) zwischen den tatsächlich beobachteten Werten und den vom ARMA-Modell geschätzten Werten zu minimieren.
Sie können die normale Gleichung lösen, die teilweise durch den Parameter für jeden Parameter differenziert ist.
Maximum Likelihood Estimation (MLE)
Die wahrscheinlichste Methode ist der Ansatz zur Auswahl des Parameters, der die logarithmische Wahrscheinlichkeit maximiert.
Von hier aus schätzen wir die Parameter für $ ARMA (3,3) $, die tatsächlich in 5 erstellt wurden. Verwenden Sie die Statistikmodellbibliothek, da die manuelle Berechnung kompliziert ist. Weitere Informationen finden Sie unter der folgenden URL. https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima_model.ARMA.html Es scheint, dass, wenn Sie dem Argument von ARMA die Stichprobenstichprobe und die Reihenfolge des Modells mit der Reihenfolge = (p, q) geben, der Parameter durch die wahrscheinlichste Schätzung berechnet wird.
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
-----------------------------------------------------------------------------
Und so weiter. Es ist möglich, einen Wert zu schätzen, der dem ursprünglichen Parameter angemessen nahe kommt. Ein paar Anmerkungen, S. D. von Innovationen, stellen die Streuung von weißem Rauschen dar, und um den Wert von c aus const zu finden,
print(result.params[0] * (1-result.arparams.sum()))
0.9824998883509097
Müssen als tun.
Um $ ARMA (p, q) $ auszuwählen, müssen Sie zunächst die Werte von $ p, q $ konservativ aus den Werten der Autokorrelation und der partiellen Autokorrelation eingrenzen und dann das optimale Modell basierend auf der Informationsmenge bestimmen. nehmen.
Erstens ist die partielle Autokorrelation k-ter Ordnung $ y_t $ und $ y_ {tk} $ abzüglich der Auswirkungen von $ y_ {t-1}, \ cdots, y_ {t-k + 1} $. Es ist definiert als die Korrelation von Dingen.
In Anbetracht der obigen Definition sind die in der folgenden Tabelle gezeigten Eigenschaften klar.
Modell- | Autokorrelation | 偏Autokorrelation |
---|---|---|
Zerfallen | ||
Zerfallen | ||
Zerfallen | Zerfallen |
Dies ermöglicht es, das Modell in gewissem Maße einzugrenzen, indem die Struktur der Autokorrelation der Probe und der partiellen Autokorrelation der Probe betrachtet wird.
Als nächstes folgt das Informationskriterium (IC).
Wir haben Daten zu TOPIX und der Anzahl ausländischer Besucher in Japan vorbereitet, aber beide sind nicht stabil. Daher hatte ich keine andere Wahl, als Daten zu erstellen, die Trends ausschließen, indem ich den gleitenden Durchschnitt für den Teil 1996-2007 von der Anzahl ausländischer Besucher in Japan abziehe.
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()
Als Trend habe ich mich für einen gleitenden Durchschnitt von 6 Monaten vorher und nachher entschieden. Dies wird durch Rollen (Fenster = 13), Mittelwert () und Verschieben (-6) verarbeitet.
Betrachten wir zunächst die Autokorrelation und die teilweise Autokorrelation. Sehr einfach mit der Bibliothek.
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()
Es gibt eine starke Saisonalität, die nicht verborgen werden kann. .. .. Die Korrelation alle 12 Monate ist sehr stark. Sie können arma_order_select_ic von statsmodels verwenden, um die optimale Reihenfolge für Ihr ARMA-Modell zu schätzen. Weitere Informationen finden Sie unter diesem Link (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')
Hier wird für $ ARMA (p, q) $ der AIC-Standard verwendet, wobei der Maximalwert von $ p $ 4 und der Maximalwert von $ q $ 2 beträgt.
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 |
Ich habe das Gefühl, dass sich keiner von ihnen viel ändert, aber das Ergebnis ist, dass $ p = 4, q = 1 $ gut ist.
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()
Es ist so. Persönlich hatte ich das Gefühl, dass er sein Bestes gab, obwohl er ein relativ einfaches Modell war.
Recommended Posts