テクニカルで何かと必要になるSMA(単純移動平均線)、EMA(指数平滑移動平均線)。
MT4、MT5などでは関数が用意されているのですぐに使えますが、Pythonはそうはいかないです。。
pandasをインポートすれば使えるものもありますが、バージョンに左右されるので、ちょっとって思って1からコーディングしてみた。
SMA(単純移動平均)
英語ではSimple Moving Average。頭文字をとってSMAと呼びます。トレンドを見る上で多用されます。
アルゴリズムは簡単で、全てのデータの平均値を計算するだけ。
SMAのPythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # # SMA # data : list # n : period defSMA(data,n): i=0 result=0 sum=0 max=len(data)-1 chk=int(max)-int(n) foriinrange(chk,max): sum+=data[i] result=float(sum/n) returnresult |
EMA(指数平滑移動平均)
Exponential Moving Average(指数平滑移動平均)。MACDを算出する際に使ったり結構多用します。
過去よりも現在の方が影響が強いという考えを入れた移動平均値で、現在に近いレートほど重みをつけて計算します。
計算式は
E(t) = E(t-1) + 2/(n+1)(直近の終値 – E(t-1))
こちらのサイトによると
最初の日のEMAはSMAを使うなどルールがあってややこしいです。
これをコードに起こすと
EMAのPythonコード
n-1番目の要素は、SMAを算出する必要があるので、そこが肝かな。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # # EMA # data : price list # n : period defEMA(data,n): i=0 chk_1=0 chk_1_sum=0 et_1=0 result=[] forpindata: i=len(result) ifi<=(n-1): #SMA chk_1_sum=sum(result) chk_1=(float(chk_1_sum)+float(p))/(i+1) result+=[chk_1] else: #EMA et_1=result[-1] result+=[float(et_1+2/(n+1)*(float(p)-et_1))] returnresult[-1] |
たぶん合ってると思う。
コメント