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.