mplfinanceで指数平滑移動平均線(EMA)を描写する

2021-09-22

 前回の「mplfinanceでSBI証券Likeなチャートを記載してみる」の続きで、次は指数移動平均線(EMA)を描写してみたいと思います。

 指数移動平均線の説明はMoney Planers様のサイトに詳細が載っています。一応、簡単に説明すると平均線には大きく3つの種類があります。

  • 単純移動平均線
  • 加重移動平均線
  • 指数平滑移動平均線

 一般的にデフォルト表示されている平均線は「単純移動平均線」と呼ばれるもので過去のデータとの平均をとっています。しかし単純にデータの平均をとっただけなので、過去のデータが一つ抜け落ちたときの影響度がとても多くなります。
 例えば5日間単純移動平均を求めてみます。5日間のデータが100, 9, 3, 2, 1だったとすると単純移動平均は

$$\frac{100 + 9 + 4 + 4 + 3}{5}=120$$

となります。次の日のデータが5だったとすると

$$\frac{9 + 4 + 4 + 3 + 5}{5}=5$$

となり、6日前のデータの100の影響度がとても大きいことが分かります。
 もし皆さんが「次の日のデータを予測してほしい」と言われたらいくつだと予測するでしょうか?
おそらく「1~5」あたりのデータを予測されるのではないかと思います。なぜなら、過去のデータより直近のデータのほうが次の日に与える影響が大きいと考えるからです。
 そこで、この問題を解決するために各データに重みを付けたのが「指数平滑平均移動線」です。重みは直近のデータほど大きくなります。

単純移動平均線を描写する

 こちらに関しては、mplfinanceにmav関数が実装されています。試しに5日間と10日間の「単純移動平均線」を描写してみます。
 青が5日間、オレンジが10日間の単純移動平均線を表しています。

※plotのスタイルについては、「mplfinanceでSBI証券Likeなチャートを記載してみる」を引き継いでいます。

mpf.plot(df[datefrom:], type='candle', volume=True, mav=(5, 10), datetime_format='%Y/%m/%d', figsize=(9,5), 
         style=cs, width_adjuster_version='v0', xrotation=False, ylabel='', ylabel_lower='')

 引数に値を入れるだけで描写できるなんて便利ですね。デフォルトでこのような機能を実装してくれているのはありがたいですね。

指数平滑移動平均線(EMA)を描写する

 次に「指数平滑移動平均線」を描写してみます。指数平滑移動平均線ですが、描写をする前にデータを算出する必要があります。計算は、pandasにデフォルトでewm関数が用意されていますのでそちらを使用します。

ema5 = df['close'].ewm(span=5, adjust=False).mean()
ema10 = df['close'].ewm(span=10, adjust=False).mean()

 spanには何日間のデータを計算するかを入力します。次のadjustですが、True(default)とFalseによって計算式が異なります。

Trueの場合
$$y_{t}=\frac{x_{t}+(1-\alpha)x_{t-1}+(1-\alpha)^2x_{t-2}+…+(1-\alpha)^tx_{0}}{1+(1-\alpha)+(1-\alpha)^2+…+(1-\alpha)^t}$$

Falseの場合
$$\displaylines{y_{0}=x_{0} \\
y_{t}=(1-\alpha)y_{t-1}+\alpha x_{t}}$$

$y_{0}$には単純移動平均ではなく$x_{0}$を入力していますが、それ以外は本来の指数平滑移動平均と同様の式になっています。今回は比較的計算結果が近いadjust=Falseの式を利用します。

 次にグラフの描写をしていきます。グラフの描写はmake_addplot関数を使用して、チャートのグラフ上に上書きをしていきます。

 まずは上書きをするグラフのリストを作成します。第一引数にはプロットするデータを格納しています。panelは追加したいグラフの位置を表します。今回はチャートのグラフ(0番目)に上書きをしたいのでpanel=0としています。その他のパラメータではSBIのチャートに似せるためにグラフの書式を変更しています。

ema_line  = [
    mpf.make_addplot(ema5[datefrom:], panel=0, color='blue', width=0.7),
    mpf.make_addplot(ema10[datefrom:], panel=0, color='lime', width=0.7)
]

 次に実際に描写をしていきます。先程作ったリストをaddplotの引数として渡すことでグラフを追加できます。

mpf.plot(df[datefrom:], type='candle', volume=True, datetime_format='%Y/%m/%d', figsize=(9,5), 
         style=cs, width_adjuster_version='v0', xrotation=False, ylabel='', ylabel_lower='', addplot=ema_line)

実際にできたグラフがこちらです。

 今回は2つの平均線の描写をしましたが、リスト内の要素を増やすことで平均線の数を増やすことができます。自分の用途に合わせて手軽にグラフのカスタマイズができるのは、自作の強みですね。是非チャレンジしてみてください。

 MACDを描写したい方は「mplfinanceでMACDを描写する」を参照してください。