Avant de lire cette article, veuillez lire cet avertissement/clause de non responsabilité.
Le RSI ou Relative Strength Index est un indicateur de momentum de type oscillateur.
Il a été présenté en 1978 pour la premiere fois dans le livre “New Concepts in Technical Trading Systems” de John Welles Wilder Jr.
Au niveau graphique, il ne s’affiche pas par-dessus le graphique de chandeliers, mais dans une partie séparée. Genéralement on l’affiche en dessous, en parallèle des bougies.
Il est de type borné et ses valeurs sont comprises entre 0 et 100 ou entre 0 et 1.
Comme son nom l’indique, il nous montre la force des acheteurs et des vendeurs à un instant donné par rapport aux périodes précédentes et permet de détecter parfois des moments de sur-achat ou de sur-vente, notamment lors d’un passage d’une valeur de 100 à mois de 70 ou d’une valeur de 0 à plus de 30.
Il est généralement calculé sur une base de 9 ou de 14 ou de 21 périodes.
C’est bien évidemment à vous de trouver la valeur qui vous convient le mieux, mais plus la valeur choisie sera petite et plus il sera sensible, plus il y aura de bruit et donc de faux retournements.
Sa méthode de calcul est basée sur des comparaisons de valeurs de Close de la période choisie et il faudra effectuer plusieurs étapes pour obtenir la valeur finale :
Soit HighRS14 et LowRS14 deux variables initialement mises à zéro en début de calcul.
Pour chaque valeur de Close, on la comparera à la valeur de Close précédente.
Si Close à un instant T0 est supérieur à Close à l’instant T-1 on additionnera HighRS14 avec la valeur de la différence en Close T0 et Close T-1 sinon on additionnera à la place LowRS14 avec la même différence.
On divise par la suite les valeurs HighRS14 et LowRS14 par le nombre de périodes choisies (dans notre cas 14) pour obtenir les valeurs AvgHighRS14 et AvgLowRS14.
On divise AvgHighRS14 par AvgLowRS14 pour obtenir la valeur rS14.
On finit le calcul de rSI14 par la formule suivante :
rSI14 = ( 100 – (100 / ( 1 + rS14 ))) * 100
Exemple d’implémentation de code en Java :
public static BigDecimal getRSI14(List<BigDecimal> closes) {
if( closes.size() < 15) {
return null ;
}
BigDecimal rsi = new BigDecimal("50") ;
BigDecimal HighRS = BigDecimal.ZERO ;
BigDecimal LowRS = BigDecimal.ZERO ;
for(int i=0 ; i < 14 ; i++) {
if(closes.get(i).comparTo(closes.get(i+1)) >= 0) {
highRS = highRS.add(closes.get(i).substract(closes.get(i+1))) ;
} else {
lowRS = lowRS.add(closes.get(i+1).substract(closes.get(i))) ;
}
}
if(lowRS.compareTo(BigDecimal.ZERO) == 0) {
// chaque valeur de close est supérieure à la valeur précédente
rsi = new BigDecimal("100") ;
} else {
BigDecimal avgHighRS = highRS.divide(new BigDecimal("14"), 9, RoundingMode.HALF_DOWN) ;
BigDecimal avgLowRS = lowRS.divide(new BigDecimal("14"), 9, RoundingMode.HALF_DOWN) ;
BigDecimal rs = avgHighRS.divide( avgLowRS, 9, RoundingMode.HALF_DOWN) ;
BigDecimal hundred = new BigDecimal("100") ;
rsi = hundred.substract(hundred.divide(BigDecimal.ONE.add(rs),5, RoundingMode.HALF_DOWN)) ;
// La valeur obtenue est comprise entre 0 et 1 … on multiplie par cent pour avoir une valeur comprise entre 0 et 100 :
rsi = rsi.setScale(2, RoundingMode.HALF_DOWN) ;
}
return rsi ;
}