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.
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)
--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.
--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.
「
DF-Test Einer der Tests wird als Unit-Root-Test bezeichnet. Angenommen, die Zielzeitreihe ist AR (1) (Die Nullhypothese lautet "Einheitswurzel") Ein Test, der die alternative Hypothese "stationär" macht. Die Testmenge ist eine Standardnormalverteilung.
ADF-Test (erweiterter DF-Test) Während der DF-Test nur AR ist (1) Ein Test, der es so erweitert, dass es auch auf AR angewendet werden kann (p). Wie der DF-Test Die alternative Hypothese ist "stationär", Die Testmenge ist eine Standardnormalverteilung.
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)
#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()
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()
… 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?
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()
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.
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