Indicateur ProRealTime : droite de régression. Un bon baromètre pour vos investissements boursiers

Nicolas FORCET » Productivité et life-hacking » Indicateur ProRealTime : droite de régression. Un bon baromètre pour vos investissements boursiers
Graphique boursier sur un smartphone

J’écoutais ce matin un podcast sur Hiboo, un service de graphiques et conseils boursiers (payant). Et comme je n’aime pas payer pour des conseils en bourse mais plutôt apprendre par moi même en finances personnelles, je me suis fait mon propre outil gratuit.

J’ai tout simplement codé un indicateur pour le logiciel ProRealTime. Cet indicateur est simple et parlera aux matheux : c’est une droite de régression linéaire toute bête avec les déviations -2, -1, +1 et +2.

Le principe : une droite qui « résume » tout l’historique

L’idée de base vient d’une méthode statistique classique, la régression linéaire par les moindres carrés. Concrètement, l’indicateur prend l’ensemble des cours de clôture disponibles pour une action, depuis sa toute première cotation jusqu’à aujourd’hui, et cherche la droite qui minimise l’écart avec tous ces prix.

Autrement dit : plutôt que de suivre le cours bougie par bougie, cette droite représente la direction moyenne dans laquelle le titre évolue sur toute la période observée. Ça simplifie grandement la lecture et on voit la tendance générale de l’action !

Ça me dissuade aussi d’acheter une bouse qui ne fait que descendre 😊

Les bandes de régression pour mesurer la dispersion des prix

Une droite seule ne dit pas tout : encore faut-il savoir à quel point les prix s’en éloignent habituellement. C’est le rôle de l’écart-type, calculé à partir de la distance entre chaque clôture historique et la droite de régression.

  • L’indicateur affiche quatre bandes parallèles à la droite centrale, à +1, +2, -1 et -2 écarts-types :
  • Les bandes vertes (+1 et +2) délimitent la zone où les prix se situent statistiquement au-dessus de la tendance de fond.
  • Les bandes rouges (-1 et -2) délimitent la zone où les prix se situent statistiquement en dessous.

Appliqué aux cours de bourse, cela donne une lecture rapide : plus le prix s’écarte de la droite centrale, plus sa position est « extrême » par rapport à l’historique du titre.

Simple, sans chichi.

Je m’en sers notamment pour voir que les bancaires sont survalorisées (même si on le voit à vue d’œil) :

Ou qu’Essilor s’est fait dégommer, un peu trop à mon avis :

⚠️Ce n’est pas un signal d’achat ou de vente en soi, mais un repère de contexte. Toute l’analyse vous appartient ensuite.

J’adore cet indicateur sur des actions avec un historique de plus de 15 ans. La gérante de Hiboo a raison sur ce point, il est très pertinent sur des valeurs anciennes avec de bons fondamentaux.

Le grand Warren Buffet l’utilise d’ailleurs dans son « Buffet Indicator » qui fait un peu peur en ce moment tant la bourse est au dessus de sa tendance long terme :

Sans plus vous faire languir, voici le code en ProRealCode à copier dans ProRealTime :

// --- Couleurs par défaut (modifiables directement ici)
couleurRegR = 0
couleurRegG = 0
couleurRegB = 0

couleurP1R = 0
couleurP1G = 200
couleurP1B = 0

couleurP2R = 0
couleurP2G = 120
couleurP2B = 0

couleurM1R = 255
couleurM1G = 0
couleurM1B = 0

couleurM2R = 150
couleurM2G = 0
couleurM2B = 0

IF ISLASTBARUPDATE THEN

indexDebut = BarIndex

IF indexDebut > 0 THEN

sommeX = 0
sommeY = 0
sommeXY = 0
sommeXX = 0

FOR i = 0 TO indexDebut DO
y = close[i]
x = indexDebut - i
sommeX = sommeX + x
sommeY = sommeY + y
sommeXY = sommeXY + (x * y)
sommeXX = sommeXX + (x * x)
NEXT

n = indexDebut + 1

pente = (n * sommeXY - sommeX * sommeY) / (n * sommeXX - sommeX * sommeX)
ordonneOrigine = (sommeY - pente * sommeX) / n

