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.
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.
Mit anderen Worten, der Parameter von EMA ist in der obigen Formel $ \ alpha $.
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
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.
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