【Python】移動平均線(25日・75日)の作り方と使い方

株価分析を行う中で、「今は上昇トレンドなのか?それとも下降トレンドなのか?」と迷ったことはありませんか?日々の株価は上下を繰り返すため、短期的な値動きだけを見て判断するのは難しいものです。

そこで役立つのがテクニカル分析の王道「移動平均線」です。
この記事では下のことをわかりやすく解説します。

  • 移動平均線の基本
  • Pythonでの実装方法
  • 実際の使い方
目次

移動平均線とは

移動平均線(Moving Average)は、一定期間の価格(主に終値)の平均値を繋ぎ合わせた、トレンド分析で最も一般的なテクニカル指標です。

相場の方向性(上昇・下降・横ばい)を一目で把握でき、代表的な売買シグナルである「ゴールデンクロス」「デッドクロス」にも使われます。

この記事では下の2つを扱います。

  • 25日移動平均線 :短期トレンド(約1ヶ月)
  • 75日移動平均線 :中期トレンド(約3ヶ月)

注意点

移動平均線は便利ですが、万能ではありません。下の点に注意しましょう。

  • レンジ相場ではダマシが多い
  • 単体では精度が低い
  • 必ず他の指標と組み合わせる

Pythonで移動平均線を計算する

Pandasの「rolling()」メソッドを使った実装例を紹介します。
今回はトヨタ自動車(7203.T)の株価を使用して確認してみます。

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# 移動平均線の計算
def calculate_ma(df, window):
    return df["Close"].rolling(window=window).mean()

if __name__ == "__main__":

    # トヨタ自動車の証券コード+「.T」
    ticker = "7203.T"

    # Tickerオブジェクトを作成
    toyota = yf.Ticker(ticker)

    # periodを使って過去6ヶ月分のデータを取得
    df = toyota.history(period='6mo')

    # 25日・75日移動平均線の計算
    df["ma25"] = calculate_ma(df, 25)
    df["ma75"] = calculate_ma(df, 75)

    # ゴールデンクロス
    df["golden_cross"] = (
        (df["ma25"] > df["ma75"]) &
        (df["ma25"].shift(1) <= df["ma75"].shift(1))
    )

    # デッドクロス
    df["dead_cross"] = (
        (df["ma25"] < df["ma75"]) &
        (df["ma25"].shift(1) >= df["ma75"].shift(1))
    )

    # 計算できない行を削除する
    df = df.dropna()

    # 取得したデータを出力
    print(df)

  # グラフ表示
    plt.figure(figsize=(12,6))

    plt.plot(df["Close"], label="Close")
    plt.plot(df["ma25"], label="MA25")
    plt.plot(df["ma75"], label="MA75")

    plt.legend()
    plt.title("Moving Average")
    plt.show()

実行結果:

                                  Open         High          Low        Close    Volume  Dividends  Stock Splits         ma25         ma75  golden_cross  dead_cross
Date                                                                                                                                                                
2026-02-06 00:00:00+09:00  3615.170758  3737.351509  3583.640242  3724.542236  42812900        0.0           0.0  3482.033105  3239.990404         False       False
・・・
2026-03-30 00:00:00+09:00  3204.000000  3237.000000  3168.000000  3224.000000  30941700       50.0           0.0  3443.171895  3433.068880         False       False
2026-03-31 00:00:00+09:00  3200.000000  3252.000000  3162.000000  3162.000000  26872400        0.0           0.0  3426.385117  3435.395329         False        True
2026-04-01 00:00:00+09:00  3280.000000  3311.000000  3253.000000  3311.000000  25388600        0.0           0.0  3414.730664  3439.340589         False       False
・・・
2026-04-16 00:00:00+09:00  3416.000000  3468.000000  3392.000000  3392.000000  20154600        0.0           0.0  3302.482139  3449.496077         False       False
2026-04-17 00:00:00+09:00  3400.000000  3400.000000  3343.000000  3343.000000  14251500        0.0           0.0  3299.556768  3450.018652         False       False

グラフ表示:

コード解説

ライブラリのインポート

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

