Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)

Der am häufigsten verwendete gleitende Durchschnitt nach dem einfachen gleitenden Durchschnitt (SMA) ist der exponentielle gleitende Durchschnitt (EMA). Neben MACD, das als technischer Index bekannt ist, der EMA verwendet, gibt es auch DEMA, TEMA und TriX, die EMA mehrfach verwenden, und adaptive gleitende Durchschnitte wie AMA, FrAMA und VIDyA verwenden EMA als Berechnungsmethode. Ich werde.

Diesmal, Vergleich der gleitenden Durchschnittswerte des IIR-Filtertyps mit Pandas und Scipy Vergleichen wir als Fortsetzung einige EMA-Codes.

EMA-Formel

Bei der tatsächlichen Verwendung von EMA wird der Zeitraum als Parameter eingegeben. Hier verwenden wir jedoch die Formel direkt, um die Leistung der EMA selbst zu überprüfen.

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

Mit anderen Worten, der Parameter von EMA ist in der obigen Formel $ \ alpha $.

Umsetzung durch Pandas

Zunächst müssen die Eingabedaten EMA sein Über Python-Code für einfachen gleitenden Durchschnitt unter Verwendung von Numba Machen Sie es auch als zufälligen Spaziergang.

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

In Pandas können Sie problemlos in die Serienklasse konvertieren und EMA mit den Methoden "ewm" und "mean" ausführen. Sie können alpha auch direkt als Parameter von ewm zuweisen. alpha liegt im Bereich von 0 bis 1 und es gibt keinen besonderen Unterschied in Abhängigkeit vom Wert. Geben Sie hier also 0,15 ein.

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

%timeit y1 = EMA1(gwalk, 0.15)

Die Ausführungszeit ist wie folgt.

100 loops, best of 3: 8.62 ms per loop

scipy Implementierung von lflter

Vergleich der gleitenden Durchschnittswerte des IIR-Filtertyps mit Pandas und Scipy Es ist eine Implementierung, die die Filterfunktion lfilter von scipy auf die gleiche Weise verwendet wie.

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)

Die Ausführungszeit ist wie folgt.

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

Bisher wurde im vorherigen Artikel gesagt, dass scipy schnell ist, aber diesmal gibt es eine Fortsetzung.

Direkte Implementierung von Formeln mit Numba

Codieren Sie die EMA-Formel direkt. Wenn es jedoch so bleibt, wie es ist, ist es sehr langsam. Verwenden Sie Numba, um es zu beschleunigen.

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)

Wenn Sie dem Argument von "@ jit" "nopython = True" hinzufügen und kein Fehler auftritt, können Sie mit einer Beschleunigung rechnen. In der Tat ist die Ausführungszeit

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

Und schneller als scipy.

Auch bei EMA führte die Verwendung von Numba zur schnellsten direkten Codierung.

Recommended Posts

Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)
Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
In Python geschriebener Fourier-Serien-Verifizierungscode
Vergleich japanischer Konvertierungsmodule in Python3
Informationen zu Python-Code für einfachen gleitenden Durchschnitt unter Verwendung von Numba
Eine Code-Sammlung, die häufig in persönlichem Python verwendet wird
Vergleich der Implementierung mehrerer exponentieller gleitender Durchschnitte (DEMA, TEMA) in Python
Ruby, Python-Codefragment Ausführung der Auswahl in Emacs
Liste des Python-Codes, der bei der Big-Data-Analyse verwendet wird
Nullobjektvergleich in Python
Objektäquivalenzbeurteilung in Python
2.x, 3.x Serienzeichencode von Python
Entschlüsseln Sie eine Codezeile in Python Lambda, Karte, Liste
Vergleich von 4 Arten von Python-Webframeworks
Lassen Sie uns den Code des in Python [VS Code] geschriebenen automatischen E2E-Tests statisch überprüfen und formatieren.
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
Generieren Sie QR-Code in Python
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
Gacha geschrieben in Python -BOX Gacha-
Implementierung der schnellen Sortierung in Python
In Python gelernter Zeichencode
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
[Python] Der von Openpyxl geschriebene Wert wird als Exponent (E) angezeigt.
Cooles Lisp geschrieben in Python: Hy
[Python] Generiert QR-Code im Speicher
Formatieren Sie Python-Code automatisch mit Vim
Zeitdelta in Python 2.7-Serie teilen
MySQL-automatische Escape-Funktion von Parametern in Python
Umgang mit JSON-Dateien in Python
Implementierung eines Lebensspiels in Python
Kompatibilitätsdiagnoseprogramm in Python geschrieben
Audio-Wellenform-Anzeige in Python
Schreiben Sie Selentestcode in Python
Das Gesetz der Zahlen in Python
Implementierung der ursprünglichen Sortierung in Python
Geschwindigkeitsvergleich der Python-XML-Perspektive
Reversibles Verwürfeln von Ganzzahlen in Python
Einfache Gacha-Logik in Python geschrieben
Code-Tests rund um die Uhr in Python
Analysieren Sie den Quellcode Ihrer eigenen einfachen Suchmaschine, die in Python geschrieben wurde, mit dem Code-Visualisierungstool "SOURCE TRAIL".
Geschwindigkeitsvergleich des Teilens in Python / Janome, Sudachi, Ginza, Mecab, Fugashi, Tinysegmenter
Unterschied zwischen dem exponentiellen gleitenden Durchschnitt (EMA), dem gleitenden Doppelindexdurchschnitt (DEMA) und dem gleitenden Dreifachindexdurchschnitt (TEMA)
Code lesen von faker, einer Bibliothek, die Testdaten in Python generiert
Codelesen von Safe, einer Bibliothek zur Überprüfung der Kennwortstärke in Python
Beispiel für Python-Code für die Exponentialverteilung und die wahrscheinlichste Schätzung (MLE)
Installation von Visual Studio Code und Installation von Python
Konvertierung der Zeichenfolge <-> Datum (Datum, Datum / Uhrzeit) in Python
Stresstest mit Locust in Python geschrieben
Überprüfen Sie das Verhalten des Zerstörers in Python
Umgang mit Zeichencodes von Dateien in IronPython
Übung, dies in Python zu verwenden (schlecht)
Allgemeine Relativitätstheorie in Python: Einführung
Ausgabebaumstruktur von Dateien in Python
Zeigen Sie eine Liste der Alphabete in Python 3 an
Übergangswahrscheinlichkeit der in Python geschriebenen Markov-Kette
Zusammenfassung verschiedener for-Anweisungen in Python
Python-String-Vergleich / benutze 'Liste' und 'In' anstelle von '==' und 'oder'
Trump-Klasse in Python (mit Vergleich)
[Python3] Schreiben Sie das Codeobjekt der Funktion neu