[PYTHON] Ich habe versucht, Zeitreihen zu analysieren! (AR-Modell)

Überblick

Ich habe tatsächlich versucht, die Zeitreihenanalysebibliothek zu verwenden. (statsmodels.api.tsa) In diesem Artikel untersucht der Autor die Theorie der Zeitreihenanalyse. Dies ist ein autarker Artikel, den ich geschrieben habe, um mein Verständnis zu etablieren.

Analysezusammenfassung

Erstellen Sie Daten mit dem folgenden AR-Modell (mit Beständigkeit) und Die Parameterschätzung wurde mit der Statistikmodellbibliothek "ARMA" durchgeführt. Ich habe auch den ADF-Test ausprobiert, um festzustellen, ob er stabil ist.

--Erstellte Daten: Erstellen Sie tägliche Daten mit dem folgenden Modell AR (1) (2018/1/1 ~ 2019/12/31) y_{t}=2+0.8y_{t-1}

Annahme

--AR-Modell (Selbstregressionsmodell Auto-Regression) Ein Modell, bei dem der Wert zum Zeitpunkt t durch eine lineare Kombination der Werte zu den letzten Zeitpunkten (t-1) bis (t-p) in der Vergangenheit dargestellt wird, wie unten gezeigt. $ u_ {t} $ ist der Fehlerterm, weißes Rauschen (Normalverteilung mit Mittelwert 0). Wenn es bis zu (t-p) ausgedrückt wird, wird es als AR (p) -Modell ausgedrückt. Dieses Mal werden Daten unter Verwendung des AR (1) -Modells erstellt und Parameter werden unter Verwendung des AR (1) -Modells geschätzt. y_{t}=c+a_{1}y_{t-1}+a_{2}y_{t-2}+\ldots +a_{p}y_{t-p}+u_{t}

--Konstanz Wenn "der Durchschnitt zu allen Zeitpunkten konstant ist und die Kovarianz mit vor k Zeitpunkten nur von k abhängt" Die Zeitreihe soll "Beständigkeit" haben. Im Fall des AR (1) -Modells ist dies Gegenstand dieser Analyse Die Bedingungen für die Stabilität sind wie folgt. 「y_{t}In der Modellformel von_{t-1}Koeffizient vona_{1}Aber|a_{1}| < 1Treffen. ""

Analysedetails (Code)

1. Bibliotheksimport

import os
import pandas as pd
import random
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import display
import statsmodels.api as sm

Daten; ts_data

#Wahrer Parameter(Alles weniger als 1, um es stabil zu machen)
params_list = [2 , -0.8]
params_num = len(params_list)
print("Wahrer Parameter(c , a_(t-1) , a_(t-2))" , ":" , params_list)
print("Anzahl der wahren Parameter" , ":" , params_num)

#Erstellung von Zeitreihendaten
index_date = pd.date_range('2018-01-01' , '2019-12-31' , freq='D')
N = len(index_date)
init_y_num = params_num - 1
init_y_list = [random.randint(-1000 , 1000) for _ in range(init_y_num)]
print("index_date" , ":" , index_date[:6])
print("N" , ":" , N)
print("Anfangsdaten({}Stücke)".format(init_y_num) , ":" , init_y_list)

ts_data_list = list()
for i in range(N):
    if i < init_y_num:
        ts_data_list.append(init_y_list[i])
    else:
        y = params_list[0] + sum([params_list[j+1] * ts_data_list[i-(j+1)] for j in range(params_num - 1)])
        ts_data_list.append(y)
print("ts_data_list" , ":" , ts_data_list[:5])

ts_data = pd.Series(ts_data_list , index=index_date)
print("ts_data" , ":")
print(ts_data)

data.jpg

3. Diagramm (gestrichelte Linie) _ Datenbestätigung

#Diagrammerstellung
fig = plt.figure(figsize=(15 ,10))

data = ts_data[:10]
ax_1 = fig.add_subplot(221)
ax_1.plot(data.index , data , marker="o")

plt.title("ten days from 2018/01/01")
plt.xlabel("date")
plt.ylabel("value")
plt.xticks(rotation=45)

data = ts_data[-10:]
ax_2 = fig.add_subplot(222)
ax_2.plot(data.index , data , marker="o")

plt.title("ten days to 2019/12/31")
plt.xlabel("date")
plt.ylabel("value")
plt.xticks(rotation=45)

plt.show()

graph.jpg

4. AR-Modell lernen

Modellieren Sie das Lernen mit den folgenden 3 Datentypen und bestätigen Sie die Ergebnisse. ① Alle Zeiträume (2018/1/1 ~ 2019/12/31) ② 50 Tage ab dem 1. Januar 2018 ③ 50 Tage bis zum 31.12.2019

#AR Lernergebnis_Daten lernen ①(Ganze Periode)
print("① Alle Zeiträume" , "-" * 80)
data = ts_data
arma_result = sm.tsa.ARMA(data , order=(1 , 0)).fit(trend='c' , method='mle')
print(arma_result.summary())
print()

#AR Lernergebnis_Daten lernen ②(2018/1/50 Tage ab 1)
print("② 2018/1/50 Tage ab 1" , "-" * 80)
data = ts_data[:50]
arma_result = sm.tsa.ARMA(data , order=(1 , 0)).fit(trend='c' , method='mle')
print(arma_result.summary())
print()

#AR Lernergebnis_Daten lernen ③(2019/12/50 Tage bis 31)
print("③ 2019/12/50 Tage bis 31" , "-" * 80)
data = ts_data[-50:]
arma_result = sm.tsa.ARMA(data , order=(1 , 0)).fit(trend='c' , method='mle')
print(arma_result.summary())
print()

