[PYTHON] J'ai essayé l'analyse de séries chronologiques! (Modèle AR)

Aperçu

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.

Résumé de l'analyse

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) y_{t}=2+0.8y_{t-1} --Modèle d'apprentissage: AR (1) à terme constant * ARMA (1,0)

supposition

--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. 「y_{t}Dans la formule modèle de_{t-1}Coefficient dea_{1}Mais|a_{1}| < 1Rencontrer. "

Détails de l'analyse (code)

1. Importation de la bibliothèque

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

2. Création de données

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)

data.jpg

3. Graphique (ligne pointillée) _ confirmation des données

#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()

graph.jpg

4. Apprentissage du modèle AR

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()

arma_1.jpg arma_2.jpg arma_3_1.jpgarma_3_2.jpg 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?

5. Test ADF

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()

adf.jpg

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.

Résumé

À 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

J'ai essayé l'analyse de séries chronologiques! (Modèle AR)
Analyse des séries chronologiques 2 Stabilité, modèle ARMA / ARIMA
Analyse des séries chronologiques Partie 2 AR / MA / ARMA
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Python: analyse des séries chronologiques
Analyse des séries chronologiques RNN_LSTM1
Analyse des séries chronologiques 1 Principes de base
Python: analyse des séries temporelles: création d'un modèle SARIMA
Python: Analyse des séries temporelles: Constantity, modèle ARMA / ARIMA
Analyse des séries chronologiques partie 4 VAR
Analyse de séries chronologiques Partie 3 Prévisions
Analyse de séries chronologiques Partie 1 Autocorrélation
J'ai essayé d'implémenter "Bases de l'analyse des séries temporelles et du modèle d'espace d'état" (Hayamoto) avec pystan
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Analyse des séries chronologiques
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
[Statistiques] [Analyse des séries chronologiques] Tracez le modèle ARMA et saisissez la tendance.
J'ai essayé tensorflow pour la première fois
J'ai essayé l'analyse factorielle avec des données Titanic!
Analyse des séries chronologiques n ° 6 Faux retour et partie républicaine
[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh
J'ai essayé de gratter
J'ai essayé PyQ
Décomposition des séries temporelles
J'ai essayé l'analyse du SRAS avant le virus corona
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
J'ai essayé la programmation python pour la première fois.
J'ai essayé l'analyse technique FX par AI "scikit-learn"
J'ai essayé AutoKeras
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé Mind Meld pour la première fois
J'ai essayé le moulin à papier
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python
J'ai essayé l'analyse morphologique et la vectorisation de mots
J'ai essayé django-slack
J'ai essayé Django
J'ai essayé spleeter
J'ai essayé cgo
Dessine un graphique avec Julia ... j'ai essayé une petite analyse
J'ai fait une analyse émotionnelle d'Amazon Comprehend avec l'AWS CLI.
Python 3.4 Créer un environnement Windows7-64bit (pour l'analyse des séries chronologiques financières)
J'ai essayé de prédire le match de la J League (analyse des données)
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé python pour la première fois avec heroku
J'ai essayé d'héberger un exemple de modèle de Pytorch en utilisant TorchServe
AI Gaming Je l'ai essayé pour la première fois
J'ai essayé de trouver la classe alternative avec tensorflow
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'exécuter pymc
J'ai essayé le spoofing ARP
J'ai essayé d'utiliser aiomysql