珍しくやる気になってるので、鉄は熱いうちにという訳で今回は MACD の計算でつ。長短2本の指数平滑移動平均の差分をとり、さらにその移動平均をとったものとの差分が売買シグナルになるというオシレータ系の指標です。個人的にはどうも意味合いというか使い所がイメージできないのですが、一般的には広く利用されているポピュラーな手法ですね。
株価データは前回同様に日経平均プロフィルさんの日経平均日足データ CSV を使うのでコードは割愛。
前回書いた指数平滑移動平均計算関数を流用しつつ、MACD の計算はこんな感じ。
# 指数平滑移動平均計算 def calc_ema(prices, period): ema = np.zeros(len(prices)) ema[:] = np.nan # NaN で初期化 ema[period-1] = prices[:period].mean() # 最初だけ単純移動平均 for d in range(period, len(prices)): ema[d] = ema[d-1] + (prices[d] - ema[d-1]) / (period + 1) * 2 return ema # MACD 計算 def calc_macd(prices, period_short, period_long, period_signal): ema_short = calc_ema(prices, period_short) ema_long = calc_ema(prices, period_long) macd = ema_short - ema_long # MACD = 短期移動平均 - 長期移動平均 signal = pd.Series(macd).rolling(period_signal).mean() # シグナル = MACD の移動平均 hist = macd - signal # ヒストグラム return macd, signal, hist df['macd'], df['signal'], df['hist'] = calc_macd(df.close, 12, 26, 9)
MACD とシグナルの差分をとってヒストグラムとします。一般的にはこいつがプラスに転じれば買いサイン、マイナスに転じれば売りサイン、という訳ですな。株価、MACD とシグナル、ヒストグラムの順に可視化したグラフがこんな感じです。
今回も、コード一式と実行結果は Google Colaboratory で公開しておきます(↓)。