テクニカルで何かと必要になる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 def SMA(data, n): i=0 result = 0 sum=0 max = len(data) - 1 chk = int(max) - int(n) for i in range(chk,max): sum += data[i] result = float(sum / n) return result |
EMA(指数平滑移動平均)
Exponential Moving Average(指数平滑移動平均)。MACDを算出する際に使ったり結構多用します。
過去よりも現在の方が影響が強いという考えを入れた移動平均値で、現在に近いレートほど重みをつけて計算します。
計算式は
こちらのサイトによると
最初の日の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 def EMA(data, n): i=0 chk_1=0 chk_1_sum=0 et_1=0 result = [] for p in data: i = len(result) if i <= (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))] return result[-1] |
たぶん合ってると思う。
ご質問はコメント欄からお願いします