PythonでMACDを計算・表示する方法【yfinance・pandas】

Uncategorized

※本記事には広告・アフィリエイトリンクが含まれます。掲載内容は筆者の調査・検証に基づき、読者の判断を助ける目的で作成しています。

結論から言うと

  • MACDはpandasのewm().mean()だけで計算できます。外部ライブラリは不要です
  • MACD線・シグナル線・ヒストグラムの3要素をサブプロットに表示することで、売買シグナルが視覚的に把握できる仕組みです
  • MACDはトレンドフォロー系の指標であり、横ばい相場での誤シグナルに注意が必要です

率直に言うと、MACDは複雑に見えますが計算式はシンプルです。EMA12とEMA26の差がMACD線、MACDのEMA9がシグナル線、その差がヒストグラムです。実際にトヨタ(7203.T)で確認したコードを掲載します。

動作確認環境:Python 3.11 / pandas 2.x / yfinance 0.2.x / matplotlib 3.x

MACDとは(計算式を含む)

MACD(Moving Average Convergence Divergence:移動平均収束拡散法)は、2本のEMA(指数平滑移動平均)の差を使ってトレンドの方向・強さ・転換点を分析する指標です。

計算式は以下の通りです。

  • MACD線 = EMA(12) − EMA(26)(12日EMAと26日EMAの差)
  • シグナル線 = MACDのEMA(9)(MACD線の9日EMA)
  • ヒストグラム = MACD線 − シグナル線

EMAはSMA(単純移動平均)と異なり、直近のデータに重みを多く置く計算方式です。そのため移動平均線より反応が早い特性があります。

PythonでMACDを計算するコード

pandasのewm()メソッドを使って計算します。adjust=Falseは一般的なEMA計算(再帰的)に合わせる設定です。

import yfinance as yf
import matplotlib.pyplot as plt

df = yf.download("7203.T", period="1y")

# MACD計算
ema12 = df["Close"].ewm(span=12, adjust=False).mean()
ema26 = df["Close"].ewm(span=26, adjust=False).mean()
df["MACD"] = ema12 - ema26
df["Signal"] = df["MACD"].ewm(span=9, adjust=False).mean()
df["Histogram"] = df["MACD"] - df["Signal"]

print(df[["MACD", "Signal", "Histogram"]].tail(10))

MACDをチャートに表示する

株価チャートとMACDチャートを上下に並べて表示するコードです。subplots()sharex=Trueで日付軸を共有します。

import yfinance as yf
import matplotlib.pyplot as plt

df = yf.download("7203.T", period="1y")

# MACD計算
ema12 = df["Close"].ewm(span=12, adjust=False).mean()
ema26 = df["Close"].ewm(span=26, adjust=False).mean()
df["MACD"] = ema12 - ema26
df["Signal"] = df["MACD"].ewm(span=9, adjust=False).mean()
df["Histogram"] = df["MACD"] - df["Signal"]

# チャート
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)
ax1.plot(df.index, df["Close"], label="終値")
ax1.set_title("トヨタ自動車")
ax1.legend()
ax1.grid(True)

ax2.plot(df.index, df["MACD"], label="MACD", color="blue")
ax2.plot(df.index, df["Signal"], label="Signal", color="orange")
ax2.bar(df.index, df["Histogram"], label="Histogram", color="gray", alpha=0.5)
ax2.axhline(0, color="black", linewidth=0.5)
ax2.set_title("MACD")
ax2.legend()
ax2.grid(True)

plt.tight_layout()
plt.show()

シグナル線とヒストグラムを追加する

ヒストグラムは正値(MACD > シグナル)を青系・負値(MACD < シグナル)を赤系に色分けすると、強弱の変化が直感的に把握できます。

import numpy as np

# ヒストグラムの色分け
colors = np.where(df["Histogram"] >= 0, '#1a5fa8', '#c0392b')

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

ax1.plot(df.index, df["Close"], color="gray", linewidth=1)
ax1.set_title("トヨタ自動車(7203.T)株価")
ax1.grid(True, alpha=0.3)

ax2.plot(df.index, df["MACD"], label="MACD", color="blue", linewidth=1.5)
ax2.plot(df.index, df["Signal"], label="Signal", color="orange", linewidth=1.5)
ax2.bar(df.index, df["Histogram"], color=colors, alpha=0.7, label="Histogram")
ax2.axhline(0, color="black", linewidth=0.8, linestyle="--")
ax2.set_title("MACD")
ax2.legend()
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

MACDで売買シグナルを判定するコード

MACD線がシグナル線を上抜けた日(買いシグナル)・下抜けた日(売りシグナル)を検出するコードです。

import yfinance as yf

df = yf.download("7203.T", period="2y")

ema12 = df["Close"].ewm(span=12, adjust=False).mean()
ema26 = df["Close"].ewm(span=26, adjust=False).mean()
df["MACD"] = ema12 - ema26
df["Signal"] = df["MACD"].ewm(span=9, adjust=False).mean()

# MACD線がシグナル線を上回っているか
df["MACD_above"] = df["MACD"] > df["Signal"]

# クロス検出
df["Buy"] = (df["MACD_above"] == True) & (df["MACD_above"].shift(1) == False)
df["Sell"] = (df["MACD_above"] == False) & (df["MACD_above"].shift(1) == True)

print("買いシグナル発生日:", df[df["Buy"]].index.tolist())
print("売りシグナル発生日:", df[df["Sell"]].index.tolist())

よくある誤りと注意点

  • MACDは遅行指標:EMAを二重にかけているため、価格変動に対して遅れてシグナルが出ます。素早いエントリーには向かない指標です
  • 横ばい相場での誤シグナル:MACDはトレンド相場で機能する指標です。レンジ相場では頻繁にクロスが起きる誤シグナルが増えます
  • span=12,26,9はデフォルト値:これらのパラメータは変更可能です。より短期・長期にカスタマイズして使うこともできます

筆者の検証メモ

トヨタ(7203.T)の1年分のデータでMACDを計算し、シグナル検出まで動作を確認しました。yfinance 0.2.x環境でdf["Close"]がDataFrame形式で返る場合、ewm()の計算結果もDataFrame形式になります。1銘柄のみ取得する場合はdf = yf.download("7203.T", period="1y")["Close"]とSeriesで受け取ると、後続の計算がシンプルになります。また、ソニー(6758.T)・ソフトバンクG(9984.T)でも同じコードが動作することを確認しています。

次のステップ(RSIへ)

MACDの次はRSI(相対力指数)を実装するとよいです。RSIはMACDとは異なりオシレーター系の指標で、過買い・過売りの判定に使われます。MACDとRSIを組み合わせてシグナルを絞り込む使い方が一般的です。

データ取得方法の比較はこちら
yfinance以外のデータ取得手段も含めた比較:Python株価データ取得ライブラリ比較

※当サイトの内容は投資判断を推奨するものではありません。掲載しているコード・分析例は学習・検証目的であり、実際の投資はご自身の責任で行ってください。

🔗 関連記事

PythonでRSIを計算する方法【pandas・yfinance・コードあり】

タイトルとURLをコピーしました