【Pythonテクニカル分析】MACDの計算方法
平滑平均を用いるMACDをPythonで計算する方法について記載していきます。pythonではテクニカル分析を行えるライブラリであるtalibがあり、これを使用してMACDを算出することもできますが、今回はこれを使用せずに自分で計算式を記述してMACDを算出する方法で実施します。
MACDの式
MACDは平滑平均同士の引算によって計算します。
\( MACD = 終値の12日平滑平均 – 終値の26日の平滑平均 \)
また売買シグナルとオシレーターは次のように計算されます。
\( Signal = 9日間のMACDの移動平均 \)
\( Oscillator = MACD – Signal \)
この式に基づいてPythonのコードを考えていきます。
MACD計算のPythonコード
まずは株価データを取得していきます。今回もいつもと同じく日経データを用います
# ライブラリの読み込み
import pandas_datareader as pdr
from datetime import datetime, timedelta
import mplfinance as mpf
import pandas as pd
# データ取得期間設定
current_date = datetime.now()
two_years_ago = current_date - timedelta(days=365) # 1年前を設定
formatted_date = two_years_ago.strftime("%Y-%m-%d")
df = pdr.DataReader('^NKX', 'stooq',start=formatted_date) # データの取得
df.sort_values('Date', inplace=True) # 日付順にソート
次に指数荷重平均を計算していきます。指数加重平均にはpandasのewmメソッドを使用します。ewmメソッドの使い方についはこちらで紹介しています。
【Python】pandas DataFrameによる指数荷重計算 – Obenkyolab
def ema(df,span):
EMA = df['Close'].ewm(span=span, adjust=False).mean()
return EMA
macd = ema(df, 12) - ema(df, 26)
signal = macd.rolling(12).mean()
oscillator = macd - signal
最後に結果を描画していきます。
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(df['Close'], label='Close')
ax1.legend()
ax2 = ax1.twinx()
ax2.plot(SIGNAL,color='green',label='signal')
ax2.plot(oscillator, color='orange',label='ocsillator')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, loc='upper left')
以上のように日々の終値とMACDシグナル、オシレーターを計算して描画することができました。
以下はコード全文になります。
# ライブラリの読み込み
import pandas_datareader as pdr
from datetime import datetime, timedelta
import mplfinance as mpf
import pandas as pd
import matplotlib.pyplot as plt
# MACD計算のための関数定義
def ema(df,span):
EMA = df['Close'].ewm(span=span, adjust=False).mean()
return EMA
# データ取得期間設定
current_date = datetime.now()
two_years_ago = current_date - timedelta(days=365) # 1年前を設定
formatted_date = two_years_ago.strftime("%Y-%m-%d")
df = pdr.DataReader('^NKX', 'stooq',start=formatted_date) # データの取得
df.sort_values('Date', inplace=True) # 日付順にソート
# MACDシグナルとオシレーター計算
macd = ema(df, 12) - ema(df, 26)
signal = macd.rolling(12).mean()
oscillator = macd - signal
# 結果の描画
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(df['Close'], label='Close')
ax1.legend()
ax2 = ax1.twinx()
ax2.plot(SIGNAL,color='green',label='signal')
ax2.plot(oscillator, color='orange',label='ocsillator')
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1+h2, l1+l2, loc='upper left')