【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')

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です