株式投資でよく注目されるシグナルの一つが「ゴールデンクロス」と「デッドクロス」です。
本記事では、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株証券で可能?