初投稿ですが、いきなり本題に入ります。
最近、MetaTrder5(MT5)のテクニカル指標関数をPythonで実装してみました。→GitHub
MT5では、移動平均の種類に、SMA, EMA, SMMA, LWMAとあるのですが、SMA(単純移動平均)は、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()
LWMA(線形加重移動平均)も簡単に書けるメソッド関数ないか探したんですが、わからなかったので、そのまま計算してました。
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
でも、もっと簡単に書きたかったので、調べたところ、scipyの信号処理関連のモジュールにlfilter()というフィルタ関数がありました。これは、FIRフィルタ、IIRフィルタどちらにも対応しているようで、これを使うとこんな感じで書けました。
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)
これでちょっとすっきりしました。