EMA(指数平滑移動平均)の使い方や計算方法。Pythonを使ってEMAを計算してみよう。
こんばんは、新米データサイエンティスト(@algon_fx)です。今日もしっかりジムに行けて、7.3km走ってきました。気づいたら4月も中旬で、あっという間に今月も終わってしまいますね。もっとペースを早く勉強をしなくてはですね。
さて、今日も特徴量としてのテクニカル指標シリーズとして、「EMA(指数平滑移動平均)」をPythonを使って計算してみます。EMAは以前にPythonで書いた単純移動平均の兄弟分ですね。参考までにですが、EMAはExponential Moving Averageと呼ばれています。
では、早速、EMAをPythonで書いてみましょう!
【人気記事】
EMA(指数移動平滑平均)とは?
単純移動平均(Simple Moving Average)では、「単純」に所定の期間の為替レートの平均値を計算しました。例えば50分単純移動平均では、50分間のレートの価格を「平等に」扱って計算をしましたよね?
では、ここで一つ考えてみてください。
50分前の為替レートと1分前のレートがあったとして、どちらが「現在のレート」に対して重視した方が良いでしょうか?パッと考えてみても、やはり直近のレートの方を重視して、50分前の影響力は低めにしたいですよね?
この考えがEMA(指数移動平滑平均)の考え方です。分かりやすい!そしてこういう考え方、好き!では、このEMAですが、為替レートからどのように計算をすれば良いのかをみていきましょう。
EMAの計算方法
もはや名前を見たらそれとなく計算式も浮かびそうですが、想像通り「Exponential(指数)」的に為替レートを「減少」させて平均値を計算します。
単純移動平均(SMA)と指数平滑移動平均(EMA)の計算の違いをみて見ましょう。
SMAは単純に全ての時間のレートを「平等」に対して平均値を求めるので、下記の計算式で求めることが可能です。(レートの期間を分とした場合)
SMA =(2分前終値+1分前終値+現在終値)÷ 3分
*移動平均の期間を3分とした場合
では、指数平滑移動平均ではどのような計算をするのか?下記の式がEMAの計算式となっています。ちょっと一見複雑な計算式に見えますが、期間のnとαの計算のみ分かれば、特に問題ないですよね。(レートの期間を分とした場合)
EMA = 1分前のEMA+α(現在の終値-1分前のEMA)
*移動平均の期間をn
*α=2÷(n+1)
EMAの使い方
EMAですが、基本的な使い方はSMAと大きく違いはありません。ただし、計算方法で見てわかった通り、EMAは直近の価格に比重を置いて計算をしているため、SMAに比べて直近の値動きに敏感!EMAを使う時は非常に重要なポイントかと思うので、しっかり理解をしておきましょう。
下記のチャートですが、1分足のドル円に対して9分期間のEMA(赤)と26分期間のEMA(緑)を表示させています。
青矢印のポイントですが、短期(赤色EMA9)が長期(緑色EMA26)を上から下へ突き破っていますね。このようなポイントは売りシグナルで、いわゆる「デッドクロス」です。
対して赤色矢印では逆に短期(赤EMA9)が長期(緑色EMA26)を下から上へ突き破っている=ゴールデンクロス(買いサイン)が出ています。
SMAとEMAの交差ポイント後の為替レートの値動きの比較をいつかやってみようかと思います。また移動平均がハマる期間(一般的には9と26)も検証してみたい。
では、最後にいよいよPythonを使ってEMAを書いて見ましょう。
EMAをPythonのPandasとNumpyで書いてみる
今回も前回のボリンジャーバンドで使ったドル円のデータセットを使って、EMAを書いてみましょう。データセットの取得方法はこちらの記事をご参照ください。
では、指数平滑移動平均(EMA)の計算をしてみましょう。今回ですが、PandasとNumpyを使います。まずはライブありを読み込む。(使わないのもあるので、適宜、
1 2 3 4 5 6 7 |
#ライブラリ import pandas as pd import numpy as np import matplotlib.pyplot as plt |
んでおきまりの USD_JPY_Week2.csv を読み込んで処理してあげましょう。ファイルは上のリンクで生成が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ドル円のレートをCSVからデータフレーム変換 # ティックから1分足へ変更してあげる df = pd.read_csv('USD_JPY_Week2.csv', index_col='DateTime', names=['Tid', 'Dealable', 'Pair', 'DateTime', 'Buy', 'Sell'], skiprows=1) df.index = pd.to_datetime(df.index) del df['Tid'] del df['Dealable'] del df['Pair'] min_1 = df.resample('1Min', how='ohlc') buy_1min = min_1.xs('Buy', axis=1, drop_level=True) buy_1min_s = buy_1min[0:100] buy_1min_s = buy_1min_s.fillna(method='ffill') |
次はいよいよEMAです。EMAですが、Pandasの ewm() の関数に span として期間を指定してあげて、 mean() を使って平均をとります。
1 2 3 4 5 6 |
ema = pd.DataFrame() ema['close'] = buy_1min_s['close'] ema['ema_26'] = buy_1min_s['close'].ewm(span=26).mean() ema['ema_9'] = buy_1min_s['close'].ewm(span=9).mean() |
では、Pandasの plot() で簡単に確認して見ましょう。
ちゃんとEMAのショート9とロング26が表示されていますね!
まとめと次へ
さて、今回は指数平滑移動平均(EMA)の概要と基本的な使い方、さらにPandasとNumpyを使ってEMA9とEMA26の計算をしてみました。
記事内には載せていないのですが、Ta-LibでもEMAを計算して確認して見た所…なぜか数値が若干ことなっており…上で計算したPandasのやり方が正しいか要検証が必要そうです。
海外のサイトで調べて見たら、どうやら同様の現象が起きているのが確認できたので、ひょっとするとTa-LibのEMAは少し特殊な計算方法を用いている可能性もありますね。
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません