Calcul de Moyenne Mobile Exponentielle

Discutez d'informatique ici !
Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

Calcul de Moyenne Mobile Exponentielle

par Mykeul » 19 Mai 2008, 08:29

Bonjour à tous,

Je développe un robot surveillant les cours de bourse et pour celui ci, j'ai besoin d'une moyenne mobile exponentielle.
J'ai déjà codé beaucoup de fonctions mais je bloque sur celle de cette moyenne (notée EMA pour Exponential Moving Average), je me demande si vous pouviez m'aider.

J'ai bien trouvé qu'il faut :
- utiliser le 1er cours comme premiere valeur de l'EMA.
- calculer "alpha" qui est = 2 / (N +1)
- appliquer alpha au dernier cours (multiplication)
- appliquer "1-alpha" (noté beta) à la derniere valeur de l'EMA (multiplication)
- additionner les 2 valeurs calculées

Voici les pages dont je m'inspire (un seul calcul est nécessaire mais j'ai fait les 3 tests) :
[FONT=Courier New]$new=(($value - $old ) * $multi) + $old; //http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages
$new=($old * $beta) + ($value * $alpha); //http://www.vbfrance.com/codes/MME-MOYENNE-MOBILE-EXPONENTIELLE_29989.aspx
$new=($alpha * $value) + ($beta * $old); //http://www.trading-school.eu/glossaire-bourse/fiche-Moyennes-Mobiles-40
[/FONT]

$value vaut le dernier cours
$old vaut la valeur precedente de l'EMA.

