Dies ist mein erster Beitrag, aber ich werde plötzlich auf das Hauptthema eingehen. Kürzlich habe ich versucht, die technische Indexfunktion von MetaTrder5 (MT5) in Python zu implementieren. → GitHub
In MT5 gibt es SMA, EMA, SMMA, LWMA als Arten des gleitenden Durchschnitts, aber SMA (einfacher gleitender Durchschnitt) war mit Pandas leicht zu schreiben.
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()
Ich suchte nach einer Methodenfunktion, die leicht LWMA (Linear Weighted Moving Average) schreiben kann, aber ich wusste es nicht, also berechnete ich es so wie es war.
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
Ich wollte es jedoch einfacher schreiben, also habe ich es nachgeschlagen und festgestellt, dass das Modul zur Signalverarbeitung von scipy lfilter () war. Es gab eine Filterfunktion namens lfilter.html # scipy.signal.lfilter). Dies scheint sowohl mit dem FIR-Filter als auch mit dem IIR-Filter kompatibel zu sein, und ich könnte es so schreiben.
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)
Dies machte es ein wenig sauberer.