※当サイトはPRを含みます

【Python株価分析:第5回】ゴールデンクロス・デッドクロスで株価予測

株価分析シリーズの第5回では、「ゴールデンクロス(GC)」と「デッドクロス(DC)」を用いた予測手法を、Pythonで実装・可視化する方法を紹介します。これらのテクニカル指標は、投資判断のシグナルとしても広く使われています。

第1回はこちら↓

ゴールデンクロス・デッドクロスとは?

ゴールデンクロス(Golden Cross)

短期移動平均線(例:5日移動平均)が長期移動平均線(例:25日移動平均)を下から上に突き抜けるタイミングです。
これは**「買いシグナル」**とされ、上昇トレンドへの転換を示唆します。

デッドクロス(Dead Cross)

逆に、短期移動平均線が長期移動平均線を上から下に突き抜けるタイミングを指します。
これは「売りシグナル」とされ、下降トレンドへの転換の兆候です。

実装内容と流れ

以下のコードでは、Pythonを使って日本株の4銘柄に対してGC/DCの検出とインタラクティブチャートの描画を行っています。

使用銘柄

  • トヨタ自動車(7203.T)
  • ソフトバンクグループ(9984.T)
  • NTT(9432.T)
  • 三菱UFJフィナンシャル・グループ(8306.T)

主な処理

  1. データ取得yfinanceを使って株価データを取得
  2. 移動平均の計算:5日SMAと25日SMAを算出
  3. GC/DCの検出:SMAのクロス判定
  4. インタラクティブチャートの描画plotlyでチャート作成・切替ボタン付き

コード概要

以下のような可視化が可能です:

  • ローソク足チャート
  • 移動平均線(5日/25日)
  • ゴールデンクロス地点(緑の▲)
  • デッドクロス地点(赤の▼)

操作可能なドロップダウン:

  • 銘柄切替
  • 表示項目切替(SMAやGC/DCだけの表示など)

Pythonコード

import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime

# --- 対象銘柄(日本株) ---
codes = ["7203.T", "9984.T", "9432.T", "8306.T"]
today = datetime.today().strftime("%Y-%m-%d")

# --- 銘柄名取得 ---
info = {}
for code in codes:
    try:
        info[code] = yf.Ticker(code).info["shortName"]
    except:
        info[code] = code

# --- データ取得 + GC/DC検出 ---
data = {}
for code in codes:
    df = yf.download(code, start="2025-01-01", end=today)
    processed_df = pd.DataFrame(index=df.index)
    for col in ["Open", "High", "Low", "Close", "Volume"]:
        processed_df[col] = df[col][code]
    processed_df["SMA_5"] = processed_df["Close"].rolling(window=5).mean()
    processed_df["SMA_25"] = processed_df["Close"].rolling(window=25).mean()
    processed_df["gc_flag"] = (processed_df["SMA_5"] > processed_df["SMA_25"]).astype(int)
    processed_df["cross"] = processed_df["gc_flag"].diff()
    data[code] = processed_df

# --- チャート作成 ---
fig = go.Figure()
trace_info = []  # (code, trace_type) のリスト

for i, (code, df) in enumerate(data.items()):
    name = info[code]
    golden = df[df["cross"] == 1]
    death = df[df["cross"] == -1]
    visible = (i == 0)

    # ローソク足
    fig.add_trace(go.Candlestick(
        x=df.index, open=df["Open"], high=df["High"], low=df["Low"], close=df["Close"],
        name=f"{name}",
        increasing_line_color="green", decreasing_line_color="red", visible=visible
    ))
    trace_info.append((code, "candlestick"))

    # SMA5
    fig.add_trace(go.Scatter(
        x=df.index, y=df["SMA_5"], name=f"{name} SMA 5", line=dict(color="blue"), visible=visible
    ))
    trace_info.append((code, "sma5"))

    # SMA25
    fig.add_trace(go.Scatter(
        x=df.index, y=df["SMA_25"], name=f"{name} SMA 25", line=dict(color="orange"), visible=visible
    ))
    trace_info.append((code, "sma25"))

    # GC
    fig.add_trace(go.Scatter(
        x=golden.index, y=golden["Close"] * 1.005, mode="markers", name=f"{name} GC",
        marker=dict(color="green", size=15, symbol="triangle-up"), visible=visible
    ))
    trace_info.append((code, "gc"))

    # DC
    fig.add_trace(go.Scatter(
        x=death.index, y=death["Close"] * 0.995, mode="markers", name=f"{name} DC",
        marker=dict(color="red", size=15, symbol="triangle-down"), visible=visible
    ))
    trace_info.append((code, "dc"))

# --- 銘柄切り替えドロップダウン ---
symbol_buttons = []
for selected_code in codes:
    visible = [(code == selected_code) for code, _ in trace_info]
    symbol_buttons.append(dict(
        label=info[selected_code],
        method="update",
        args=[{"visible": visible},
              {"title": f"{info[selected_code]} のGC/DCチャート"}]
    ))

# --- 表示項目切り替えドロップダウン ---
display_types = ["ローソク足", "sma5", "sma25", "gc", "dc"]
display_buttons = []
for dtype in display_types:
    visible = [(t == dtype if c == codes[0] else False) for c, t in trace_info]
    display_buttons.append(dict(
        label=f"{dtype.upper()} 表示",
        method="update",
        args=[{"visible": visible},
              {"title": f"{info[codes[0]]} {dtype.upper()}のみ表示"}]
    ))

# --- レイアウト ---
fig.update_layout(
    title=f"{info[codes[0]]} のGC/DCチャート",
    xaxis_title="日付",
    yaxis_title="価格 (JPY)",
    hovermode="x unified",
    xaxis_rangeslider_visible=False,
    updatemenus=[
        dict(
            buttons=symbol_buttons,
            direction="down",
            x=1,  
            xanchor="right",
            y=1.1,
            yanchor="top"
        ),
        dict(
            buttons=display_buttons,
            direction="down",
            x=1,  
            xanchor="right",
            y=1,
            yanchor="top"
        )
    ],
    width=1000,
    height=600
)

fig.show()

実際の分析例(NTTの場合)

例えば、NTT(9432.T)では、4月中旬にGCが出現し、5月に向けて一時的な上昇が見られました。


GCやDCは単独では絶対的な指標ではありませんが、他の指標やニュースと組み合わせることで投資判断の根拠になります。

まとめ

  • ゴールデンクロスは買いタイミングの目安
  • デッドクロスは売りタイミングの目安
  • PythonとPlotlyを組み合わせることで、視覚的にわかりやすくGC/DCを確認可能