prixDebutReg = ordonneOrigine
prixFinReg = ordonneOrigine + pente * indexDebut

sommeCarresErreurs = 0
FOR i = 0 TO indexDebut DO
x = indexDebut - i
valeurReg = ordonneOrigine + pente * x
erreur = close[i] - valeurReg
sommeCarresErreurs = sommeCarresErreurs + (erreur * erreur)
NEXT
ecartType = SQRT(sommeCarresErreurs / n)

DRAWLINE(barindex[indexDebut], prixDebutReg, barindex, prixFinReg) COLOURED(couleurRegR, couleurRegG, couleurRegB) STYLE(Line, 2)
DRAWLINE(barindex[indexDebut], prixDebutReg + ecartType, barindex, prixFinReg + ecartType) COLOURED(couleurP1R, couleurP1G, couleurP1B) STYLE(Dottedline, 1)
DRAWLINE(barindex[indexDebut], prixDebutReg + 2 * ecartType, barindex, prixFinReg + 2 * ecartType) COLOURED(couleurP2R, couleurP2G, couleurP2B) STYLE(Dottedline, 1)
DRAWLINE(barindex[indexDebut], prixDebutReg - ecartType, barindex, prixFinReg - ecartType) COLOURED(couleurM1R, couleurM1G, couleurM1B) STYLE(Dottedline, 1)
DRAWLINE(barindex[indexDebut], prixDebutReg - 2 * ecartType, barindex, prixFinReg - 2 * ecartType) COLOURED(couleurM2R, couleurM2G, couleurM2B) STYLE(Dottedline, 1)

ENDIF
ENDIF
RETURN

Si vous voulez travailler en échelle logarithmique, le code sera celui-ci :

// --- Couleurs par défaut (modifiables directement ici)
couleurRegR = 0
couleurRegG = 0
couleurRegB = 0
couleurP1R = 0
couleurP1G = 200
couleurP1B = 0
couleurP2R = 0
couleurP2G = 120
couleurP2B = 0
couleurM1R = 255
couleurM1G = 0
couleurM1B = 0
couleurM2R = 150
couleurM2G = 0
couleurM2B = 0

IF ISLASTBARUPDATE THEN

indexDebut = BarIndex

IF indexDebut > 0 THEN

sommeX = 0
sommeY = 0
sommeXY = 0
sommeXX = 0

FOR i = 0 TO indexDebut DO
y = LOG(close[i])
x = indexDebut - i
sommeX = sommeX + x
sommeY = sommeY + y
sommeXY = sommeXY + (x * y)
sommeXX = sommeXX + (x * x)
NEXT

n = indexDebut + 1

pente = (n * sommeXY - sommeX * sommeY) / (n * sommeXX - sommeX * sommeX)
ordonneOrigine = (sommeY - pente * sommeX) / n

prixDebutRegLog = ordonneOrigine
prixFinRegLog = ordonneOrigine + pente * indexDebut

sommeCarresErreurs = 0
FOR i = 0 TO indexDebut DO
x = indexDebut - i
valeurReg = ordonneOrigine + pente * x
erreur = LOG(close[i]) - valeurReg
sommeCarresErreurs = sommeCarresErreurs + (erreur * erreur)
NEXT
ecartType = SQRT(sommeCarresErreurs / n)

// --- Reconversion en prix réel pour affichage sur le graphique
prixDebutReg = EXP(prixDebutRegLog)
prixFinReg = EXP(prixFinRegLog)

prixDebutRegP1 = EXP(prixDebutRegLog + ecartType)
prixFinRegP1 = EXP(prixFinRegLog + ecartType)

prixDebutRegP2 = EXP(prixDebutRegLog + 2 * ecartType)
prixFinRegP2 = EXP(prixFinRegLog + 2 * ecartType)

prixDebutRegM1 = EXP(prixDebutRegLog - ecartType)
prixFinRegM1 = EXP(prixFinRegLog - ecartType)

prixDebutRegM2 = EXP(prixDebutRegLog - 2 * ecartType)
prixFinRegM2 = EXP(prixFinRegLog - 2 * ecartType)

