LoginSignup
9
14

More than 5 years have passed since last update.

MetaTraderのLWMAをscipyのFIRフィルタ関数で実装してみる

Posted at

初投稿ですが、いきなり本題に入ります。
最近、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)

これでちょっとすっきりしました。

9
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
14