arma_1.jpg arma_2.jpg arma_3_1.jpgarma_3_2.jpg Vergleich der Coefs für ① und ② Sowohl der konstante Term (const) als auch der Koeffizient (ar.L1.y) von $ y_ {t-1} $ ① ist näher am wahren Modell. In Bezug auf (3) wird die Protokollausgabe "Die Zielzeitreihe hat keine Beständigkeit. Sie sollten die Beständigkeitszeitreihe eingeben."

Aus den Ergebnissen von ① bis ③ Die Form am Anfang passt besser zum Modell als an den späteren Punkten. Warum?

5. ADF-Test

Führen Sie den ADF-Test für die gleichen Daten ① bis ③ wie in 4 durch. Überprüfen Sie den P-Wert und bestätigen Sie, bei welchem Signifikanzniveau die Nullhypothese verworfen wird.

#AR Lernergebnis_Daten lernen ①(Ganze Periode)
print("① Alle Zeiträume" , "-" * 80)
data = ts_data
result = sm.tsa.stattools.adfuller(data)
print('value = {:.4f}'.format(result[0]))
print('p-value = {:.4}'.format(result[1]))
print()

#AR Lernergebnis_Daten lernen ②(2018/1/50 Tage ab 1)
print("② 2018/1/50 Tage ab 1" , "-" * 80)
data = ts_data[:50]
result = sm.tsa.stattools.adfuller(data)
print('value = {:.4f}'.format(result[0]))
print('p-value = {:.4}'.format(result[1]))
print()

#AR Lernergebnis_Daten lernen ③(2019/12/50 Tage bis 31)
print("③ 2019/12/50 Tage bis 31" , "-" * 80)
data = ts_data[-50:]
result = sm.tsa.stattools.adfuller(data)
print('value = {:.4f}'.format(result[0]))
print('p-value = {:.4}'.format(result[1]))
print()

adf.jpg

Alle Testwerte (Werte) sind im absoluten Wert sehr groß, Der P-Wert (p-Wert) beträgt 0,0. Auch wenn das Signifikanzniveau auf 1% eingestellt ist In allen Fällen (1) bis (3) wurde die Nullhypothese zurückgewiesen.

(Obwohl alle p-Werte 0,0 sind, was ein relativ bedeutungsloser Vergleich sein kann) Vergleich der absoluten Werte der Testgrößen, ① > ② > ③ Und (weil die Daten vollständig AR sind (1)) Als Ergebnis des ADF-Tests hatte ich das Gefühl, dass die Bewertung zu Beginn korrekter war.

Zusammenfassung

Aus den Modelltrainingsergebnissen und dem ADF-Test Zu Beginn wurde es korrekter bewertet. Insbesondere das Modelllernergebnis von (3) war völlig unerwartet. Der Autor hat den Kausalzusammenhang, warum ein solches Ergebnis erzielt wurde, noch nicht verstanden. Ich hoffe, ich kann es herausfinden, während ich weiter studiere.

Recommended Posts

Ich habe versucht, Zeitreihen zu analysieren! (AR-Modell)
Zeitreihenanalyse 2 Stabilität, ARMA / ARIMA-Modell
Zeitreihenanalyse Teil 2 AR / MA / ARMA
Zeitreihenanalyse 4 Konstruktion des SARIMA-Modells
Python: Zeitreihenanalyse
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
Python: Zeitreihenanalyse: Erstellen eines SARIMA-Modells
Python: Zeitreihenanalyse: Konstanz, ARMA / ARIMA-Modell
Zeitreihenanalyse Teil 4 VAR
Zeitreihenanalyse Teil 3 Prognose
Zeitreihenanalyse Teil 1 Autokorrelation
Ich habe versucht, "Grundlagen der Zeitreihenanalyse und des Zustandsraummodells" (Hayamoto) mit Pystan zu implementieren
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Umsatzprognose für die Zeitreihenanalyse
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
[Statistik] [Zeitreihenanalyse] Zeichnen Sie das ARMA-Modell und erfassen Sie die Tendenz.
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich habe versucht, Faktoren mit Titanic-Daten zu analysieren!
Zeitreihenanalyse Nr. 6 Gefälschte Rückkehr und republikanischer Teil
[Kaggle] Ich habe versucht, mithilfe von tsfresh das Feature-Quantity-Engineering mehrdimensionaler Zeitreihendaten durchzuführen
Ich habe versucht zu kratzen
Ich habe PyQ ausprobiert
Zeitreihenzerlegung
Ich habe zuerst die SARS-Analyse vor dem Corona-Virus versucht
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
Ich habe zum ersten Mal versucht, Python zu programmieren.
Ich habe versucht, FX technische Analyse von AI "scikit-learn"
Ich habe AutoKeras ausprobiert
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe Mind Meld zum ersten Mal ausprobiert
Ich habe es mit Papiermühle versucht
Einführung in die Zeitreihenanalyse ~ Saisonales Anpassungsmodell ~ In R und Python implementiert
Ich habe versucht, morphologische Analyse und Wortvektorisierung
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Zeichne ein Diagramm mit Julia ... Ich habe eine kleine Analyse versucht
Ich habe eine emotionale Analyse von Amazon Comprehend mit der AWS CLI durchgeführt.
Python 3.4 Windows7-64bit-Umgebung erstellen (für die Analyse finanzieller Zeitreihen)
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Ich habe versucht, ein Beispielmodell von Pytorch mit TorchServe zu hosten
AI Gaming Ich habe es zum ersten Mal versucht
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Pymc auszuführen
Ich habe ARP-Spoofing ausprobiert
Ich habe versucht, aiomysql zu verwenden