Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen

Vorheriger Artikel Implementieren Sie MetaTraders LWMA mit der FIR-Filterfunktion von scipy Also habe ich versucht, LWMA (Linear Weighted Moving Average) mit der Funktion "lfilter ()" neu zu schreiben, aber ich bin nicht dankbar, dass es nur ordentlich ist, also habe ich die Berechnungszeit verglichen.

Ich dachte, dass es nicht wie erwartet einen großen Unterschied geben würde, also versuchte ich, ein wenig mehr Zeitreihendaten hinzuzufügen, um den gleitenden Durchschnitt zu ermitteln. Ich habe die 1-Minuten-Daten für ein Jahr EUR / USD unter Bezugnahme auf Folgendes gelesen (mein Blog-Beitrag).

FX-Verlaufsdaten mit Python lesen

import numpy as np
import pandas as pd

dataM1 = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
                     names=('Time','Open','High','Low','Close', ''),
                     index_col='Time', parse_dates=True)

Der Eröffnungspreis, der hohe Preis, der niedrige Preis und der Schlusskurs betragen jeweils etwa 370.000.

Vergleich von LWMA

Ich habe versucht, den Befehl % time im Jupyter-Notizbuch zu verwenden, um die Zeit zu messen. Erstens die ältere Version von LWMA. Berechnen Sie die Ausgabe nacheinander.

def LWMA(s, ma_period):
    y = pd.Series(0.0, index=s.index)
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%time MA = LWMA(dataM1['Close'], 10)

Als Ergebnis

Wall time: 3min 35s

Was für dreieinhalb Minuten. Selbst wenn es viele Daten gibt, kostet es 370.000 so viel, ist es nicht möglich, Python zu verwenden? .. ..

Werfen Sie einen zweiten Blick und testen Sie eine neue Version von LWMA. Verwenden der Filterfunktion von scipy.

from scipy.signal import lfilter
def LWMAnew(s, ma_period):
    h = np.arange(ma_period, 0, -1)*2/ma_period/(ma_period+1)
    y = lfilter(h, 1, s)
    y[:ma_period-1] = 'NaN'
    return pd.Series(y, index=s.index)

%time MA = LWMAnew(dataM1['Close'], 10)

Als Ergebnis

Wall time: 6 ms

Was! 6 Millisekunden. Ist es 35.000 mal schneller? Ist das Original zu spät? Sie können scipy verwenden.

Übrigens, wenn Sie es mit "% timeit" anstelle von "% time" ausführen,

100 loops, best of 3: 3.4 ms per loop

Innerhalb von 1 Sekunde abgeschlossen, auch wenn es 100 Mal ausgeführt wurde. Es scheint, dass es in ungefähr 3 Millisekunden ausgeführt werden kann, wenn es schnell ist.

SMA-Vergleich

Da scipy schnell ist, habe ich es mit der Pandas-Funktion verglichen. SMA kann wie folgt als Methodenfunktion von Pandas geschrieben werden.

def SMA(s, ma_period):
    return s.rolling(ma_period).mean()

%timeit MA = SMA(dataM1['Close'], 10)

Als Ergebnis

100 loops, best of 3: 16 ms per loop

Laufen Sie 100 Mal und es ist schnell in 16 Millisekunden. Es ist ziemlich schnell. Schreiben wir dies nun mit der Filterfunktion von scipy.

def SMAnew(s, ma_period):
    h = np.ones(ma_period)/ma_period
    y = lfilter(h, 1, s)
    y[:ma_period-1] = 'NaN'
    return pd.Series(y, index=s.index)

%timeit MA = SMAnew(dataM1['Close'], 10)

Als Ergebnis

100 loops, best of 3: 3.44 ms per loop

schnell. Etwa fünfmal so viel wie Pandas. Nachdem alle scipy schnell sind, ist es möglicherweise besser, andere gleitende Durchschnitte mit lfilter () neu zu schreiben.

Recommended Posts

Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Erleben Sie die gute Berechnungseffizienz der Vektorisierung in Python
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Ich habe den gleitenden Durchschnitt des IIR-Filtertyps mit Pandas und Scipy verglichen
Ich habe die Geschwindigkeit der Referenz des Pythons in der Liste und die Referenz der Wörterbucheinbeziehung aus der In-Liste verglichen.
Ich habe die Berechnungszeit von "X in Liste" (lineare Suche / dichotome Suche) und "X in Menge" untersucht.
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Ich kannte die Grundlagen von Python nicht
Das Ergebnis der Installation von Python auf Anaconda
Berechnung des Vorwärtsdurchschnitts (Piyolog-Schlafzeit)
MongoDB mit Python zum ersten Mal
Grundlagen zum Ausführen von NoxPlayer in Python
Die Python-Projektvorlage, an die ich denke.
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Auf der Suche nach dem schnellsten FizzBuzz in Python
Zeitvergleich: Berechnung des Korrelationskoeffizienten in Python
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Informationen zu Python-Code für einfachen gleitenden Durchschnitt unter Verwendung von Numba
Holen Sie sich zu jeder Tageszeit eine Datums- / Uhrzeitinstanz in Python
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Geben Sie die Anzahl der CPU-Kerne in Python aus
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Holen Sie sich den Aufrufer einer Funktion in Python
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Berechnungsergebnis nach dem Dezimalpunkt in Python
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Kopieren Sie die Liste in Python
Ich habe zum ersten Mal versucht, Python zu programmieren.
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Probieren Sie Progate Free Edition [Python I]
Ich habe einige der neuen Funktionen von Python 3.8 touched angesprochen
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Ausgabe in Form eines Python-Arrays
Ich habe versucht, die inverse Gammafunktion in Python zu implementieren
Zum Zeitpunkt des Python-Updates mit Ubuntu
Ich möchte den Fortschritt in Python anzeigen!
[Basic Information Engineer Examination] Ich habe den Algorithmus der euklidischen Methode der gegenseitigen Teilung in Python geschrieben.
Ich verglich die Geschwindigkeit von Go Language Web Framework Echo und Python Web Framework Flask
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Abrufen der Unix-Zeit der von JST angegebenen Zeit unabhängig von der Zeitzone des Servers mit Python
Was ich getan habe, als ich mit Lambda Python im Zeitlimit steckte
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
Teil 1 Ich habe ein Beispiel für die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt