【サンプルコード付き】Pythonで株価のゴールデンクロス・デッドクロスを自動検知して通知する

技術系

株式投資でよく注目されるシグナルの一つが「ゴールデンクロス」と「デッドクロス」です。
本記事では、Pythonを使ってこれらを自動検知し、毎日メールで通知する実装例をサンプルコード付きでわかりやすく解説します。

この記事で学べること

  • ゴールデンクロス/デッドクロスの判定ロジック
  • Yahoo Finance(yfinance)での株価取得
  • pandasで移動平均(SMA)を計算する方法
  • 実運用時の注意点と改善ポイント

判定ロジック(原理)

ゴールデンクロス:短期移動平均(例:25日)が長期移動平均(例:75日)を下から上に突き抜ける瞬間。

デッドクロス:短期が長期を上から下に突き抜ける瞬間。

実装上は「直近2本分の短期MAと長期MAの比較」で交差を検出します。
– 以前(t-1):short_ma < long_ma
– 現在(t):short_ma >= long_ma → ゴールデンクロス発生
逆であればデッドクロス発生。

サンプルコード

以下はYahoo!ファイナンスより株価を取得し、クロスを検出したらprintで売り時化買い時かを表示します。

import yfinance as yf
import pandas as pd

stock_number = [
    7453, #良品計画
    2702, #マクドナルドHD
    7267, #HONDA
    2503, #KIRIN
    4661, #OLC
    2897, #日清食品
    7203 #TOYOTA
]

def main():
    stock = [str(s) + ".T" for s in stock_number]
    for s in stock:
        search(s)

def search(stock_name):
    # --- 銘柄の過去1年の株価データ取得
    ticker = yf.Ticker(stock_name)
    df = ticker.history(period="1y")

    # --- 移動平均を計算(短期25日・長期75日)
    df["SMA_25"] = df["Close"].rolling(window=25).mean()
    df["SMA_75"] = df["Close"].rolling(window=75).mean()

    # --- 売買シグナル判定
    signal = []
    df_last = df.tail(2).copy()
    for i in range(1, len(df_last)):
        if df_last['SMA_25'].iloc[i] > df_last['SMA_75'].iloc[i] and df_last['SMA_25'].iloc[i-1] <= df_last['SMA_75'].iloc[i-1]:
            signal.append("BUY")  # ゴールデンクロス
        elif df_last['SMA_25'].iloc[i] < df_last['SMA_75'].iloc[i] and df_last['SMA_25'].iloc[i-1] >= df_last['SMA_75'].iloc[i-1]:
            signal.append("SELL")  # デッドクロス
        else:
            signal.append("")  # シグナルなし

    df_last["Signal"] = [""] + signal  # 先頭行に空欄を追加

    # --- 昨日のシグナルだけ取得
    yesterday = df_last.tail(1)  # 最後から2番目の行(=昨日)
    if yesterday["Signal"].values[0] != "": # シグナルがあった時だけ表示
        print("日付:", yesterday.index[0].date())
        print(ticker.info["shortName"])
        print("最新の終値:", yesterday["Close"].values[0])
        print("シグナル:", yesterday["Signal"].values[0])
        print("")

if __name__ == "__main__":
    main()

リストに証券コードをまとめて保存しておくことで、複数の銘柄でチェックができるようしています。

実行結果

日付: 2025-10-22
MCDONALD’S HOLDINGS COMPANY(JAP
最新の終値: 6170.0
シグナル: SELL

毎日実行させる

市場が開く月-金曜日の16時にその日の株価を見て判定します。
crontabで以下のような登録で叶うでしょう。
もしもクロスが出現していたらメールで通知してくれます。

0 16 * * 1,2,3,4,5 python3 stock_watch.py

改良アイデア

  • シグナル発生時にチャート画像を生成して送る(matplotlibで保存→メールへ添付)
  • その他のチャートも判定してより精度の高い分析を
  • 取引自動執行と組み合わせる(API連携、リスク管理必須)→ 三菱UFJ e株証券で可能?
スポンサーリンク
タイトルとURLをコピーしました