[PYTHON] Essayez d'implémenter le LWMA de MetaTrader avec la fonction de filtre FIR de scipy

C'est mon premier article, mais je vais tout à coup entrer dans le sujet principal. Récemment, j'ai essayé d'implémenter la fonction d'index technique de MetaTrder5 (MT5) en Python. → GitHub

Dans MT5, il y a SMA, EMA, SMMA, LWMA comme types de moyenne mobile, mais SMA (moyenne mobile simple) était facile à écrire à l'aide de pandas.

import numpy as np
import pandas as pd
def MAonSeries(s, ma_period, ma_method):
    if ma_method == 'SMA':    
    return s.rolling(ma_period).mean()

Je cherchais une fonction de méthode qui pourrait facilement écrire LWMA (Linear Weighted Moving Average), mais je ne savais pas, donc je l'ai calculée telle quelle.

def MAonSeries(s, ma_period, ma_method):
    if ma_method == 'LWMA':
        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

Mais je voulais l'écrire plus facilement, alors je l'ai recherché et j'ai trouvé que [lfilter ()](http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal. Il y avait une fonction de filtre appelée lfilter.html # scipy.signal.lfilter). Cela semble être compatible avec le filtre FIR et le filtre IIR, et je pourrais l'écrire comme ça en utilisant ceci.

from scipy.signal import lfilter    
def MAonSeries(s, ma_period, ma_method):
    if ma_method == 'LWMA':
        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)

Cela l'a rendu un peu plus propre.

Recommended Posts

Essayez d'implémenter le LWMA de MetaTrader avec la fonction de filtre FIR de scipy
Essayez l'optimisation des fonctions avec Optuna
Essayez d'implémenter RBM avec chainer.
Essayez d'implémenter XOR avec PyTorch