Voici maintenant la serie de valeurs :
43.99,44.38,45.17,45.34,44.86,44.33,46.4,46.89,45.85,44.62,44.81,45.5,45.72,46.17,45.67,45.48,45.03,44.12,44.5,46.04
Sachant que 43.99 est le dernier cours (aujourd'hui) et 46.04 est le premier cours de la serie de 20.
J'ai affiché le calcul du robot ci dessous.
J'obtiens un resultat de "EMA : 45.2429084065", or tous mes logiciels de Trading renvoient la meme valeur : 44.8687
J'ai donc probablement raté quelque chose mais après avoir passé plus de 4 heures dessus hier soir, je seche un peu.

Merci pour votre aide

Calcul détaillé :
[FONT=Courier New](0.0952380952381 x 44.5) + (0.904761904762 x 46.04) = 45.8933333333
(0.0952380952381 x 44.12) + (0.904761904762 x 45.8933333333) = 45.7244444444
(0.0952380952381 x 45.03) + (0.904761904762 x 45.7244444444) = 45.6583068783
(0.0952380952381 x 45.48) + (0.904761904762 x 45.6583068783) = 45.6413252708
(0.0952380952381 x 45.67) + (0.904761904762 x 45.6413252708) = 45.6440561974
(0.0952380952381 x 46.17) + (0.904761904762 x 45.6440561974) = 45.6941460834
(0.0952380952381 x 45.72) + (0.904761904762 x 45.6941460834) = 45.6966083612
(0.0952380952381 x 45.5) + (0.904761904762 x 45.6966083612) = 45.6778837553
(0.0952380952381 x 44.81) + (0.904761904762 x 45.6778837553) = 45.5952281596
(0.0952380952381 x 44.62) + (0.904761904762 x 45.5952281596) = 45.5023492873
(0.0952380952381 x 45.85) + (0.904761904762 x 45.5023492873) = 45.5354588789
(0.0952380952381 x 46.89) + (0.904761904762 x 45.5354588789) = 45.6644627952
(0.0952380952381 x 46.4) + (0.904761904762 x 45.6644627952) = 45.7345139576
(0.0952380952381 x 44.33) + (0.904761904762 x 45.7345139576) = 45.6007507235
(0.0952380952381 x 44.86) + (0.904761904762 x 45.6007507235) = 45.5302030356
(0.0952380952381 x 45.34) + (0.904761904762 x 45.5302030356) = 45.5120884608
(0.0952380952381 x 45.17) + (0.904761904762 x 45.5120884608) = 45.4795086074
(0.0952380952381 x 44.38) + (0.904761904762 x 45.4795086074) = 45.3747935019
(0.0952380952381 x 43.99) + (0.904761904762 x 45.3747935019) = 45.2429084065
[/FONT]



Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 19 Mai 2008, 19:50

Salut,

En utlisant la methode décrite ici Voici les valeurs que j'obtiens avec differente valeurs du facteur de lissage:


Code: Tout sélectionner
a = facteur de lissage

a=80%  => MME=44.90382520738205
a=79%  => MME=44.88228999120236
a=78%  => MME=44.86086393357228  (N~8)
a=77%  => MME=44.8395976659012
a=76%  => MME=44.81853544756977
a=75%  => MME=44.79771539556829


a=100% => MME=45.2435 (Moyenne arithmétique)
a=90%  => MME=45.10979909934997
a=80%  => MME=44.903825207382035
a=70%  => MME=44.698196743094016
a=60%  => MME=44.52616413932661
a=50%  => MME=44.38747832057793
a=40%  => MME=44.27389605223552
a=30%  => MME=44.17904035192474
a=20%  => MME=44.100157894604834
a=10%  => MME=44.03701880739617
a=0%   => MME=43.99 (Valeur actuelle du cours, la plus récente)

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 19 Mai 2008, 21:09

Merci pour votre réponse.
Je vois cependant que je n'ai pas été assez clair dans ma question, je vais essayer de reexprimer quelques points :

J'ai pris ci dessus une serie de 20 valeurs, ce qui complique inutilement le calcul, je vais le redescendre à 5. Cela doit fonctionner correctement.

N = Nombre de periodes, ici 5, c'est imposé.
Alpha = 2/(N+1) donc Alpha = 2/6 = 0.333333 invariable

La serie de valeurs est :
Ct = 43.99
Ct-1 = 44.38
Ct-2 = 45.17
Ct-3 = 45.34
Ct-4 = 44.86

Si on prend la formule du site indiqué, que j'avais trouvé aussi mais qui ne m'a pas convaincu car le resultat n'est pas bon non plus :
43.99+(a x 44.38)+(a^2 x 45.17)+(a^3 x 45.34)+(a^4 x 44.86)
-------------------------------------------------------------
1+a+a^2+a^3+a^4

SOIT :

43.99+(0.33333333 x 44.38)+(0.11111111 x 45.17)+(0.03703704 x 45.34)+(0.01234568 x 44.86)
------------------------------------------------------------------------------------------
1+0.33333333+0.11111111+0.03703704+0.01234568

Cela donne : 66.035308642/1.49382716049=44.2054545455
Or le résultat juste, donné par tous les logiciels de Trading est 44.6367

Pour correllation, le calcul sur 5 periodes avec le calcul précedent donne :
(0.333333333333 x 45.34) + (0.666666666667 x 44.86) = 45.02
(0.333333333333 x 45.17) + (0.666666666667 x 45.02) = 45.07
(0.333333333333 x 44.38) + (0.666666666667 x 45.07) = 44.84
(0.333333333333 x 43.99) + (0.666666666667 x 44.84) = 44.5566666667
Et donc pas bon non plus.

C'est prenant cette fonction ...

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 19 Mai 2008, 21:52

J'ai un doute là. La période (le N=5) n'a rien à voir avec le nombre de valeurs dans la série. Ça definie juste un coéficient de filtrage (lissage). Quelles valeurs de ce coeficient tes logiciels utilisent-ils ?

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 19 Mai 2008, 22:47

Avec une valeur de N+1=~7.71 je trouve à peu près le résultat que tu donnes:
44.636789060569626
C'est bizarre je me serais plutot attendu à une valeur de N=7 (ça fait une periode 7 jours si l'on considére un echantillon par jour)
Ton algorithme de calcul est correct.

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 19 Mai 2008, 23:45

Je ne comprends pas exactement la réponse.
D'après http://www.trading-school.eu/glossaire-bourse/fiche-Moyennes-Mobiles-40 par ex, le N vaut bien le nombre de "periodes" donc le nombre de prix dans la série.

Je ne vois pas quelles valeur autre je pourrai donner à N et les logiciels de Trading ne fournissent pas la source des calculs de fonctions.
Je n'ai donc pas vraiment d'indices ...

Update, je viens de voir la 2eme réponse :
D'accord mais 7.71 ne représente aucune "hypothese", que se passe-t-il si on augmente le nombre de prix à 8 par exemple ?
Voici les 2 valeurs sur 8 periodes :
EMA(calcul 1er post) : 45.0673323306
EMA(calcul proposé 2eme post) : 44.1163327119
Valeur réelle dans logiciels : 44.8515
Serie : 43.99,44.38,45.17,45.34,44.86,44.33,46.4,46.89

J'avoue etre perdu ...

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 20 Mai 2008, 00:09

