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

2022-12-06

概要

目的

 前回の「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でチャートを描写する」を引き継いでいます。

指数平滑移動平均線(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の式を利用します。

 移動平均の値を正確に表示したい場合は、表示期間より長い(過去の)データを計算に含めるようにしてください。移動平均は過去のデータを利用して算出するためspanに指定した日数以下の日付のデータは正確に計算することができません。

グラフの描写

 グラフの追加はmake_addplot関数を使用します。第一引数にはプロットするデータを格納します。panelは追加したいグラフの位置を表します。今回はチャートのグラフ(0番目)に上書きをしたいのでpanel=0としています。実際の描写ではチャート上に上書きしたいグラフをリストで渡します。

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

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

mpf.plot(df, 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を描写する」に進んでください。