Comment fonctionnent réellement les indicateurs techniques en bourse?

Quiconque a dĂ©jĂ  Ă©tĂ© intĂ©ressĂ© par les actions ou les crypto-monnaies a vu ces lignes supplĂ©mentaires sur les graphiques. Vous avez peut-ĂȘtre entendu l'opinion selon laquelle cela ne fonctionne pas. Mais ils amĂ©liorent considĂ©rablement ma capacitĂ© de trading, tout en affichant de nombreuses donnĂ©es importantes. Mais comment fonctionnent-ils rĂ©ellement? Et Ă  qui cela peut ĂȘtre utile?

Vous devriez certainement lire ceci si:

  1. Vous les utilisez dans le day trading
  2. Vous envisagez d'écrire un bot de trading
  3. Si vous souhaitez mettre en place vous-mĂȘme une stratĂ©gie ou des indicateurs de trading




Le plus souvent, les indicateurs techniques sont une fonction de fenĂȘtre, une fonction rĂ©cursive ou une fonction pondĂ©rĂ©e des prix / volumes tirĂ©e de la bourse au format UOHLCV (heure unix, ouverture, haut, bas, fermeture, volume). Il n'est pas rare que les indicateurs utilisent diffĂ©rents filtrages, minimums et maximums ou d'autres indicateurs comme base pour les calculs ultĂ©rieurs.

Moyenne mobile simple (SMA)


Lors du codage des indicateurs, il est trĂšs pratique d'utiliser une approche fonctionnelle. Par exemple, la moyenne mobile est juste la moyenne de chaque valeur de la fenĂȘtre mobile.

function sma($close, window) { return rolling(x => mean(x), window, $close); } 

oĂč la moyenne est l'opĂ©ration qui calcule la moyenne du tableau et le roulement est la combinaison de la fonction de fenĂȘtre qui, pour chaque Ă©lĂ©ment existant dans le tableau, produit un tableau des n derniers Ă©lĂ©ments et l' opĂ©ration qui plie cette fenĂȘtre en un nombre.

 function rolling(operation, window, array) { let result = []; for (let i = 0; i < array.length; i++) { if (i + 1 < window) { result.push(NaN); } else { result.push(operation(array.slice(i + 1 - window, i + 1))); } } return result; } 

Le SMA est un indicateur en retard et permet de dĂ©terminer la tendance. Il est dessinĂ© en superposition sur le graphique et les premiĂšres valeurs sont gĂ©nĂ©ralement supprimĂ©es. Deux moyennes mobiles peuvent ĂȘtre utilisĂ©es ensemble pour gĂ©nĂ©rer des signaux de croisement.

Moyenne mobile simple (SMA)

Un croisement haussier se produit lorsqu'une moyenne mobile relativement courte Ă©clate la moyenne mobile longue. La moyenne mobile Ă  pondĂ©ration exponentielle est plus souvent utilisĂ©e dans la pratique, car une fonction de fenĂȘtre pondĂ©rĂ©e rĂ©duit l'effet de retard.

Écart type (STDEV)


Si nous remplaçons la fonction moyenne dans SMA par l'écart-type, nous obtiendrons un écart-type glissant

 function stdev($close, window) { return rolling(x => sd(x), window, $close); } 

OĂč sd est considĂ©rĂ© comme la racine carrĂ©e de la variance et gĂ©nĂ©ralement sans correction de Bessel. Nous supposerons que tout le monde comprend comment implĂ©menter sd

sd(x)= sqrt frac sum(xi− hatx)2N.


La racine carrĂ©e de la variance est utilisĂ©e parce que la variance elle-mĂȘme mesurĂ©e en dollars suqare en termes de thĂ©orie des dimensions et non parce que quelqu'un a dĂ©posĂ© une marque ou quoi que ce soit.

Bandes de Bollinger (BBAND)


Ainsi, nous avons déjà mis en place deux indicateurs de base que nous pouvons combiner et en obtenir de nouveaux. Par exemple, si nous considérons l'ajout ponctuel de la moyenne mobile et de l'écart-type multiplié par 2, nous obtiendrons la partie supérieure de la bande de Bollinger et la partie inférieure que nous obtiendrons si nous soustrayons.

 function bb($close, window, mult) { let middle = sma($close, window); let upper = pointwise((a, b) => a + b * mult, middle, stdev($close, window)); let lower = pointwise((a, b) => a - b * mult, middle, stdev($close, window)); return { lower : lower, upper : upper}; } 

oĂč la fonction point par point est une autre fonction utile

 export function pointwise(operation, ...arrays) { let result = []; for (let i = 0, len = arrays[0].length; i < len; i++) { let iarr = (i) => arrays.map(x => x[i]); result[i] = operation(...iarr(i)); } return result; } 

et il suffit d'effectuer une opération avec plusieurs tableaux

Bandes de Bollinger (BBAND)

Les bandes de Bollinger aident Ă  dĂ©terminer le calme avant le mouvement des grands prix et sont utilisĂ©es comme un outil pour dĂ©placer la volatilitĂ© directement sur le graphique, l'Ă©cart-type soustrait / ajoutĂ© de la moyenne mobile afin d'ĂȘtre affichĂ© en superposition sur un graphique avec le prix.

Moyenne mobile exponentielle (EMA)


Comment réduire le décalage de la moyenne mobile simple? Puisqu'il calcule la moyenne des n derniers cours de clÎture, nous pouvons comprendre que nous pouvons effectuer la sommation avec un certain poids et réduire la contribution des anciens prix.

 barx= frac sumxiN= frac sum1 cdotxi sum1 quad Rightarrow quad widetildex= frac sumxiwi sumwi