Mathématiquement, le calcul que tu executes est un filtre du premier ordre. Les coéficients a et (1-a) définits en fonction de cette fameuse péridode N sont fonction de la "force de lissage" de la courbe originale.
Visiblement le calcul de cette période est difficile et il faut l'adapter en fonction du besoin, tout en bas de l'article que tu cites, ils donnent quelques réponses...

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 00:22

Je vais regarder cela, en attendant, j'ai eu une idée mais je ne sais pas si ca peut aider.

La série, toujours la meme :
Ct = 43.99
Ct-1 = 44.38
Ct-2 = 45.17
Ct-3 = 45.34
Ct-4 = 44.86

Et maintenant, voici les valeurs calculées par les logiciels pour les EMA sur 1 à 5 périodes (dont N=1 à N=5 noté EMA'N') :
EMA1 : 43.99
EMA2 : 44.2088
EMA3 : 44.3875
EMA4 : 44.5262
EMA5 : 44.6367

Cela peut il aider à en déduire la formule ou les variables utilisées ?
Sachant que nous n'avons pas d'autres valeurs au départ que la série et le nombre de periodes ...

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 00:33

Pour revenir sur la réponse précedente, ce qui est décrit en bas de la page indique qu'il n'est pas aisé de trouver la période qui nous convient, dans le sens où une EMA (ou MME) sur 20 periodes n'indique pas du tout la meme chose qu'une sur 150 pour qui veut s'en servir pour trader.
Cependant, le calcul de la moyenne est le meme, seule la periode (et donc la longueur de la serie) change.
Je ne suis pas sur d'avoir été clair..

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 20 Mai 2008, 00:38

Reponse #8

Oui, essaye de faire des tests avec des series contenant que des nombres entiers.
par exemple tu fais:
1
1 2
1 2 3
1 2 3 4
...
Tu peux rentrer N dans tes softs ?
Attention il faut distinguer 2 choses:
Periode1 : Force de lissage (en unité de temps)
Periode2 : Durée de la serie (ou nombre d'echantillon * Periode d'échantillonnage)

PS: Je n'ai pas tout lu l'article mais visiblement, eux ce qu'il appelle peridode c'est la force de lissage.

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 00:50

Qu'est ce que la force de lissage au juste ?

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 20 Mai 2008, 01:04

