Analyse exploratoire#

Imports et lecture des données#

Imports#

1import matplotlib.pyplot as plt
2import mplfinance as mpl
3import pandas as pd
4from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
5
6from src.data.load_data import load_stock_data
7from src.utils.misc import init_notebook
1init_notebook()

Lecture des données#

1stock_name = "AAPL"
1df = load_stock_data(stock_name)
2print(f"{df.shape = }")
df.shape = (756, 6)
1df.columns
Index(['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')
1df.index
DatetimeIndex(['2019-01-02', '2019-01-03', '2019-01-04', '2019-01-07',
               '2019-01-08', '2019-01-09', '2019-01-10', '2019-01-11',
               '2019-01-14', '2019-01-15',
               ...
               '2021-12-16', '2021-12-17', '2021-12-20', '2021-12-21',
               '2021-12-22', '2021-12-23', '2021-12-27', '2021-12-28',
               '2021-12-29', '2021-12-30'],
              dtype='datetime64[ns]', name='Date', length=756, freq=None)

Présentation#

Plan de la présentation

1) Introduction

  • présentation du jeu de données

  • définition de la problématique

2) Décomposition : tendance

  • différents modèles (régressions, moyennes mobiles, B-splines)

  • retrait de la tendance

3) Décomposition : saisonnalité

  • affichage graphique (seasonal plot, periodogram)

  • retrait de la saisonnalité

4) Prédiction

  • différents modèles (ARMA / ARIMA, Prophet)

  • comparaison des prédictions

5) Conclusion

  • réponse à la problématique

Analyse exploratoire#

Jeu de données#

Cours de l’action Apple de janvier 2019 à janvier 2022 (3 ans)

  • 756 dates (weekends et jours fériés exclus) => données journalières

  • 6 valeurs par date : Open, High, Low, Close, Adj. Close et Volume

  • nous n’étudierons que le cours de fermeture Close

Affichage des données#

Candlestick chart (graphique en bougie)#

1df.index
DatetimeIndex(['2019-01-02', '2019-01-03', '2019-01-04', '2019-01-07',
               '2019-01-08', '2019-01-09', '2019-01-10', '2019-01-11',
               '2019-01-14', '2019-01-15',
               ...
               '2021-12-16', '2021-12-17', '2021-12-20', '2021-12-21',
               '2021-12-22', '2021-12-23', '2021-12-27', '2021-12-28',
               '2021-12-29', '2021-12-30'],
              dtype='datetime64[ns]', name='Date', length=756, freq=None)
1df_3_mois = df[df.index < pd.Timestamp("2019-03-01")]
1mpl.plot(
2    df_3_mois, type="candle", title=f"Cours de l'action {stock_name}", style="yahoo"
3)
../_images/8c919f905e115157f3266179b35e999f73895c4ff9b291f4ad86492484a4928f.png
1mpl.plot(
2    df_3_mois,
3    type="candle",
4    mav=(3, 6, 9),
5    title=f"Cours de l'action {stock_name}",
6    style="yahoo",
7)
../_images/bfdb08bd17bf6c00f73078b40c78cc7329430534e17e26f45a8280e09e4dd3d0.png

Line plot#

1df["Close"].plot(title=f"Cours de l'action {stock_name}", ylabel="Price")
<Axes: title={'center': "Cours de l'action AAPL"}, xlabel='Date', ylabel='Price'>
../_images/c749458ceac42288b2936ae8f5f17706914f8a32ce925d3df1d554dd5628a9ad.png
1df["Close"].plot(title=f"Cours de l'action {stock_name}", ylabel="Price", style=".")
<Axes: title={'center': "Cours de l'action AAPL"}, xlabel='Date', ylabel='Price'>
../_images/e5b507a7736c823b011e355b59533c63e62889ac87299518e96f8151550a4430.png

Auto-corrélation (ACF et PACF)#

Auto-corrélation (ACF)#

1lag = len(df_3_mois) - 1
2_ = plot_acf(df_3_mois["Close"], lags=lag)
../_images/626f35f2a963758a0f7e9aaa05fc8513d233384c88d6bac3dea8f68f1ae67f58.png

Auto-corrélation partielle (PACF)#

1lag = len(df_3_mois) // 2 - 1
2_ = plot_pacf(df_3_mois["Close"], lags=lag)
../_images/880d7cde1108557a13e5f5bcfbd68482b527d193f5c63a3ad601aa8b86ff96fe.png

Lag plot#

1lag = 1
2plt.title(f"Lag plot ({lag = })")
3pd.plotting.lag_plot(df["Close"], lag=lag)
<Axes: title={'center': 'Lag plot (lag = 1)'}, xlabel='y(t)', ylabel='y(t + 1)'>
../_images/0a6b893159a3899dd00853b55e273713eae5761b1178645131c0c8132340e437.png
1lag = 10
2plt.title(f"Lag plot ({lag = })")
3pd.plotting.lag_plot(df["Close"], lag=lag)
<Axes: title={'center': 'Lag plot (lag = 10)'}, xlabel='y(t)', ylabel='y(t + 10)'>
../_images/83314b8856d17a55bea68600329c1724cb1dac695debb497daf1ae8b47f60cb0.png

Problématique#

Nous cherchons à prédire le cours boursier d’Apple à horizon 2 mois.

Objectifs :

  • prédiction à 60 jours pour pouvoir spéculer

  • avoir un intervalle de confiance (pour ne pas prendre trop de risque)