Par exemple, si nous choisissons wn=qnet une constante qc'est moins d'un, alors nous obtenons un poids infiniment décroissant, si nous ajoutons les prix en commençant par le plus récent.

fonctions pondérées

Il est Ă©galement possible d'approximer les calculs et d'obtenir une Ă©quation rĂ©cursive si nous dĂ©veloppons la fenĂȘtre sur toute sa longueur et supposons que la contribution des queues est faible.

1+q+q2+...+qn undersetn to infty undersetq<0= frac11−q mathrmEMAcurr= frac sumxiqi sumqi=(1−q) sumxiqi mathrmEMAnext= fracxsuivant+q cdot sumxiqi1+q cdot sumqi=(1−q) cdot left[xsuivant+q cdot sumxiqi right] mathrmEMAnext=(1−q) cdotxnext+q) cdot mathrmEMAcurr



Enfin, nous avons besoin d'une valeur α = 1 - q comme constante de lissage. Il est possible de prouver que lorsque nous choisissons  alpha=2/(N+1)Le centre de masse des tableaux de poids EMA et SMA ci-dessus devient Ă©gal. Dans le code, cela semble beaucoup plus simple.

 function ema($close, window, weight = null) { weight = weight ? weight : 2 / (window + 1); let ema = [ mean($close.slice(0, window)) ]; for (let i = 1; i < $close.length; i++) { ema.push($close[i] * weight + ema[i - 1] * (1 - weight)); }; return ema; } 

En gĂ©nĂ©ral, c'est la mĂȘme moyenne mobile mais plus sensible.

Moyenne mobile exponentielle (EMA)
L'efficacité de l'utilisation dépend de votre expérience et des paramÚtres utilisés. Par exemple sur ce site les paramÚtres sont assez bien choisis.

Divergence de convergence moyenne mobile (MACD)


Gerald Appel en 1979 a proposé l'un des indicateurs les plus simples et les plus efficaces disponibles. Il transforme deux indicateurs de tendance EMA en oscillateur de momentum et offre le meilleur des deux mondes: suivi de tendance et momentum. En gros, l'histogramme MACD est un dérivé du prix. Il est dessiné dans un nouveau systÚme de coordonnées plutÎt qu'une superposition et il représente avec deux lignes et un histogramme.

Divergence de convergence moyenne mobile (MACD)

Pour calculer la ligne MACD, nous devons soustraire EMA long de court, c'est tout. Un autre EMA de cette ligne avec une petite fenĂȘtre produira la ligne de signal. L'histogramme est obtenu par diffĂ©rence entre les deux rĂ©sultats prĂ©cĂ©dents.

 function macd($close, wshort, wlong, wsig) { let line = pointwise((a, b) => a - b, ema($close, wshort), ema($close, wlong)); let signal = ema(line, wsig); let hist = pointwise((a, b) => a - b, line, signal); return { line : line, signal : signal, hist : hist }; } 

Matrice de corrélation


Si vous vous intéressez à l'investissement à long terme et à l'analyse de portefeuille, vous trouverez la matrice de corrélation utile.

 function cor(f, g) { let Ef = mean(f), Eg = mean(g); let Ef2 = mean(pointwise((a) => a * a, f)); let Eg2 = mean(pointwise((a) => a * a, g)); let Efg = mean(pointwise((a, b) => a * b, f, g)); return (Efg - Ef * Eg) / Math.sqrt((Ef2 - Ef * Ef) * (Eg2 - Eg * Eg)); } 

Voici la matrice de corrélation de différents crypto-actifs en 2 mois.



Test d'unité d'indicateur


Si nous avons des tableaux précis de valeurs d'indicateur, nous pouvons tester avec précision notre calcul. Il existe différentes façons de déterminer la mesure d'erreur entre les deux fonctions, mais dans ce cas, l'erreur quadratique moyenne normalisée est mieux adaptée car elle est une quantité sans dimension contrairement à RMSE et elle est relative.

 mathrmNRMSE= gauche. sqrt frac sum( hatxi−xi)2N middle/( maxxi− minxi) right.


Par exemple, le bitcoin peut coûter 20 000 $ et une différence de 10 $ est faible, tandis que lorsque l'altcoin entier peut coûter 1 $ et la différence de 10 $ est énorme.

 function nrmse(f, g) { let sqrDiff = pointwise((a, b) => (a - b) * (a - b), f, g); return Math.sqrt(mean(sqrDiff)) / (Math.max(...f) - Math.min(...f)); } 

Nous pouvons également utiliser MAPE mais ce n'est pas comutatif et avoir un problÚme proche de zéro.

Conclusion


Voilà. En quelques lignes de code, nous pouvons exprimer les indicateurs techniques de base, si vous aimez cette explonation, consultez ma bibliothÚque sur github. Vous y trouverez bien plus. Si vous souhaitez utiliser des algorithmes d'apprentissage automatique pour votre bot, cochez l'indicateur Zig-Zag comme points d'entrée.

Les références


1. StockCharts - une liste d'algorithmes avec des données de test dans les tableaux.
2. Cryptowatch - paramÚtres d'indicateurs bien réglés.
3. Github - mon code source.

PS Si vous trouvez des erreurs dans le texte, veuillez m'en informer directement.

Source: https://habr.com/ru/post/fr440090/


All Articles