Prévision boursière à l'aide de l'apprentissage automatique [Mise en œuvre étape par étape]
Publié: 2021-02-26Table des matières
introduction
La prévision et l'analyse du marché boursier font partie des tâches les plus compliquées à accomplir. Il y a plusieurs raisons à cela, telles que la volatilité du marché et tant d'autres facteurs dépendants et indépendants pour décider de la valeur d'une action particulière sur le marché. Ces facteurs rendent très difficile pour tout analyste boursier de prédire la hausse et la baisse avec des degrés de précision élevés.
Cependant, avec l'avènement de l'apprentissage automatique et de ses algorithmes robustes, les derniers développements en matière d'analyse de marché et de prédiction boursière ont commencé à intégrer ces techniques dans la compréhension des données boursières.
En bref, les algorithmes d'apprentissage automatique sont largement utilisés par de nombreuses organisations pour analyser et prédire les valeurs des actions. Cet article passera par une mise en œuvre simple de l'analyse et de la prédiction des valeurs des stocks d'un magasin de détail en ligne mondial populaire à l'aide de plusieurs algorithmes d'apprentissage automatique en Python.
Énoncé du problème
Avant d'aborder la mise en place du programme pour prédire les valeurs boursières, visualisons les données sur lesquelles nous allons travailler. Ici, nous analyserons la valeur des actions de Microsoft Corporation (MSFT) de la National Association of Securities Dealers Automated Quotations (NASDAQ). Les données sur la valeur des actions seront présentées sous la forme d'un fichier séparé par des virgules (.csv), qui peut être ouvert et visualisé à l'aide d'Excel ou d'un tableur.
MSFT a ses actions enregistrées au NASDAQ et ses valeurs sont mises à jour chaque jour ouvrable du marché boursier. Notez que le marché n'autorise pas les échanges les samedis et dimanches ; il y a donc un décalage entre les deux dates. Pour chaque date, la valeur d'ouverture du stock, les valeurs les plus élevées et les plus basses de ce stock les mêmes jours sont notées, ainsi que la valeur de clôture à la fin de la journée.
La valeur de clôture ajustée indique la valeur de l'action après la publication des dividendes (trop technique !). De plus, le volume total des actions sur le marché est également indiqué. Avec ces données, il appartient au travail d'un apprentissage automatique/scientifique des données d'étudier les données et de mettre en œuvre plusieurs algorithmes capables d'extraire des modèles de l'historique des actions de Microsoft Corporation. Les données.
Longue mémoire à court terme
Pour développer un modèle d'apprentissage automatique pour prédire le cours des actions de Microsoft Corporation, nous utiliserons la technique de la mémoire à court terme longue (LSTM). Ils sont utilisés pour apporter de petites modifications à l'information par des multiplications et des additions. Par définition, la mémoire à long terme (LSTM) est une architecture de réseau de neurones récurrents artificiels (RNN) utilisée dans l'apprentissage en profondeur.
Contrairement aux réseaux de neurones à rétroaction standard, LSTM a des connexions de rétroaction. Il peut traiter des points de données uniques (tels que des images) et des séquences de données entières (telles que la parole ou la vidéo). Pour comprendre le concept derrière LSTM, prenons un exemple simple d'un avis client en ligne sur un téléphone mobile.
Supposons que nous voulions acheter le téléphone portable, nous nous référons généralement aux avis nets d'utilisateurs certifiés. En fonction de leur réflexion et de leurs contributions, nous décidons si le mobile est bon ou mauvais, puis nous l'achetons. Au fur et à mesure que nous lisons les critiques, nous recherchons des mots-clés tels que "incroyable", "bon appareil photo", "meilleure batterie de secours" et de nombreux autres termes liés à un téléphone mobile.
On a tendance à ignorer les mots usuels en anglais comme « it », « gave », « this », etc. Ainsi, lorsque l'on décide d'acheter ou non le téléphone mobile, on ne retient que ces mots-clés définis ci-dessus. Très probablement, nous oublions les autres mots.
C'est de la même manière que fonctionne l'algorithme de mémoire à court terme. Il ne se souvient que des informations pertinentes et les utilise pour faire des prédictions en ignorant les données non pertinentes. De cette façon, nous devons construire un modèle LSTM qui ne reconnaît essentiellement que les données essentielles sur ce stock et omet ses valeurs aberrantes.
La source
Bien que la structure ci-dessus d'une architecture LSTM puisse sembler intrigante au premier abord, il suffit de se rappeler que LSTM est une version avancée des réseaux de neurones récurrents qui conservent la mémoire pour traiter des séquences de données. Il peut supprimer ou ajouter des informations à l'état de la cellule, soigneusement régulées par des structures appelées portes.
L'unité LSTM comprend une cellule, une porte d'entrée, une porte de sortie et une porte d'oubli. La cellule se souvient des valeurs sur des intervalles de temps arbitraires, et les trois portes régulent le flux d'informations entrant et sortant de la cellule.
Mise en œuvre du programme
Nous allons passer à la partie où nous utilisons le LSTM pour prédire la valeur du stock à l'aide de Machine Learning en Python.
Étape 1 - Importation des bibliothèques
Comme nous le savons tous, la première étape consiste à importer les bibliothèques nécessaires pour prétraiter les données boursières de Microsoft Corporation et les autres bibliothèques requises pour créer et visualiser les sorties du modèle LSTM. Pour cela, nous utiliserons la librairie Keras sous le framework TensorFlow. Les modules requis sont importés de la bibliothèque Keras individuellement.
#Importer les bibliothèques
importer des pandas en tant que PD
importer NumPy en tant que np
%matplotlib en ligne
importer matplotlib. pyplot comme plt
importer matplotlib
de sklearn. Prétraitement de l'importation MinMaxScaler
de Kéras. calques importés LSTM, Dense, Dropout
depuis sklearn.model_selection importer TimeSeriesSplit
de sklearn.metrics importer mean_squared_error, r2_score
importer matplotlib. dates comme mandats
de sklearn. Prétraitement de l'importation MinMaxScaler
de sklearn importer linear_model
de Kéras. Importation de modèles Séquentielle
de Kéras. Importation de calques dense
importer Keras. Backend comme K
de Kéras. Les rappels importent EarlyStopping
de Kéras. Les optimiseurs importent Adam
de Kéras. Importation de modèles load_model
de Kéras. Importation de calques LSTM
de Kéras. utils.vis_utils importer plot_model
Étape 2 - Obtenir la visualisation des données
À l'aide de la bibliothèque de lecteurs de données Pandas, nous allons télécharger les données de stock du système local sous forme de fichier Comma Separated Value (.csv) et les stocker dans un pandas DataFrame. Enfin, nous verrons également les données.
#Obtenir le jeu de données
df = pd.read_csv(“MicrosoftStockData.csv”,na_values=['null'],index_col='Date',parse_dates=True,infer_datetime_format=True)
df.head()
Obtenez une certification AI en ligne auprès des meilleures universités du monde - Masters, Executive Post Graduate Programs et Advanced Certificate Program in ML & AI pour accélérer votre carrière.
Étape 3 - Imprimez la forme DataFrame et vérifiez les valeurs nulles.
Dans cette autre étape cruciale, nous imprimons d'abord la forme de l'ensemble de données. Pour nous assurer qu'il n'y a pas de valeurs nulles dans le bloc de données, nous les vérifions. La présence de valeurs nulles dans l'ensemble de données a tendance à causer des problèmes lors de la formation car elles agissent comme des valeurs aberrantes entraînant une grande variance dans le processus de formation.
#Imprimer la forme de la trame de données et vérifier les valeurs nulles
print("Forme de la trame de données : ", df. forme)
print("Valeur nulle présente : ", df.IsNull().values.any())
>> Forme de la trame de données : (7334, 6)
>>Valeur nulle présente : Faux
Date | Ouvrir | Haut | Meugler | Fermer | Fermer ajusté | Le volume |
1990-01-02 | 0,605903 | 0,616319 | 0,598090 | 0,616319 | 0,447268 | 53033600 |
1990-01-03 | 0,621528 | 0,626736 | 0,614583 | 0,619792 | 0,449788 | 113772800 |
1990-01-04 | 0,619792 | 0,638889 | 0,616319 | 0,638021 | 0,463017 | 125740800 |
1990-01-05 | 0,635417 | 0,638889 | 0,621528 | 0,622396 | 0,451678 | 69564800 |
1990-01-08 | 0,621528 | 0,631944 | 0,614583 | 0,631944 | 0,458607 | 58982400 |
Étape 4 - Tracé de la valeur de clôture ajustée réelle
La valeur de sortie finale qui doit être prédite à l'aide du modèle d'apprentissage automatique est la valeur de clôture ajustée. Cette valeur représente la valeur de clôture de l'action ce jour particulier de négociation en bourse.
#Tracer la valeur de fermeture True Adj
df['Ajustement Fermé'].plot()
Étape 5 - Définition de la variable cible et sélection des fonctionnalités
Dans l'étape suivante, nous attribuons la colonne de sortie à la variable cible. Dans ce cas, il s'agit de la valeur relative ajustée du Microsoft Stock. De plus, nous sélectionnons également les caractéristiques qui agissent comme la variable indépendante de la variable cible (variable dépendante). Pour tenir compte de l'objectif de la formation, nous choisissons quatre caractéristiques, qui sont :
- Ouvrir
- Haut
- Meugler
- Le volume
#Définir la variable cible
output_var = PD.DataFrame(df['Adj Close'])
#Sélection des fonctionnalités
fonctionnalités = ['Ouvert', 'Haut', 'Bas', 'Volume']
Étape 6 - Mise à l'échelle
Pour réduire le coût de calcul des données dans le tableau, nous allons réduire les valeurs de stock à des valeurs comprises entre 0 et 1. De cette façon, toutes les données en grand nombre sont réduites, réduisant ainsi l'utilisation de la mémoire. De plus, nous pouvons obtenir plus de précision en réduisant l'échelle car les données ne sont pas réparties en valeurs énormes. Ceci est effectué par la classe MinMaxScaler de la bibliothèque sci-kit-learn.
#Mise à l'échelle
scaler = MinMaxScaler()
feature_transform = scaler.fit_transform(df[features])
feature_transform= pd.DataFrame(columns=features, data=feature_transform, index=df.index)
feature_transform.head()
Date | Ouvrir | Haut | Meugler | Le volume |
1990-01-02 | 0,000129 | 0,000105 | 0,000129 | 0,064837 |
1990-01-03 | 0,000265 | 0,000195 | 0,000273 | 0,144673 |
1990-01-04 | 0,000249 | 0,000300 | 0,000288 | 0,160404 |
1990-01-05 | 0,000386 | 0,000300 | 0,000334 | 0,086566 |
1990-01-08 | 0,000265 | 0,000240 | 0,000273 | 0,072656 |
Comme mentionné ci-dessus, nous voyons que les valeurs des variables de caractéristique sont réduites à des valeurs plus petites par rapport aux valeurs réelles données ci-dessus.
Étape 7 - Fractionnement en un ensemble d'apprentissage et un ensemble de test.
Avant d'introduire les données dans le modèle d'apprentissage, nous devons diviser l'ensemble de données en ensemble d'apprentissage et de test. Le modèle Machine Learning LSTM sera formé sur les données présentes dans l'ensemble d'apprentissage et testé sur l'ensemble de test pour la précision et la rétropropagation.
Pour cela, nous utiliserons la classe TimeSeriesSplit de la bibliothèque sci-kit-learn. Nous avons défini le nombre de fractionnements sur 10, ce qui signifie que 10 % des données seront utilisées comme ensemble de test et que 90 % des données seront utilisées pour la formation du modèle LSTM. L'avantage d'utiliser cette division de séries chronologiques est que les échantillons de données de séries chronologiques fractionnés sont observés à des intervalles de temps fixes.
#Splitting en ensemble d'entraînement et en ensemble de test
timesplit= TimeSeriesSplit(n_splits=10)
pour train_index, test_index dans timesplit.split(feature_transform):
X_train, X_test = feature_transform[:len(train_index)], feature_transform[len(train_index): (len(train_index)+len(test_index))]
y_train, y_test = output_var[:len(train_index)].values.ravel(), output_var[len(train_index): (len(train_index)+len(test_index))].values.ravel()
Étape 8 - Traitement des données pour LSTM
Une fois que les ensembles de formation et de test sont prêts, nous pouvons alimenter les données dans le modèle LSTM une fois qu'il est construit. Avant cela, nous devons convertir les données de l'ensemble d'entraînement et de test en un type de données que le modèle LSTM acceptera. Nous convertissons d'abord les données de formation et les données de test en tableaux NumPy, puis les remodelons au format (nombre d'échantillons, 1, nombre de fonctionnalités) car le LSTM exige que les données soient alimentées sous forme 3D. Comme nous le savons, le nombre d'échantillons dans l'ensemble d'apprentissage est de 90 % de 7334, soit 6667, et le nombre de caractéristiques est de 4, l'ensemble d'apprentissage est remodelé en (6667, 1, 4). De même, l'ensemble de test est également remodelé.
#Traiter les données pour LSTM
trainX =np.array(X_train)
testX =np.array(X_test)
X_train = trainX.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = testX.reshape(X_test.shape[0], 1, X_test.shape[1])
Étape 9 - Construire le modèle LSTM
Enfin, nous arrivons à l'étape où nous construisons le modèle LSTM. Ici, nous créons un modèle Keras séquentiel avec une couche LSTM. La couche LSTM a 32 unités et est suivie d'une couche dense de 1 neurone.
Nous utilisons Adam Optimizer et l'erreur quadratique moyenne comme fonction de perte pour compiler le modèle. Ces deux sont la combinaison la plus préférée pour un modèle LSTM. De plus, le modèle est également tracé et affiché ci-dessous.
#Construire le modèle LSTM
lstm = Séquentiel()
lstm.add(LSTM(32, input_shape=(1, trainX.shape[1]), activation='relu', return_sequences=False))
lstm.add(Dense(1))
lstm.compile(loss='mean_squared_error', optimiseur='adam')
plot_model(lstm, show_shapes=True, show_layer_names=True)
Étape 10 - Formation du modèle
Enfin, nous formons le modèle LSTM conçu ci-dessus sur les données de formation pour 100 époques avec une taille de lot de 8 en utilisant la fonction d'ajustement.
#Formation Modèle
history = lstm.fit(X_train, y_train, epochs=100, batch_size=8, verbose=1, shuffle=False)
Epoque 1/100
834/834 [==============================] – 3s 2ms/pas – perte : 67.1211
Époque 2/100
834/834 [==============================] – 1s 2ms/pas – perte : 70.4911
Epoque 3/100
834/834 [==============================] – 1s 2ms/pas – perte : 48.8155
Epoque 4/100
834/834 [==============================] – 1s 2ms/pas – perte : 21.5447
Epoque 5/100
834/834 [==============================] – 1s 2ms/pas – perte : 6.1709
Époque 6/100
834/834 [==============================] – 1s 2ms/pas – perte : 1.8726
Epoque 7/100
834/834 [=============================] – 1s 2ms/pas – perte : 0.9380
Epoque 8/100
834/834 [==============================] – 2s 2ms/pas – perte : 0.6566
Epoque 9/100
834/834 [==============================] – 1s 2ms/pas – perte : 0.5369
Epoque 10/100
834/834 [==============================] – 2s 2ms/pas – perte : 0.4761
.
.
.
.
Epoque 95/100
834/834 [==============================] – 1s 2ms/pas – perte : 0.4542
Epoque 96/100
834/834 [==============================] – 2s 2ms/pas – perte : 0.4553
Epoque 97/100
834/834 [==============================] – 1s 2ms/pas – perte : 0.4565
Epoque 98/100
834/834 [==============================] – 1s 2ms/pas – perte : 0.4576
Epoque 99/100
834/834 [==============================] – 1s 2ms/pas – perte : 0.4588
Epoque 100/100
834/834 [==============================] – 1s 2ms/pas – perte : 0.4599
Enfin, nous voyons que la valeur de perte a diminué de façon exponentielle au fil du temps au cours du processus de formation de 100 époques et a atteint une valeur de 0,4599
Étape 11 - Prédiction LSTM
Avec notre modèle prêt, il est temps d'utiliser le modèle formé à l'aide du réseau LSTM sur l'ensemble de test et de prédire la valeur de clôture adjacente de l'action Microsoft. Ceci est réalisé en utilisant la simple fonction de prédiction sur le modèle lstm construit.
Prédiction #LSTM
y_pred= lstm.predict(X_test)
Étape 12 - Valeur de clôture ajustée réelle vs prévue - LSTM
Enfin, comme nous avons prédit les valeurs de l'ensemble de test, nous pouvons tracer le graphique pour comparer les valeurs réelles d'Adj Close et la valeur prédite d'Adj Close par le modèle LSTM Machine Learning.
#True vs Predicted Adj Close Value - LSTM
plt.plot(y_test, label='True Value')
plt.plot(y_pred, label='Valeur LSTM')
plt.title ("Prédiction par LSTM")
plt.xlabel('Échelle de temps')
plt.ylabel('USD mis à l'échelle')
plt.légende()
plt.show()
Le graphique ci-dessus montre qu'un modèle est détecté par le modèle de réseau LSTM unique très basique construit ci-dessus. En affinant plusieurs paramètres et en ajoutant plus de couches LSTM au modèle, nous pouvons obtenir une représentation plus précise de la valeur des actions d'une entreprise donnée.
Conclusion
Si vous souhaitez en savoir plus sur les exemples d'intelligence artificielle, l'apprentissage automatique, consultez le programme Executive PG d'IIIT-B & upGrad en apprentissage automatique et IA , conçu pour les professionnels en activité et offrant plus de 450 heures de formation rigoureuse, plus de 30 études de cas. & affectations, statut IIIT-B Alumni, plus de 5 projets de synthèse pratiques et aide à l'emploi avec les meilleures entreprises.
Pouvez-vous prédire le marché boursier en utilisant l'apprentissage automatique ?
Aujourd'hui, nous disposons d'un certain nombre d'indicateurs pour aider à prévoir les tendances du marché. Cependant, nous n'avons pas besoin de chercher plus loin qu'un ordinateur puissant pour trouver les indicateurs les plus précis pour le marché boursier. Le marché boursier est un système ouvert et peut être considéré comme un réseau complexe. Le réseau est constitué des relations entre les actions, les entreprises, les investisseurs et les volumes d'échanges. En utilisant un algorithme d'exploration de données comme la machine à vecteurs de support, vous pouvez appliquer une formule mathématique pour extraire les relations entre ces variables. Le marché boursier est maintenant au-delà de la prédiction humaine.
Quel algorithme est le meilleur pour la prédiction du marché boursier ?
Pour de meilleurs résultats, vous devez utiliser la régression linéaire. La régression linéaire est une approche statistique utilisée pour déterminer la relation entre deux variables différentes. Dans cet exemple, les variables sont le prix et le temps. Dans la prévision boursière, le prix est la variable indépendante et le temps est la variable dépendante. Si une relation linéaire entre ces deux variables peut être déterminée, il est alors possible de prédire avec précision la valeur du stock à tout moment dans le futur.
La prévision boursière est-elle un problème de classification ou de régression ?
Avant de répondre, nous devons comprendre ce que signifient les prévisions boursières. Est-ce un problème de classification binaire ou un problème de régression ? Supposons que nous voulions prédire l'avenir d'un titre, où l'avenir signifie le jour, la semaine, le mois ou l'année suivant. Si la performance passée de l'action à un moment donné est l'entrée et l'avenir est la sortie, il s'agit alors d'un problème de régression. Si la performance passée d'une action et l'avenir d'une action sont indépendants, alors c'est un problème de classification.