Comment effectuer une moyenne mobile en Python

Meilleure réponse

Jai écrit un article sur Medium qui présente les différents types de moyennes mobiles et codant leurs fonctions en Python (Full lien pour le code car le formatage est difficile: Comment coder différents types de moyennes mobiles en Python. ). Voici larticle:

Les logiciels de trading sont livrés avec différents types de moyennes mobiles déjà pré-installés et prêts à être cartographiés. Mais il peut être intéressant de comprendre comment calculer ces moyennes mobiles afin de pouvoir les utiliser lorsque vous testez à nouveau des stratégies potentielles.

Si vous voulez une méthode de bricolage, alors le ci-dessous vous intéressera sûrement. Tout ce qui est nécessaire est un interpréteur python tel que SPYDER. Les différents types «connus» de moyennes mobiles sont:

  • Moyenne mobile simple.
  • Moyenne mobile exponentielle.
  • Moyenne mobile lissée.
  • Moyenne mobile pondérée linéaire.

Nous va parcourir chacun deux, le définir, le coder et le tracer.

Graphique quotidien GBPUSD. En noir, AMM 200 jours, en cramoisi, EMA 200 jours, en AMM jaune lissé 200 jours, et en rose AMM pondérée linéaire 200 jours.

Moyenne mobile simple

Comme son nom lindique, il sagit de votre moyenne simple simple qui est utilisée partout dans les statistiques et fondamentalement dans toute autre partie de nos vies. Il sagit simplement des valeurs totales des observations divisées par le nombre dobservations.

Mathématiquement parlant, cela peut être écrit comme suit:

En python, nous pouvons définir une fonction qui calcule les moyennes mobiles comme suit:

[Le code Python va ici, sil vous plaît reportez-vous au lien de larticle original ci-dessus car le collage du code prend du temps]

La fonction prend votre structure de données représentée par les Données , la période de moyenne mobile (20, 60, 200, etc.) représentée par la variable période , sur quoi voulez-vous lappliquer ( sur les structures de données OHLC, choisissez 3 pour les prix de clôture car lindexation python commence à zéro) représenté par la variable onwhat et la où la variable est lendroit où vous voulez que la colonne de moyenne mobile apparaisse. Notez que vous devez avoir un tableau de plus de 4 colonnes pour que cela fonctionne, car cela ne crée pas automatiquement une nouvelle colonne, mais la remplit simplement.

EURUSD Horizon temporel quotidien avec moyenne mobile simple de 200 jours.

Moyenne mobile exponentielle

Contrairement à la moyenne mobile simple qui donne des poids égaux à toutes les observations, la moyenne mobile exponentielle donne plus de poids aux observations les plus récentes. Il réagit plus que la simple moyenne mobile en ce qui concerne les mouvements récents.

Mathématiquement parlant, il peut être écrit comme suit:

Le facteur de lissage est souvent 2. Notez que si nous augmentons le facteur de lissage (également appelé alpha), les observations les plus récentes auront plus de poids.

En langage python , nous pouvons définir une fonction qui calcule lEMA comme suit:

[Le code Python va ici, veuillez vous référer au lien de larticle original ci-dessus en collant le code prend du temps]

La fonction est explicite car elle ne fait que reproduire la fonction EMA présentée ci-dessus.

EURUSD Horizon temporel quotidien avec moyenne mobile exponentielle sur 200 jours.

Moyenne mobile lissée

Cette moyenne mobile prend en compte le tableau général et est moins impactée par les mouvements récents. C’est mon indicateur de suivi de tendance préféré. Mathématiquement parlant, il peut être trouvé en multipliant simplement la variable Days dans la fonction EMA par 2 et en soustrayant 1. Cela signifie que pour transformer une moyenne mobile exponentielle en une moyenne lissée, nous suivons cette équation en langage python, qui transforme le déplacement exponentiel moyenne en un lissé:

smoothed = (exponential * 2) - 1 # From exponential to smoothed

EURUSD Horizon temporel quotidien avec moyenne mobile lissée sur 200 jours.

Moyenne mobile pondérée linéaire

Cest une moyenne mobile simple qui accorde plus de poids aux données récentes. Lobservation la plus récente a le poids le plus élevé et chacune avant elle a un poids progressivement décroissant.Intuitivement, il a moins de retard que les autres moyennes mobiles mais cest aussi le moins utilisé, et par conséquent, ce quil gagne en réduction de retard, il perd en popularité.

Mathématiquement parlant, cela peut être écrit comme suit:

En langage python, nous pouvons définir une fonction qui calcule les moyennes mobiles comme suit:

[Le code Python va ici, veuillez vous référer au lien de larticle original ci-dessus car coller le code prend du temps]

EURUSD Horizon temporel quotidien avec moyenne mobile pondérée sur 200 jours.

Fondamentalement, si nous avons un ensemble de données composé de deux nombres [1, 2] et nous voulons calculer une moyenne pondérée linéaire, puis nous ferons ce qui suit:

  • (2 x 2) + (1 x 1) = 5
  • 5/3 = 1.66

Ceci suppose une série chronologique avec le numéro 2 comme observation la plus récente.

Conclusion

Alors, lequel choisir? Cette question est laissée au profil de risque du trader et à sa familiarité avec la moyenne mobile. Certains préfèrent les moyennes mobiles simples tandis que dautres essaient de creuser plus profondément en utilisant des combinaisons de moyennes mobiles exponentielles et lissées. Tout dépend de vous pour trouver votre préféré. Mon conseil? Envisagez des moyennes mobiles à plus long terme.

Réponse

Pourquoi personne na encore mentionné les pandas? Bibliothèque danalyse de données Python

import pandas as pd, numpy as np

np.random.seed(1)

random\_walk = pd.Series(

np.random.randn(100)

).cumsum() # dummy data

random\_walk.ewm(span=10).mean() # ema

random\_walk.rolling(20).mean() # simple moving average

random\_walk.expanding().mean() # expanding average

index = pd.bdate\_range("2012","2013",freq="1h") # time series

series = pd.Series(

np.random.randn(index.shape[0]),index

)

series.rolling("100h").mean() # 100 hours, time based window

series.rolling(pd.Timedelta(hours=30)).mean() # You may use any offset compatible with index

series.rolling(10, win\_type="triang").mean() # triangle weights

series.rolling(10,center=True).mean() # value in the middle of window

Laisser un commentaire

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