Menu Fermer

Machine Learning niveau 0 : la régression linéaire

“Le chemin le plus court entre deux points est une ligne droite”.
Archimède

Le Machine Learning qui nous intéresse, celui appliqué à l’étude et à la prédiction des cours boursiers, concerne l’étude et le développement de méthodes et d’algorithmes qui vont nous permettre de “prédire” un cours à venir à partir des cours du passé.

Et lorsqu’on aborde le Machine Learning, l’introduction, le premier élément qu’on étudie, c’est : la régression linéaire, et en particulier l’ajustement affine. C’est de celui-ci dont nous traiterons dans cet article.

Pourquoi ? Déjà, parce que c’est une forme de prédiction et de Machine Learning. On va utiliser des données du passé, donner ça à la machine pour analyse, et en sortir des prédictions. Et surtout c’est la plus simple. Les mathématiques nécessaires pour la comprendre ne dépassent pas le niveau lycée (collège pour les équations de droites, et lycée pour le début des statistiques, probabilités)

Prérequis

  • Niveau mathématiques lycée comme décrit en introduction
  • un environnement de développement R, avec le package Quantmod en plus (je ne discuterais pas ici de l’installation / configuration de R, ce sera peut être l’objet d’un autre article)
  • des données boursières. J’ai pris toutes les cotations historiques de l’indice SP500 disponible sur Yahoo Finance. Vous pouvez trouver le fichier ici : GSPC.

But

Le but de l’ajustement affine est de déterminer si un nuage de points (ici notre courbe de cours boursiers) suit “à peu près” la forme d’une droite. Si c’est le cas, ça nous permet d’avoir un modèle qui permet de prévoir les cours de manière très facile car on sait que l’équation d’une droite est :

y = a *  x + b, avec x = abscisse, y = ordonnée, a = pente de la droite, b = ordonnée à l’origine

Chargement des données

Tout d’abord, mettez le CSV dans votre dosser d’exécution R. Puis :


getSymbols("GSPC", from="1950-01-01", src = "csv")
closes = Cl(GSPC)
startIndex = 10000
windowSize = 100
start = as.character(getElement(index(closes), startIndex))
end = as.character(getElement(index(closes), startIndex + windowSize -1))
subset = closes[paste(start,end,sep="/")]
chartSeries(subset, TA = NULL, theme = "white", up.col = "green", dn.col = "red")

Ce code permet d’extraire une fenêtre de cours de clôture de taille “windowSize”, à partir de la date d’index “startIndex”, et affiche le graphe. En jouant un peu avec ces paramètres vous pouvez avoir différentes fenêtres. Par exemple :

 

 

 

 

 

 

On voit assez distinctement d’un coup d’oeil qu’une seule des deux courbes se rapproche d’une droite. Rentrons maintenant dans le vif du sujet.

Procédé

Trouver la droite d’ajustement affine d’un nuage de point correspond en fait à trouver l’équation de la droite qui minimise le carré des erreurs. L’erreur, c’est la différence entre la valeur de la droite et la valeur de notre nuage pour une abscisse donnée.

Sur le premier graphique, si on teste une droite d’équation y = 340, l’erreur du premier est environ 15 (355 – 340), et l’erreur du dernier point d’environ -1.

Hé bien il se trouve que cette droite a 2 propriétés particulières qui permettent de la définir :

  • Sa pente est égale au rapport : Covariance (x, y) / Variance(x)
  • Elle passe par le point ayant pour coordonnées ( Moyenne(x), Moyenne(y) )

On a un moyen de calculer la pente + un point par lequel passe la droite, elle est donc totalement définie.

Je ne ferais pas la démonstration ici, qui n’est pas compliqué du tout mais qui prendrait pas mal de place, mais je peux vous renvoyer à une série de Khan Academy, qui l’explique de manière très simple, bien détaillée, et facilement compréhensible : Démonstration de la droite d’ajustement affine

Application

Etant donné que c’est une méthode très basique, elle est déjà intégrée dans R.