株価データの取得や分析、グラフ表示に必要なライブラリを読み込んでいます。下の3つで「取得・加工・可視化」ができるようになります。

  • yfinance:株価データを取得するためのライブラリ(Yahoo Financeから取得)
  • pandas:データを表形式(DataFrame)で扱うためのライブラリ
  • matplotlib.pyplot:グラフを描画するためのライブラリ

株価データ取得

ticker = "7203.T"
toyota = yf.Ticker(ticker)
df = toyota.history(period='6mo')

ここでは、例にトヨタ自動車(7203.T)の株価データを取得しています。

  • “7203.T”:日本株の場合は「証券コード + .T」を指定
  • yf.Ticker():銘柄情報を扱うオブジェクトを作成
  • history(period=’6mo’):過去6ヶ月分の株価データを取得

株価データの取得は下の記事で詳しく説明しているから参考にしてね

移動平均線の関数化

def calculate_ma(df, window):
    return df["Close"].rolling(window=window).mean()

移動平均線を計算する処理を関数として定義しています。
関数化することで、25日・75日以外にも簡単に応用できます。

  • df[“Close”]:終値(株価)を使用
  • rolling(window=window):指定した日数分のデータをまとめる
  • mean():その平均値を計算

25日・75日移動平均線の計算

df["ma25"] = calculate_ma(df, 25)
df["ma75"] = calculate_ma(df, 75)

ここでは、先ほど作成した関数を使って移動平均線を計算しています。

  • ma25:25日移動平均線
  • ma75:75日移動平均線

ゴールデンクロスの確認

df["golden_cross"] = (
    (df["ma25"] > df["ma75"]) &
    (df["ma25"].shift(1) <= df["ma75"].shift(1))
)

ゴールデンクロスを検出しています。条件は下の2つです。
shift(1)を使って「1日前の状態」を参照し、「昨日は短期が長期の下だったが、今日は上にある」という現象を論理演算(&)で判定しています。

  • 今日:ma25 > ma75(短期線が上)
  • 昨日:ma25 <= ma75(まだ下だった)

デッドクロスの確認

df["dead_cross"] = (
    (df["ma25"] < df["ma75"]) &
    (df["ma25"].shift(1) >= df["ma75"].shift(1))
)

デッドクロスを検出しています。条件はゴールデンクロスの逆になります。
「昨日は短期が長期の上だったが、今日は下抜けた」瞬間を捉えます。

  • 今日:ma25 < ma75
  • 昨日:ma25 >= ma75

グラフで可視化

    plt.figure(figsize=(12,6))

    plt.plot(df["Close"], label="Close")
    plt.plot(df["ma25"], label="MA25")
    plt.plot(df["ma75"], label="MA75")

    plt.legend()
    plt.title("Moving Average")
    plt.show()

最後に、株価と移動平均線をグラフで表示しています。

  • plt.figure(figsize=(12,6)):グラフのサイズを指定
  • plt.plot():各データを線として描画
  • label:凡例(どの線か分かるようにする)
  • plt.legend():凡例を表示
  • plt.show():グラフを表示

まとめ

移動平均線はシンプルですが、システムトレードの「骨組み」になる重要な要素です。
Pandasを正しく使えば、わずか数行で信頼性の高い分析ロジックを組むことができます。

  • 移動平均線はトレンドを見る基本指標
  • Pythonで簡単に実装可能
  • 他の指標と組み合わせるのが重要

今回、説明した移動平均線の計算を使って自作の株価分析ツールもつくっているので、ぜひ下の記事も読んでみてね

【投資に関する免責事項】
本ブログで紹介している株価解析ツールによるスコアリングおよび銘柄分析は、あくまで個人の学習・研究および技術検証を目的としたものであり、特定の銘柄の売買を推奨するものではありません。

ツールの算出結果や掲載情報の正確性については万全を期しておりますが、その内容を保証するものではありません。投資の最終決定は、必ずご自身の判断と責任において行っていただきますようお願いいたします。

万一、本ブログの情報に基づいて被ったいかなる損害についても、当サイトおよび運営者は一切の責任を負いかねますのであらかじめご了承ください。

目次