Informationen zu Python-Code für einfachen gleitenden Durchschnitt unter Verwendung von Numba

Die grundlegendsten gleitenden Durchschnitte technischer Indikatoren, von denen der einfache gleitende Durchschnitt (SMA) nur ein Durchschnitt ist, der jedoch zur Berechnung vieler anderer technischer Indikatoren als SMA verwendet wird. Tatsächlich verwenden 40% der rund 30 auf GitHub veröffentlichten technischen Indikatoren SMA.

Dieses Mal möchte ich mich auf diese SMA spezialisieren und Python-Code vergleichen.

Vorbereitung

Da wir den Satz von Python-Paketen aktualisiert haben, lauten die Versionen von Python und die verwendeten Pakete wie folgt.

Als allererstes Zufälliger Spaziergang in Python Machen Sie einen zufälligen Spaziergang von 100.000 Proben, indem Sie sich auf beziehen. Dies sind die Eingabedaten für SMA.

import numpy as np
import pandas as pd
from numba import jit

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

Implementierung von Pandas durch Rollen und Mittel

Die einfachste Implementierung von SMA ist mit Pandas. Es kann einfach mit den Serienmethoden Rolling und Mean geschrieben werden.

def SMA1(x, period):
    return pd.Series(x).rolling(period).mean()

Geben Sie als allgemeine Spezifikation die Eingabezeitreihen und die SMA-Periode in das Argument ein. Da Vergleiche nach der Differenz der Periode durchgeführt werden, messen Sie bei Periode = 20.200.

%timeit y1_20 = SMA1(gwalk, 20)
%timeit y1_200 = SMA1(gwalk, 200)
100 loops, best of 3: 6.02 ms per loop
100 loops, best of 3: 6.01 ms per loop

Bei Pandas scheint es je nach Zeitraum keinen Unterschied in der Ausführungsgeschwindigkeit zu geben.

Implementierung von scipy durch lfilter

Vergleich der Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts Lassen Sie es uns mit der Filterfunktion lfilter von scipy implementieren.

from scipy.signal import lfilter
def SMA2(x, period):
    return lfilter(np.ones(period), 1, x)/period

Lassen Sie uns die Ausführungszeit auf die gleiche Weise messen.

%timeit y2_20 = SMA2(gwalk, 20)
%timeit y2_200 = SMA2(gwalk, 200)
100 loops, best of 3: 5.53 ms per loop
100 loops, best of 3: 10.4 ms per loop

Da lfilter eine universelle Filterfunktion ist, die nicht für SMA vorgesehen ist, scheint sich die Ausführungszeit je nach Zeitraum zu ändern. Kürzere Perioden sind schneller als Pandas, aber längere Perioden sind langsamer.

Umsetzung durch for-Anweisung (1)

Schreiben wir die SMA-Berechnungsformel direkt mit der for-Anweisung. Natürlich ist es offensichtlich, dass es langsam sein wird, wenn es so bleibt, wie es ist. Verwenden Sie, wie der Titel sagt, numba, um es zu beschleunigen.

@jit
def SMA3(x, period):
    y = np.zeros(len(x))
    for i in range(len(y)):
        for j in range(period):
            y[i] += x[i-j]
    return y/period
%timeit y3_20 = SMA3(gwalk, 20)
%timeit y3_200 = SMA3(gwalk, 200)
100 loops, best of 3: 3.07 ms per loop
10 loops, best of 3: 32.3 ms per loop

Ich verwende die for-Anweisung, aber wenn der Zeitraum aufgrund der Beschleunigung von numba 20 beträgt, ist er der bisher schnellste. Da es jedoch proportional zur Periode ist, ist es bei 200 zehnmal langsamer und am langsamsten.

Umsetzung durch for-Anweisung (2)

Die endgültige Implementierung ist eine Methode, die die Eigenschaften von SMA nutzt. Da SMA einfach Stichproben hinzufügt, wird nur berechnet, indem der alte Stichprobenwert subtrahiert und der neue Stichprobenwert unter Verwendung des Berechnungsergebnisses einer Stichprobe zuvor addiert wird.