indices = 1:nrow(subset)
model=lm(subset~indices)
abline(model)
summary(model)

Voici les résultats pour les 2 fenêtres choisies précédemment

On peut remarquer que quelque soit la courbe, cette droite existe. Cependant, elle est plus ou moins pertinente selon les cas. Dans la première fenêtre, la droite est clairement descendante alors que le cours est en cours de remontée, et a fait un gros pic au milieu. Alors que dans la seconde fenêtre la courbe suit la droite plutôt correctement. Il va donc falloir un moyen de pouvoir discriminer ces deux cas.

Validation

C’est la partie “summary(model)” du code ci-dessus qui va nous donner les informations nécessaires pour juger de la pertinence de notre droite d’ajustement.

Pour la première fenêtre :

Residuals:
Min 1Q Median 3Q Max
-13.587 -5.499 -1.732 5.050 20.411
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 346.87456 1.53648 225.759 < 2e-16 ***
indices -0.13563 0.02641 -5.135 1.44e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 7.625 on 98 degrees of freedom
Multiple R-squared: 0.212, Adjusted R-squared: 0.204
F-statistic: 26.37 on 1 and 98 DF, p-value: 1.436e-06

Pour la seconde fenêtre :


Residuals:
Min 1Q Median 3Q Max
-40.387 -14.009 1.599 10.191 49.277
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.426e+03 4.224e+00 574.23 <2e-16 ***
indices 2.116e+00 7.262e-02 29.13 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 20.96 on 98 degrees of freedom
Multiple R-squared: 0.8965, Adjusted R-squared: 0.8954
F-statistic: 848.8 on 1 and 98 DF, p-value: < 2.2e-16

Première chose : Residuals. Ce sont les erreurs, avec quelques informations statistiques : minimum, maximum, 1er quartile, 3e quartile, médiane. Attention !! Ce sont des valeurs absolues. On pourra croire que les erreurs sont plus fortes dans la seconde fenêtre, mais le cours est autour 330 dans la première fenêtre et 2400 dans la seconde. Si on normalise en divisant par la première valeur de chaque fenêtre, on voit que les erreurs sont beaucoup plus faibles et beaucoup moins écartées pour la seconde fenêtre que pour la première.

Coefficient de détermination

Je vais passer sur certains éléments pour ce premier article. L’autre élément à regarder est : “Multiple R-Squared”. C’est le coefficient de détermination,, qui permet de donner une indication nette de l’approximation de la courbe par la droite trouvée. La formule est toute simple : R² = 1 – SOMME(carré des erreurs) / SOMME (carré des valeurs)

Moins il y aura d’erreur, plus R² sera proche de 1, donc au mieux notre droite approxime notre courbe. On voit assez clairement que le rapport entre les valeurs et les carrés des erreurs sera d’autant plus faible qu’il y aura moins d’erreur, mais si vous voulez approfondir le sujet, je peux vous renvoyer vers les vidéos de Khan Academy, qui sont dans la même section que pour la droite d’ajustement : vidéo

Clairement, 0.212 est une valeur très faible pour la première fenêtre et on peut en conclure que la droite n’est pas du tout pertinente et ne peut pas être utilisé pour faire des prédictions. Alors que pour la seconde fenêtre, 0.8965 est un très fort coefficient (~90%). On peut afficher “model” dans R pour connaître l’équation de notre droite :


Coefficients:
(Intercept) indices
2425.737 2.116

On peut donc faire notre prédiction pour le 14 Décembre 2017 : Y = 101 (taille de la fenêtre + 1) * 2.116 + 2425.737 = 2639.453

A vous de voir maintenant si vous auriez acheté pour profiter de la pente montante, ou vendu pour miser sur le retour vers la droite.

2 Comments

  1. Ping :Machine Learning, le premier backtest : régression linéaire o/ – AutoQuant

  2. Ping :Stratégie gagnante : le Come-Back to the fioutour ! - AutoQuant

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *