※本記事には広告・アフィリエイトリンクが含まれます。掲載内容は筆者の調査・検証に基づき、読者の判断を助ける目的で作成しています。
結論から言うと
- pandasの
rolling().mean()で移動平均線を計算し、matplotlibで株価チャートに重ねて表示できます - 25日・75日・200日など複数の移動平均線を同時に表示することで、トレンドの強さが視覚的に把握できる仕組みです
- ゴールデンクロス・デッドクロスの検出もpandasのboolean演算で実装できます
率直に言うと、移動平均線は株価分析の基本中の基本です。pandasのrolling()は1行で計算できるため、チャートへの追加はコード量がほとんど増えません。実際にトヨタ(7203.T)のデータで25日・75日移動平均線を確認しました。
動作確認環境:Python 3.11 / pandas 2.x / yfinance 0.2.x / matplotlib 3.x
移動平均線とは(簡単に)
移動平均線(Moving Average)は、直近N日間の終値の平均を日々更新してつないだ線です。株価の短期的なノイズを除去してトレンドを把握するために使われる指標です。
代表的な種類として25日移動平均線(短期)・75日移動平均線(中期)・200日移動平均線(長期)があります。短期線が長期線を上抜けた点をゴールデンクロス(買いシグナル)、下抜けた点をデッドクロス(売りシグナル)と呼ぶ仕組みです。
pandasで移動平均を計算するコード
rolling(window=N).mean()でN日間の単純移動平均が計算できます。
import yfinance as yf
df = yf.download("7203.T", period="1y")
# 移動平均を計算
df["MA25"] = df["Close"].rolling(window=25).mean()
df["MA75"] = df["Close"].rolling(window=75).mean()
df["MA200"] = df["Close"].rolling(window=200).mean()
print(df[["Close", "MA25", "MA75"]].tail(10))
最初のN-1日分はデータが不足するためNaN(欠損値)になります。これは仕様です。
株価チャートに移動平均線を重ねる
基本的な株価チャートに25日・75日移動平均線を追加するコードです。
import yfinance as yf
import matplotlib.pyplot as plt
df = yf.download("7203.T", period="1y")
# 移動平均を計算
df["MA25"] = df["Close"].rolling(window=25).mean()
df["MA75"] = df["Close"].rolling(window=75).mean()
# チャート表示
plt.figure(figsize=(12, 5))
plt.plot(df.index, df["Close"], label="終値", alpha=0.7)
plt.plot(df.index, df["MA25"], label="25日移動平均", linewidth=2)
plt.plot(df.index, df["MA75"], label="75日移動平均", linewidth=2)
plt.title("トヨタ自動車 移動平均線チャート")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
alpha=0.7で終値の折れ線を少し透過させることで、移動平均線が見やすくなります。
25日・75日・200日移動平均線を同時に表示
複数の移動平均線を色分けして表示するコードです。
import yfinance as yf
import matplotlib.pyplot as plt
df = yf.download("7203.T", period="2y")
df["MA25"] = df["Close"].rolling(window=25).mean()
df["MA75"] = df["Close"].rolling(window=75).mean()
df["MA200"] = df["Close"].rolling(window=200).mean()
plt.figure(figsize=(14, 6))
plt.plot(df.index, df["Close"], label="終値", alpha=0.5, color="gray")
plt.plot(df.index, df["MA25"], label="25日MA", linewidth=2, color="blue")
plt.plot(df.index, df["MA75"], label="75日MA", linewidth=2, color="orange")
plt.plot(df.index, df["MA200"], label="200日MA", linewidth=2, color="red")
plt.title("トヨタ自動車 移動平均線チャート(25日・75日・200日)")
plt.xlabel("日付")
plt.ylabel("株価(円)")
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
ゴールデンクロス・デッドクロスを検出するコード
25日移動平均線が75日移動平均線を上抜ける(ゴールデンクロス)・下抜ける(デッドクロス)日付を特定するコードです。
import yfinance as yf
import numpy as np
df = yf.download("7203.T", period="2y")
df["MA25"] = df["Close"].rolling(window=25).mean()
df["MA75"] = df["Close"].rolling(window=75).mean()
# MA25がMA75を上回っているか(True/False)
df["MA25_above"] = df["MA25"] > df["MA75"]
# 前日と当日で状態が変わった日を検出
df["GC"] = (df["MA25_above"] == True) & (df["MA25_above"].shift(1) == False) # ゴールデンクロス
df["DC"] = (df["MA25_above"] == False) & (df["MA25_above"].shift(1) == True) # デッドクロス
print("ゴールデンクロス発生日:")
print(df[df["GC"]].index.tolist())
print("デッドクロス発生日:")
print(df[df["DC"]].index.tolist())
筆者の検証メモ
トヨタ(7203.T)の2年分のデータで25日・75日・200日移動平均線を確認しました。yfinance 0.2.x環境ではdf["Close"]がMultiIndex DataFrameとして返ることがあります。その場合はdf["Close"]["7203.T"]のように列を指定するか、df = df.xs("7203.T", level=1, axis=1)で変換するとrolling()が正常に動作します。
次のステップ(MACDへ)
移動平均線の応用として、EMA(指数平滑移動平均)を使ったMACDが実装できます。MACDは移動平均線より反応が早く、より実用的なトレンドフォローが可能です。
yfinance以外のデータ取得手段も含めた比較:Python株価データ取得ライブラリ比較
※当サイトの内容は投資判断を推奨するものではありません。掲載しているコード・分析例は学習・検証目的であり、実際の投資はご自身の責任で行ってください。

