Comparaison du code de moyenne mobile exponentielle (EMA) écrit en Python

La moyenne mobile la plus couramment utilisée après la moyenne mobile simple (SMA) est la moyenne mobile exponentielle (EMA). En plus de MACD, qui est célèbre en tant qu'index technique qui utilise l'EMA, il existe également DEMA, TEMA et TriX qui utilisent l'EMA plusieurs fois, et les moyennes mobiles adaptatives telles que AMA, FrAMA et VIDyA utilisent l'EMA comme méthode de calcul. Je vais.

Cette fois, Comparaison des moyennes mobiles de type de filtre IIR avec les pandas et scipy Dans le prolongement de, comparons quelques codes EMA.

Formule EMA

Lors de l'utilisation réelle de l'EMA, la période est entrée en tant que paramètre, mais ici nous utilisons la formule directement pour vérifier les performances de l'EMA lui-même.

y(n)=\alpha x(n)+(1-\alpha)y(n-1)

En d'autres termes, le paramètre de EMA est $ \ alpha $ dans la formule ci-dessus.

Mise en œuvre par les pandas

Tout d'abord, les données d'entrée doivent être multipliées par EMA À propos du code Python pour une moyenne mobile simple en supposant l'utilisation de Numba Faites-en aussi une promenade aléatoire.

import numpy as np
import pandas as pd

dn = np.random.randint(2, size=100000)*2-1
gwalk = np.cumprod(np.exp(dn*0.01))*100

Dans les pandas, vous pouvez facilement convertir en classe Series et exécuter EMA avec les méthodes ʻewmetmean. Vous pouvez également affecter directement ʻalpha comme paramètre de ʻewm`. «Alpha» est dans la plage de 0 à 1 et il n'y a pas de différence particulière en fonction de la valeur, alors entrez 0,15 ici.

def EMA1(x, alpha):
    return pd.Series(x).ewm(alpha=alpha).mean()

%timeit y1 = EMA1(gwalk, 0.15)

Le temps d'exécution est le suivant.

100 loops, best of 3: 8.62 ms per loop

implémentation scipy par lflter

Comparaison des moyennes mobiles de type de filtre IIR avec les pandas et scipy Il s'agit d'une implémentation utilisant la fonction de filtre de scipy lfilter de la même manière que.

from scipy.signal import lfilter
def EMA2(x, alpha):
    y,zf = lfilter([alpha], [1,alpha-1], x, zi=[x[0]*(1-alpha)])
    return y

%timeit y2 = EMA2(gwalk, 0.15)

Le temps d'exécution est le suivant.

1000 loops, best of 3: 631 µs per loop

Jusqu'à présent, dans l'article précédent, il était dit que scipy était rapide, mais cette fois, il y a une suite.

Implémentation directe de formules à l'aide de Numba

Codez directement la formule EMA. Cependant, s'il est laissé tel quel, il sera très lent, utilisez donc Numba pour l'accélérer.

from numba import jit
@jit(nopython=True)
def EMA3(x, alpha):
    y = np.empty_like(x)
    y[0] = x[0]
    for i in range(1,len(x)):
        y[i] = alpha*x[i] + (1-alpha)*y[i-1]
    return y

%timeit y3 = EMA3(gwalk, 0.15)

Si vous ajoutez nopython = True à l'argument de @ jit et qu'aucune erreur ne se produit, vous pouvez vous attendre à une accélération. En fait, le temps d'exécution est

1000 loops, best of 3: 227 µs per loop

Et plus vite que scipy.

Dans le cas de l'EMA également, l'utilisation de Numba a abouti au codage direct le plus rapide.

Recommended Posts

Comparaison du code de moyenne mobile exponentielle (EMA) écrit en Python
J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
Code de vérification de la série Fourier écrit en Python
Comparaison des modules de conversion japonais en Python3
À propos du code Python pour une moyenne mobile simple en supposant l'utilisation de Numba
Une collection de code souvent utilisée dans Python personnel
Comparaison de l'implémentation de plusieurs moyennes mobiles exponentielles (DEMA, TEMA) en Python
Ruby, exécution de fragments de code Python de la sélection dans Emacs
Liste du code Python utilisé dans l'analyse de Big Data
Comparaison d'objets nuls en Python
Jugement d'équivalence d'objet en Python
2.x, 3.x code de caractères des séries python
Décrypter une ligne de code en Python lambda, carte, liste
Comparaison de 4 types de frameworks Web Python
Vérifions et formons statiquement le code du test automatique E2E écrit en Python [VS Code]
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Générer du code QR en Python
Comparaison de la gestion des trames de données en Python (pandas), R, Pig
Gacha écrit en Python -BOX Gacha-
Implémentation du tri rapide en Python
Code de caractère appris en Python
J'ai écrit le code pour écrire le code Brainf * ck en python
[Python] La valeur écrite par Openpyxl est affichée sous forme d'exposant (E).
Cool Lisp écrit en Python: Hy
[Python] Générer un code QR en mémoire
Formater automatiquement le code Python avec Vim
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Gestion des fichiers JSON en Python
Implémentation du jeu de vie en Python
Programme de diagnostic de compatibilité écrit en python
Affichage de la forme d'onde audio en Python
Ecrire le code de test du sélénium en python
La loi des nombres en python
Implémentation du tri original en Python
Comparaison de la vitesse de la perspective XML Python
Brouillage réversible d'entiers en Python
Logique gacha simple écrite en Python
Tests de code dans le temps en Python
Analysez le code source de votre propre moteur de recherche simple écrit en Python avec l'outil de visualisation de code "SOURCE TRAIL"
Comparaison de vitesse de partage en Python / janome, sudachi, ginza, mecab, fugashi, tinysegmenter
Différence entre la moyenne mobile exponentielle (EMA), la moyenne mobile à double indice (DEMA) et la moyenne mobile à triple indice (TEMA)
Lecture de code de faker, une bibliothèque qui génère des données de test en Python
Lecture de code de Safe, une bibliothèque pour examiner la force des mots de passe en Python
Exemple de code python pour la distribution exponentielle et l'estimation la plus probable (MLE)
Installation du code Visual Studio et installation de python
Conversion de la chaîne <-> date (date, datetime) en Python
Test de stress avec Locust écrit en Python
Vérifiez le comportement du destroyer en Python
Gestion des codes de caractères des fichiers en IronPython
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
Probabilité de transition de la chaîne de Markov écrite en Python
Résumé de diverses instructions for en Python
comparaison de chaînes python / utiliser 'list' et 'in' au lieu de '==' et 'ou'
Classe Trump en Python (avec comparaison)
[Python3] Réécrire l'objet code de la fonction