Tu le vois bien sur les courbes, MMS200 lisse plus que MMS100 qui lisse plus que MMS50, etc... Je suppose (c'est pas sur) que MMS200, c'est la moyenne arithmétique sur les 200 dernières valeurs).
En fait, il s'agit d'un filtre passe bas (comme en audio), cette période (que j'ai appelée force de lissage), c'est comme la fréquence de coupure d'un ampli qui est bien idépendante de la durée de la chanson qui passe.

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 08:48

Bonjour,

En effet, une MMS200 (ou SMA200) est une moyenne arithmetique sur 200 jours, le résultat est donc forcément plus "lissé" que sur 50 jours.
Le principe est le meme pour les MME200 (ou EMA200) et MME50, mais le calcul n'est pas le meme car on pondere le resultat en accordant plus de "valeur" aux dernieres valeurs qu'aux premieres.
Le seul changement entre une MME200 et une MME50 (tout comme pour MMS200 et MMS50), en dehors de la longueur de la serie, c'est le nombre de "periodes" (ou de prix plus execactement) prises en compte : N.

Je ne saurai confimer pour la partie Audio car ce n'est pas un domaine que je maitrise.
Je fais les calculs avec 1 2 3 4 etc dès que possible, c'est un peu compliqué caril faut creer une valeur boursiere fictive.

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 20 Mai 2008, 12:11

Bonjour Mykeul,

L'algorithme de calcul que tu as utilisé est un filtre passe-bas. L'article est en anglais, mais regarde seulement le programme qui est donné a la fin, tu reconnaitra ta méthode.


On pose


et on voit aisement que:

On reconnait un produit de convolution avec une exponentielle (les ). On peut se ramener a une exponentielle du type ou est la constante de temps qui définie dans la formule ci dessus .

La différence entre une MMS et une MME, c'est juste la forme du signal avec lequel on convolue. Dans le cas d'une MMS, on n'a seulement une "porte" et cette porte est définie seulement par sa durée (période). Pour une MME, c'est un peu plus compliqué, puisque on convolue avec une exponentielle donc normalement on devrait développer, la formule ci-dessus jusqu'a l'infini et on a pas de condition sur . Toi tu as pris comme valeur de , la premiere valeurs du cour. C'est un choix.

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 13:28

Mmmh ... pour etre franc, je suis totalement largué par ce dernier message.
Cela dit, je comprends aisément le code en bas de l'article Wikipedia et c'est en effet la meme chose.

La formule ci dessous, si je la traduis dans ma langue, veut elle dire : ?
Sachant que N=periodes, a=2/(N+1) et b = 1-alpha
EMAt = a x (Ct + (b x Ct-1) + (b x Ct-2) + ....)
Image
Je vais coder ca vite fait pour voir.

Je continue mes tests et je les poste asap.

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 13:42

Je n'ai pas du comprendre la formule, voici le resultat :

0.333333333333 * (43.99 + (0.666666666667x44.38) + (0.666666666667x45.17) + (0.666666666667x45.34) + (0.666666666667x44.86))
= 54.6077777778
au lieu de 44.6367 sur 5 periodes.

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 20 Mai 2008, 13:59

Oui, il semble que tu ais oublié la puissane :lol3:

Pour le 2/(N+1). J'avoue ne pas connaitre cette formule. Normalement en utilisant la formule décrite plus haut on devrait avoir:

ou est la durée entre 2 echantillons, donc:
si on considére 1 échantillon par jour.
N est la constante de temps (en nombre de jours), or il y a ici un facteur 2. je vais réfléchir à ça.

Mykeul
Membre Naturel
Messages: 24
Enregistré le: 19 Mai 2008, 07:51

par Mykeul » 20 Mai 2008, 23:12

Bon resultat des tests :
- D'abord j'ai fais le test au cas ou avec alpha=1/N+1 au lieu de 2/N+1, ca ne fonctionne pas, c'est pire

- Pour la série simple :
Ct = 1
Ct-1 = 2
Ct-2 = 3
Ct-3 = 4
Ct-4 = 5
Et donc nous partons sur 5 "periodes", puis on diminue.

Voici le résultat (EMA) donné par les logiciels :
N=5(serie:1,2,3,4,5) : 2.60494
N=4(serie:1,2,3,4) : 2.30560
N=3(serie:1,2,3) : 1.93750
N=2(serie:1,2) : 1.49383
N=1(serie:1) : 1.00000
Ce sont donc les résultats que je dois trouver.

Voici ce que je trouve avec les memes fonctions qu'avant :
N=5 :
(0.333333333333 x (4 - 5)) + 5 = 4.66666666667
(0.333333333333 x (3 - 4.66666666667)) + 4.66666666667 = 4.11111111111
(0.333333333333 x (2 - 4.11111111111)) + 4.11111111111 = 3.40740740741
(0.333333333333 x (1 - 3.40740740741)) + 3.40740740741 = 2.6049382716
Ca marche !?!

Puis,
N=4 :
(0.4 x (3 - 4)) + 4 = 3.6
(0.4 x (2 - 3.6)) + 3.6 = 2.96
(0.4 x (1 - 2.96)) + 2.96 = 2.176
Ca ne marche plus ... avec 4

Un dernier pour la route,
N=3 :
(0.5 x (2 - 3)) + 3 = 2.5
(0.5 x (1 - 2.5)) + 2.5 = 1.75
Ce ne marche pas non plus ...

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 21 Mai 2008, 00:15

OK, je vais essayer de voir ce que je peux faire avec ces resultats...

Mais il y a quelque chose que je ne comprends pas. Pourquoi fais-tu varier le N avec le nombre de valeurs dans la serie ? C'est independant ! Une MME se fait
sur un certain nombre de jours. Je peux par exemple calculer une MME avec
N=7 jours pour une serie de 100 valeurs. Comment saisis-tu dans tes logiciels la
valeur de cette période ?
Le produit de convolution (l'operation qui calcule la courbe lissée) peut se voir
effectivement comme une moyene pondérée sur les n dernieres valeurs (si n est assez grand dans ce cas). Mais les coéficients qui pondére les valeurs de la serie peuvent varier (pour un même n), il n'y a pas un moyen unique pour calculer une MME, il faut connaitre cette periode (que l'on note apparament N est qui est liée à une certaine durée de cylcle dépendante de l'evolution du prix).

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 12:17

par Jean_Luc » 21 Mai 2008, 00:55

Extrait de WikiPedia à propos des MME:

Contrairement aux autres types de moyennes glissantes, le nombre de périodes N ne représente pas le nombre de valeurs participant à la moyenne; il ne sert qu'à spécifier la constante de lissage ;).

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite