Prévision du cours des actions et prévision du cours des actions à l'aide de LSTM empilés

Contenu

Cet article a été publié dans le cadre du Blogathon sur la science des données.

introduction

est utilisé pour prédire les valeurs futures sur la base des valeurs précédemment observées et l'un des meilleurs outils pour l'analyse des tendances et la prévision future.

Qu'est-ce que les données de séries chronologiques?

Il est enregistré à intervalles de temps réguliers et l'ordre de ces points de données est important. Pourtant, tout modèle prédictif basé sur des données de séries temporelles aura le temps comme variable Indépendant. La sortie d'un modèle serait la valeur ou le rang prédit à un moment donné.

Analyse de séries chronologiques vs prévisions de séries chronologiques

Parlons d'une confusion possible sur l'analyse et la prévision des séries chronologiques. La prévision de séries chronologiques est un exemple de modélisation prédictive, tandis que l'analyse des séries chronologiques est une forme de modélisation descriptive.

Pour un nouvel investisseur, la recherche générale associée à la bourse ou à la bourse ne suffit pas pour prendre la décision. La tendance commune vers le marché boursier au sein de la société est très risquée pour l'investissement, donc la plupart des gens ne peuvent pas prendre de décisions basées sur des tendances communes. La variation saisonnière et le flux constant de tout indice aideront les investisseurs nouveaux et existants à comprendre et à prendre la décision d'investir sur le marché boursier.

Pour résoudre ce genre de problèmes, la prévision de séries temporelles est la meilleure technique.

Bourse

Les marchés boursiers sont les lieux où les investisseurs individuels et institutionnels se réunissent pour acheter et vendre des actions dans un lieu public.. Aujourd'hui, ces bourses existent en tant que places de marché électroniques.

Cette offre et cette demande aident à déterminer le prix de chaque titre ou les niveaux auxquels les participants au marché boursier (investisseurs et commerçants) sont prêts à acheter ou à vendre.

Le concept derrière le fonctionnement de la bourse est assez simple.. Fonctionnant un peu comme une maison de vente aux enchères, la bourse permet aux acheteurs et aux vendeurs de négocier les prix et d'effectuer des transactions.

Définition de ‘action’

