J'ai comparé le temps de calcul de la moyenne mobile écrite en Python

Article précédent Implémentez le LWMA de MetaTrader avec la fonction de filtre FIR de scipy Donc, j'ai essayé de réécrire LWMA (Linear Weighted Moving Average) avec la fonction lfilter (), mais je ne suis pas reconnaissant que cela soit juste, j'ai donc comparé le temps de calcul.

Je pensais qu'il n'y aurait pas beaucoup de différence comme prévu, alors j'ai essayé d'ajouter un peu plus de données de séries chronologiques pour prendre la moyenne mobile. J'ai lu les données d'une minute pour un an d'EUR / USD en me référant à ce qui suit (mon article de blog).

Lire les données historiques FX avec Python

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)

Il y a environ 370 000 chacun des prix d'ouverture, prix élevé, prix bas et prix de clôture.

Comparaison de LWMA

J'ai essayé d'utiliser la commande % time dans le bloc-notes Jupyter pour mesurer le temps. Tout d'abord, l'ancienne version de LWMA. Calculez la sortie un par un.

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)

Par conséquent

Wall time: 3min 35s

Quelles trois minutes et demie. Même s'il y a beaucoup de données, cela coûte 370000 tellement, n'est-il pas possible d'utiliser Python? .. ..

Jetez un second coup d'œil et testez une nouvelle version de LWMA. Utilisation de la fonction de filtre de 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)

Par conséquent

Wall time: 6 ms

Quoi! 6 millisecondes. Est-ce 35 000 fois plus rapide? L'original est-il trop tard? Vous pouvez utiliser scipy.

Au fait, si vous l'exécutez avec % timeit au lieu de% time,

100 loops, best of 3: 3.4 ms per loop

Terminé en 1 seconde même si exécuté 100 fois. Il semble qu'il puisse être exécuté en environ 3 millisecondes lorsqu'il est rapide.

Comparaison SMA

Puisque scipy est rapide, je l'ai comparé à la fonction pandas. SMA peut être écrit comme une fonction de méthode des pandas comme suit.

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

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

Par conséquent

100 loops, best of 3: 16 ms per loop

Exécutez 100 fois et c'est rapide en 16 millisecondes. C'est assez rapide. Maintenant, écrivons ceci en utilisant la fonction de filtre de 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)

Par conséquent

100 loops, best of 3: 3.44 ms per loop

vite. Environ 5 fois plus que les pandas. Après tout, scipy est rapide, il peut donc être préférable de réécrire d'autres moyennes mobiles en utilisant lfilter ().

Recommended Posts

J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
Comparaison du code de moyenne mobile exponentielle (EMA) écrit en Python
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
Découvrez la bonne efficacité de calcul de la vectorisation en Python
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
J'ai comparé la moyenne mobile du type de filtre IIR avec les pandas et scipy
J'ai comparé la vitesse de la référence du python dans la liste et la référence de l'inclusion du dictionnaire faite à partir de la liste dans.
J'ai étudié le temps de calcul de "X dans la liste" (recherche linéaire / recherche dichotomique) et "X dans l'ensemble"
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
J'ai écrit le code pour écrire le code Brainf * ck en python
Une fonction qui mesure le temps de traitement d'une méthode en python
Je ne connaissais pas les bases de Python
Le résultat de l'installation de python sur Anaconda
Calcul de la moyenne avant (temps de sommeil Piyolog)
MongoDB avec Python pour la première fois
Principes de base pour exécuter NoxPlayer en Python
Le modèle de projet Python auquel je pense.
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
À la recherche du FizzBuzz le plus rapide en Python
Comparaison temporelle: calcul du coefficient de corrélation en Python
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
À propos du code Python pour une moyenne mobile simple en supposant l'utilisation de Numba
Obtenez une instance datetime à tout moment de la journée en Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Sortie du nombre de cœurs de processeur en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Résultat du calcul après la virgule décimale en Python
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé la méthode des moindres carrés en Python
Copiez la liste en Python
J'ai essayé la programmation python pour la première fois.
Lire la sortie du sous-processus, ouvrir en temps réel
Découvrez la fraction de la valeur saisie en python
Essayez Progate Free Edition [Python I]
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
J'ai essayé d'implémenter la fonction gamma inverse en python
Au moment de la mise à jour de python avec ubuntu
Je veux afficher la progression en Python!
[Examen d'ingénieur d'information de base] J'ai écrit l'algorithme de la méthode de division mutuelle euclidienne en Python.
J'ai comparé la vitesse de l'écho du framework web en langage go et du flask du framework web python
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Obtenir l'heure Unix de l'heure spécifiée par JST quel que soit le fuseau horaire du serveur avec Python
Ce que j'ai fait quand je suis resté coincé dans le délai avec lambda python
Je souhaite stocker les résultats de% time, %% time, etc. dans un objet (variable)
Partie 1 J'ai écrit un exemple de la réponse au problème de référence de l'écriture hors ligne en temps réel en Python