DRAWLINE(barindex[indexDebut], prixDebutReg, barindex, prixFinReg) COLOURED(couleurRegR, couleurRegG, couleurRegB) STYLE(Line, 2)
DRAWLINE(barindex[indexDebut], prixDebutRegP1, barindex, prixFinRegP1) COLOURED(couleurP1R, couleurP1G, couleurP1B) STYLE(Dottedline, 1)
DRAWLINE(barindex[indexDebut], prixDebutRegP2, barindex, prixFinRegP2) COLOURED(couleurP2R, couleurP2G, couleurP2B) STYLE(Dottedline, 1)
DRAWLINE(barindex[indexDebut], prixDebutRegM1, barindex, prixFinRegM1) COLOURED(couleurM1R, couleurM1G, couleurM1B) STYLE(Dottedline, 1)
DRAWLINE(barindex[indexDebut], prixDebutRegM2, barindex, prixFinRegM2) COLOURED(couleurM2R, couleurM2G, couleurM2B) STYLE(Dottedline, 1)

ENDIF
ENDIF
RETURN

Et un Screener Prorealtime en bonus pour détecter des opportunités !

J’ai codé par la suite un screener ProRealtime qui cherche des pépites sous-côtées :

  • entre les écarts type -1 et -2,5
  • il bosse en logarythmique (mais aucune importance le résultat est similaire) et en hebdomadaire car ProScreener limite à 250 valeurs
// --- Paramètres ---
periodeReg = 100
periodeMA = 200
periodeHaut = 250
periodeVol = 20

// --- Canal de régression linéaire ---
reg = LinearRegression[periodeReg](close)
ecartType = std[periodeReg](close)
deviation = (close - reg) / ecartType

// --- Score de décote structurelle ---
ma200 = average[periodeMA](close)
plusHaut52 = highest[periodeHaut](high)
myrsi = RSI[14](close)

decoteVsMA200 = (ma200 - close) / ma200 * 100
decoteVsHaut52 = (plusHaut52 - close) / plusHaut52 * 100
scoreDecote = decoteVsMA200 + decoteVsHaut52 - (myrsi - 50)

// --- Filtre de liquidité ---
volMoyen = average[periodeVol](volume)
volValeur = volMoyen * close

// --- Filtre + tri en une seule instruction ---
SCREENER[deviation <= 0 AND deviation >= -2 AND scoreDecote > 15 AND close > 1 AND volValeur > 1000000](scoreDecote AS "Score Décote")

Attention, ça ne trie pas le bon grain de l’ivraie mais vous aidera peut être à dénicher des perles sous-côtées si vous scannez un indice entier.

Bonne chasse !

2 commentaires

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.

  1. Bonjour
    J’apprécie bien le travail de Hiboo moi aussi. Une remarque : ils travaillent systématiquement en graphes semi-log (= avec l’échelle des prix en logarithmes), ce qui permet de voir d’un seul coup d’oeil le taux de croissance moyen de l’entreprise (pente de la droite de régression).
    Ma question : j’aimerais créer des screeners (sur la pente de la régression, ou sur l’écart-type calculé en pourcentage) sur la base de cet indicateur, mais en travaillant sur les logarithmes des cours. Suffit-il-juste de remplacer la ligne « y = close » par « y = LN(close) » pour que ça fonctionne ?…
    Merci par avance.

    • Bonjour,
      Presque ça oui :
      – c’est y = LOG(close[i]) au lieu de y = close[i].
      – prixDebutReg et prixFinReg sont calculés en log, puis reconvertis via EXP() juste avant les DRAWLINE.
      – Les bandes d’écart-type (+1, -1, etc.) sont ajoutées/soustraites en log, puis chaque résultat est reconverti en prix réel individuellement. Si on fait l(inverse c’est faux mathématiquement !
      J’ai mis les 2 codes dans le billet mis à jour : le même indicateur (mais en echelle log) à afficher sur les prix + un screener qui n’est pas parfait, ProScreener limitant malheureusement à 250 bougies pour les calculs…
      Si tu trouves mieux, je suis preneur !