Une action ou une action (aussi connu sous le nom « Capitale » d'une entreprise) est un instrument financier qui représente la propriété d'une entreprise

Apprentissage automatique en bourse

La bourse est très imprévisible, tout changement géopolitique peut affecter la tendance des actions en bourse, nous avons récemment vu comment le covid-19 a eu un impact sur les cours des actions, donc dans les données financières, il est très difficile de faire une analyse de tendance fiable. . La façon la plus efficace de résoudre ce type de problèmes est avec l'aide de l'apprentissage automatique et le l'apprentissage en profondeur.

Dans ce tutoriel, nous allons résoudre ce problème avec le modèle ARIMA.

Pour connaître la saisonnalité, regarde mon blog précédent. Et pour avoir une compréhension de base d'ARIMA, je te conseille de lire ce blog, cela vous aidera à mieux comprendre comment fonctionne l'analyse des séries chronologiques.

Mettre en œuvre la prévision du cours de l'action

j'utiliserai nsepy bibliothèque pour extraire les données historiques du SBIN.

Importations

importer le système d'exploitation
avertissements d'importation
warnings.filterwarnings('ignore')
à partir de pylab importer rcParams
rcParams['figure.figsize'] = 10, 6
de statsmodels.tsa.stattools import adfuller
de statsmodels.tsa.seasonal import season_decompose
de statsmodels.tsa.arima_model importer ARIMA
depuis pmdarima.arima importer auto_arima
à partir de sklearn.metrics importer Mean_squared_error, moyenne_erreur_absolue
importer des mathématiques
importer numpy en tant que np
depuis nsepy importer get_history
à partir de datetime date d'importation
importer matplotlib.pyplot en tant que plt
importer seaborn comme sns
importer des pandas au format pd
Exécutez le code ci-dessous pour extraire les données historiques:
sbin = get_history(symbole ="SBIN",
                   début=date(2000,1,1),
                   fin=date(2020,11,1))
sbin.head()
66911pic-1-5764006
Les données montrent le cours de l'action SBIN de 2020-1-1 à 2020-11-1. L'objectif est de créer un modèle qui prévoira
le cours de clôture de l'action.

Créons une visualisation qui montrera le cours de clôture quotidien de l'action.

plt.figure(taille de la figue=(10,6))
plt.grid(Vrai)
plt.xlabel('Dates')
plt.ylabel('Prix de clôture')
plt.plot(sbin['Clôture'])
plt.titre('Prix de clôture de SBIN')
plt.show()
29909pic2-5264251
plt.figure(taille de la figue=(10,6))
df_close = sbin['Clôture']
df_close.plot(style="k.")
plt.titre('Nuage de points du prix de clôture)
plt.show()
29006scattter20plot-5883203
plt.figure(taille de la figue=(10,6))
df_close = sbin['Clôture']
df_close.plot(style="k.",kind='hist')
plt.titre('Histogramme du prix de clôture')
plt.show()
39933hist-gramme-5004076

Premier, nous devons vérifier si une série est stationnaire ou non car l'analyse des séries chronologiques ne fonctionne qu'avec des données stationnaires.

Test de stationnarité:

Pour identifier la nature des données, nous utiliserons le hypothèse nulle.

H0: L'hypothèse nulle: Il s'agit d'une déclaration sur la population qui est considérée comme vraie ou utilisée pour argumenter, à moins qu'il ne puisse être démontré qu'elle est incorrecte au-delà de tout doute raisonnable..

H1: L'hypothèse alternative: C'est une déclaration sur la population qui contredit H0 et ce que nous concluons lorsque nous rejetons H0.

#Ho: il n'est pas immobile

# H1: est arrêté

Si on ne rejette pas l'hypothèse nulle, on peut dire que la série est non stationnaire. Cela signifie que la série peut être linéaire.

Si l'écart type et la moyenne sont tous deux des lignes plates (moyenne constante et variance constante), la série devient stationnaire.

de statsmodels.tsa.stattools import adfuller
def test_stationnarité(des séries chronologiques):
    #Détermination des statistiques glissantes
    rolmean = timeseries.rolling(12).moyenne()
    rolstd = timeseries.rolling(12).std()
    #Tracer des statistiques glissantes:
    plt.plot(des séries chronologiques, couleur="jaune",étiquette="Original")
    plt.plot(rolmoyen, couleur="rouge", étiquette="Moyenne glissante")
    plt.plot(rolstd, couleur="le noir", étiquette="Roulement standard")
    plt.légende(loc ="meilleur")
    plt.titre('Moyenne mobile et écart-type')
    plt.show(bloc=Faux)
    imprimer("Résultats du test de Dickey Fuller")
    adft = adfuller(des séries chronologiques,autolag='AIC')
    # la sortie pour dft nous donnera sans définir quelles sont les valeurs.
    #par conséquent, nous écrivons manuellement quelles valeurs cela explique-t-il en utilisant une boucle for
    sortie = pd.Série(adft[0:4],indice=['Statistiques du test','p-value','Non. des retards utilisés','Nombre d'observations utilisées'])
    pour clé,valeurs dans adft[4].éléments():
        sortir['valeur critique (%s)'%key] = valeurs
    imprimer(sortir)

test_stationnarité(sbin['Clôture'])
69039pic5-6509270
Après avoir analysé le graphique ci-dessus, nous pouvons voir la moyenne et l'écart type croissants et donc notre série n'est pas stationnaire.
Résultats du test de Dickey Fuller
Statistiques de test                  -1.914523
valeur p                           0.325260
Non. des décalages utilisés                  3.000000
Nombre d'observations utilisées    5183.000000
valeur critique (1%)              -3.431612
valeur critique (5%)              -2.862098
valeur critique (10%)             -2.567067
dtype: float64

On voit que la p-value est supérieure à 0.05 nous ne pouvons donc pas rejeter le Hypothèse nulle. En outre, les statistiques de test sont supérieures aux valeurs critiques. donc les données ne sont pas stationnaires.

Pour l'analyse des séries chronologiques, Nous séparons la tendance et la saisonnalité des séries chronologiques.

result = saisonnier_decompose(df_close, modèle="multiplicatif", fréq = 30)
fig = plt.figure()  
fig = result.plot()  
fig.set_size_inches(16, 9)
18405pic6-6395540
à partir de pylab importer rcParams
rcParams['figure.figsize'] = 10, 6
df_log = np.log(sbin['Clôture'])
Moving_avg = df_log.rolling(12).moyenne()
std_dev = df_log.rolling(12).std()
plt.légende(loc ="meilleur")
plt.titre('Moyenne mobile')
plt.plot(std_dev, couleur ="le noir", étiquette = "Écart-type")
plt.plot(move_avg, couleur="rouge", étiquette = "Moyenne")
plt.légende()
plt.show()
36363pic7-6657619

Nous allons maintenant créer un modèle ARIMA et l'entraîner avec le cours de clôture de l'action dans les données du train. Alors divisons les données en entraînement et jeu de test et visualisons-les.

train_données, test_data = df_log[3:entier(longueur(df_log)*0.9)], df_log[entier(longueur(df_log)*0.9):]
plt.figure(taille de la figue=(10,6))
plt.grid(Vrai)
plt.xlabel('Dates')
plt.ylabel('Prix de clôture')
plt.plot(df_log, 'vert', étiquette="Données de train")
plt.plot(données de test, 'bleu', étiquette="Données de test")
plt.légende()
88876pic8-9455734
model_autoARIMA = auto_arima(train_données, start_p=0, start_q=0,
essai ="adf",       # utiliser adftest pour trouver 'd' optimal
max_p=3, max_q=3, # maximum p et q
m=1,              # fréquence des séries
d=Aucun,           # let model determine 'd'
saisonnier=Faux,   # Pas de saisonnalité
start_P=0, 
D=0, 
trace=Vrai,
error_action='ignore',  
suppress_warnings=Vrai, 
pas à pas=Vrai)
imprimer(model_autoARIMA.summary())
Effectuer une recherche pas à pas pour minimiser l'aic
 ARIMA(0,1,0)(0,0,0)[0] intercepter   : AIC=-16607.561, Temps = 2,19 s
 ARIMA(1,1,0)(0,0,0)[0] intercepter   : AIC=-16607.961, Temps = 0,95 s
 ARIMA(0,1,1)(0,0,0)[0] intercepter   : AIC=-16608.035, Temps = 2,27 s
 ARIMA(0,1,0)(0,0,0)[0]             : AIC=-16609.560, Temps=0.39 s
 ARIMA(1,1,1)(0,0,0)[0] intercepter   : AIC=-16606.477, Temps = 2,77 s

Meilleur modèle:  ARIMA(0,1,0)(0,0,0)[0]          
Temps d'ajustement total: 9.079 secondes
                               Résultats SARIMAX
================================================== ============================
Dép. Variable:                      et non. Observations:                 4665
Modèle:               SARIMAX(0, 1, 0)   Log probabilité                8305.780
Date:                Mar, 24 nov 2020   AIC                         -16609.560
Temps:                        20:08:50   BIC                         -16603.113
Échantillon:                             0   HQIC                        -16607.293
                               - 4665                                         
Type de covariance:                  opg
================================================== ============================
                 coef std err z P>|Avec|      [0.025      0.975]
------------------------------------------------------------------------------
sigma2         0.0017   1.06e-06   1566.660      0.000       0.002       0.002
=================================================== ==============================
Ljung-Box (Q):                       24.41   Jarque-Béra (JB):         859838819.58
Problème(Q):                              0.98   Problème(JB):                         0.00
Hétéroscédasticité (H):               7.16   Fausser:                           -37.54
Problème(H) (recto-verso):                  0.00   Aplatissement:                      2105.12
================================================== ==================================
model_autoARIMA.plot_diagnostics(taille de la figue=(15,8))
plt.show()
20054pic9-6726978
modèle = ARIMA(train_données, commande=(3, 1, 2))
ajusté = model.fit(affichage = -1)
imprimer(équipé.résumé())
                             Résultats du modèle ARIMA
================================================== ============================
Dép. Variable:                D.Fermer Non. Observations:                 4664
Modèle:                 ARIMA(3, 1, 2)   Log probabilité                8309.178
Méthode:                       css-ml S.D.. des nouveautés              0.041
Date:                Mar, 24 nov 2020   AIC                         -16604.355
Temps:                        20:09:37   BIC                         -16559.222
Échantillon:                             1   HQIC                        -16588.481
                                                                              
================================================== ===============================
                    coef std err z P>|Avec|      [0.025      0.975]
---------------------------------------------------------------------------------
const 8.761e-06      0.001      0.015      0.988      -0.001       0.001
ar.L1.D.Fermer     1.3689      0.251      5.460      0.000       0.877       1.860
ar.L2.D.Fermer    -0.7118      0.277     -2.567      0.010      -1.255      -0.168
ar.L3.D.Fermer     0.0094      0.021      0.445      0.657      -0.032       0.051
ma.L1.D.Fermer    -1.3468      0.250     -5.382      0.000      -1.837      -0.856
ma.L2.D.Fermer     0.6738      0.282      2.391      0.017       0.122       1.226
                                    Racines
================================================== ===========================
                  Fréquence du module imaginaire réel
-----------------------------------------------------------------------------
AR.1            0.9772           -0.6979j            1.2008           -0.0987
AR.2            0.9772           +0.6979j            1.2008            0.0987
AR.3           74.0622           -0.0000j           74.0622           -0.0000
MA.1            0.9994           -0.6966j            1.2183           -0.0969
MA.2            0.9994           +0.6966j            1.2183            0.0969
-----------------------------------------------------------------------------
# Prévision

fc, je connais, conf = fit.forecast(519, alpha=0,05)  # 95% confiance
fc_series = pd.Series(fc, index=test_data.index)
série_inférieure = pd.Série(conf[:, 0], index=test_data.index)
upper_series = pd.Series(conf[:, 1], index=test_data.index)
plt.figure(taille de la figue=(12,5), ppp=100)
plt.plot(train_données, étiquette="entraînement")
plt.plot(données de test, couleur="bleu", étiquette="Cours réel de l'action")
plt.plot(fc_series, couleur="Orange",étiquette="Cours de l'action prévu")
plt.fill_entre(série_inférieure.index, série_inférieure, série_supérieure, 
                 couleur="k", alpha=.10)
plt.titre('SBIN Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Actual Stock Price')
plt.légende(loc ="en haut à gauche", taille de police=8)
plt.show()
39008pic2012-7065525

conclusion

La prévision des séries chronologiques est vraiment utile lorsque nous devons prendre des décisions futures ou que nous devons faire des analyses, nous pouvons le faire rapidement en utilisant ARIMA, il existe de nombreux autres modèles à partir desquels nous pouvons faire des prévisions de séries chronologiques, mais ARIMA est vraiment facile à comprendre.

J'espère que cet article vous aidera et vous fera gagner du temps. Laissez-moi savoir si vous avez des suggestions..

CODAGE HEUREUX.

Prabhat Pathak (Profil LinkedIn) est un analyste senior et un passionné d'innovation.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.

Haut-parleur de données