J'ai en fait essayé d'utiliser la bibliothèque d'analyse de séries chronologiques. (statsmodels.api.tsa) Dans cet article, l'auteur étudie la théorie de l'analyse des séries chronologiques. C'est un article autosuffisant que j'ai écrit pour établir ma compréhension.
Créez des données avec le modèle AR suivant (avec stabilité) et L'estimation des paramètres a été réalisée avec la bibliothèque statsmodels "ARMA". J'ai également essayé le test ADF pour voir s'il avait de la stabilité.
--Données créées: créer des données quotidiennes avec le modèle AR (1) suivant (2018/1/1 ~ 2019/12/31)
--Constance
Si "la moyenne est constante à tous les points dans le temps et la covariance avec avant k points dans le temps ne dépend que de k"
On dit que la série chronologique est "stable".
Dans le cas du modèle AR (1) qui fait l'objet de cette analyse
Les conditions de stabilité sont les suivantes.
「
Test DF L'un des tests a appelé le test de racine unitaire. En supposant que la série temporelle cible est AR (1) (L'hypothèse nulle est "racine unitaire") Un test qui rend l'hypothèse alternative "stationnaire". La quantité de test est une distribution normale standard.
Test ADF (test DF étendu) Alors que le test DF est uniquement AR (1) Un test qui l'étend pour qu'il puisse également être appliqué à AR (p). Comme le test DF L'hypothèse alternative est "stationnaire", La quantité de test est une distribution normale standard.
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
Données; ts_data
#Vrai paramètre(Tous moins de 1 pour le rendre stable)
params_list = [2 , -0.8]
params_num = len(params_list)
print("Vrai paramètre(c , a_(t-1) , a_(t-2))" , ":" , params_list)
print("Nombre de vrais paramètres" , ":" , params_num)
#Création de données de séries chronologiques
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("Donnée initiale({}Pièces)".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)
#Création de graphes
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()
Modélisez l'apprentissage avec les 3 types de données suivants et confirmez les résultats. ① Toute la période (2018/1/1 ~ 2019/12/31) ② 50 jours à partir du 1er janvier 2018 ③ 50 jours jusqu'au 31/12/2019
#Résultat d'apprentissage AR_Données d'apprentissage ①(Période entière)
print("① Toute période" , "-" * 80)
data = ts_data
arma_result = sm.tsa.ARMA(data , order=(1 , 0)).fit(trend='c' , method='mle')
print(arma_result.summary())
print()
#Résultat d'apprentissage AR_Données d'apprentissage ②(2018/1/50 jours à partir de 1)
print("② 2018/1/50 jours à partir de 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()
#Résultat d'apprentissage AR_Données d'apprentissage ③(2019/12/50 jours jusqu'à 31)
print("③ 2019/12/50 jours jusqu'à 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()
… Comparaison des coefs pour ① et ② Le terme constant (const) et le coefficient (ar.L1.y) de $ y_ {t-1} $ ① est plus proche du vrai modèle. Concernant (3), la sortie du journal "La série chronologique cible n'a pas de stabilité. Vous devez saisir la série chronologique de stabilité."
Des résultats de ① à ③ La forme au début s'adapte mieux au modèle qu'aux points ultérieurs. Pourquoi?
Effectuez le test ADF pour les mêmes données ① à ③ qu'en 4. Vérifiez la valeur P et confirmez à quel niveau de signification l'hypothèse nulle sera rejetée.
#Résultat d'apprentissage AR_Données d'apprentissage ①(Période entière)
print("① Toute période" , "-" * 80)
data = ts_data
result = sm.tsa.stattools.adfuller(data)
print('value = {:.4f}'.format(result[0]))
print('p-value = {:.4}'.format(result[1]))
print()
#Résultat d'apprentissage AR_Données d'apprentissage ②(2018/1/50 jours à partir de 1)
print("② 2018/1/50 jours à partir de 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()
#Résultat d'apprentissage AR_Données d'apprentissage ③(2019/12/50 jours jusqu'à 31)
print("③ 2019/12/50 jours jusqu'à 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()
Toutes les valeurs de test (valeurs) sont très grandes en valeur absolue, La valeur P (valeur p) est 0,0. Même si le niveau de signification est défini sur 1% Dans tous les cas (1) à (3), l'hypothèse nulle a été rejetée.
(Bien que toutes les valeurs p soient de 0,0, ce qui peut être une comparaison relativement dénuée de sens) Comparaison des valeurs absolues des grandeurs de test, ① > ② > ③ Et (parce que les données sont complètement AR (1)) À la suite du test ADF, j'ai estimé que l'évaluation était plus correcte au début.
À partir des résultats de la formation du modèle et du test ADF Au début, il a été évalué plus correctement. En particulier, le résultat d'apprentissage du modèle de (3) était complètement inattendu. L'auteur n'a pas encore compris la relation causale quant à la raison pour laquelle un tel résultat a été obtenu. J'espère que je pourrai le découvrir en poursuivant mes études.
Recommended Posts