@jit
def SMA4(x, period):
    y = np.empty(len(x))
    y[:period-1] = np.nan
    y[period-1] = np.sum(x[:period])
    for i in range(period, len(x)):
        y[i] = y[i-1]+x[i]-x[i-period]
    return y/period

Wir werden die Proben hinzufügen, bis die Proben für den Zeitraum bereit sind, aber danach müssen wir nur noch drei Daten hinzufügen. Die Ausführungsgeschwindigkeit ist wie folgt.

%timeit y4_20 = SMA4(gwalk, 20)
%timeit y4_200 = SMA4(gwalk, 200)
1 loop, best of 3: 727 µs per loop
1000 loops, best of 3: 780 µs per loop

Es hat das schnellste Ergebnis aller bisherigen Implementierungen. Das Ergebnis war fast das gleiche, auch wenn der Zeitraum verlängert wurde.

Wie oben erwähnt, wurde unter der Annahme der Beschleunigung durch numba festgestellt, dass die Geschwindigkeit von SMA ziemlich hoch ist, selbst wenn die for-Anweisung verwendet wird.

Recommended Posts

Informationen zu Python-Code für einfachen gleitenden Durchschnitt unter Verwendung von Numba
Code zum Überprüfen des Betriebs von Python Matplot lib
Über die Funktionen von Python
Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)
Informationen zur Grundlagenliste der Python-Grundlagen
Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Informationen zur virtuellen Umgebung von Python Version 3.7
[Python3] Schreiben Sie das Codeobjekt der Funktion neu
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
[Python] Ruft den Zeichencode der Datei ab
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 6 Verbessern Sie den Python-Code
[Python] Lesen Sie den Quellcode von Flasche Teil 2
Die Geschichte, dass die Lernkosten von Python niedrig sind
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
[Python] Lesen Sie den Quellcode von Flasche Teil 1
Bildverarbeitung? Die Geschichte, Python für zu starten
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Konvertieren Sie den Zeichencode der Datei mit Python3
[Python] Berechnen Sie den Durchschnittswert des Pixelwerts RGB des Objekts
Lassen Sie uns die Grundlagen des Python-Codes von TensorFlow aufschlüsseln
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
Berechnen Sie den Regressionskoeffizienten der einfachen Regressionsanalyse mit Python
Verwenden wir die Python-Version des Confluence-API-Moduls.
Verwenden wir die offenen Daten von "Mamebus" in Python
[Python] Verwenden Sie die Face-API von Microsoft Cognitive Services
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Python-Memo (für mich): Über die Entwicklungsumgebung virtualenv
[Python] Code zur Messung des Umgebungslichts RGB von APDS9960
Super einfacher Fall k-means Methode Python-Code
Über Python für Schleife
der Zen von Python
Über Python für ~ (Bereich)
Verwenden Sie Hash, um das Kollisionsurteil von etwa 1000 Bällen in Python zu erleichtern (im Zusammenhang mit dem neuen Corona-Virus).
Erfahrene Leute, die hauptsächlich PHP verwenden, sprechen über den 4. Tag des Startens von Python (Unterprozess)
Eine einfache Python-Implementierung der k-Neighborhood-Methode (k-NN)
Aktivieren Sie die virtuelle Python-Umgebung von virtualenv für Visual Studio Code
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
Berücksichtigung von Python-Dekoratoren des Typs, der Variablen übergibt
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Ich habe gerade das Originalmaterial für den Python-Beispielcode geschrieben
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden
[Python] Die größten Schwächen und Nachteile von Google Colaboratory [Für Anfänger]
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Erfahrene Leute, die hauptsächlich PHP verwenden, sprechen über den 5. Tag nach dem Start von Python (Selen) PHP gegen Python
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
Fabric unterstützt Python 3
Über das Python-Modul venv
Erläutern Sie den Code von Tensorflow_in_ROS
Über die Aufzählungsfunktion (Python)
Persönliches Python-Code-Memo
Über verschiedene Codierungen von Python 3
2.x, 3.x Serienzeichencode von Python