RSI + MACDのダブルシグナルで日本株製造メーカーの売買タイミングを自動検出する方法【Pythonコード付き】

Python実装・コード

はじめに:トヨタ株でアルゴを試してみたら、意外と使えた話

先月、なんとなく「大型株ってアルゴに向かないんじゃないか」と思い込んで、ずっと小型株ばかりで試していたんですが、ふと気まぐれでトヨタ(7203)にRSIとMACDを組み合わせたシグナルを当てはめてみたんです。そしたら想像以上に綺麗にエントリーポイントが出てきて、ちょっと感動しました。僕は製造メーカー中心に投資しているので、これは掘り下げてみようと思い、今回の記事を書くことにしました。

大型株でアルゴは使えるのか?というのは、個人投資家なら一度は考える疑問だと思います。結論から言うと、流動性が高い分、シグナルのノイズが少なくて意外と相性いいです。詳しく解説していきます。

RSIとMACDの基本おさらい

まず軽くおさらいしておきましょう。どちらもテクニカル分析の定番指標です。

RSI(相対力指数)

0〜100のスケールで「買われすぎ・売られすぎ」を示します。一般的には70以上で買われすぎ(売りシグナル候補)、30以下で売られすぎ(買いシグナル候補)とされています。計算式はそれほど複雑ではなく、直近N日間の値上がり幅と値下がり幅の比率で求めます。

MACD(移動平均収束拡散法)

短期EMAと長期EMAの差(MACDライン)と、その移動平均(シグナルライン)を比較します。MACDラインがシグナルラインを上に突き抜けたとき(ゴールデンクロス)が買いシグナル、下に突き抜けたとき(デッドクロス)が売りシグナルです。

RSI単体だと「過熱感」しか分からず、MACDは「トレンドの転換点」を示しますが、2つを組み合わせると精度が上がります。

なぜ2つを組み合わせるのか

RSI単体で動かしていたとき、「RSI30以下で買い」だけのルールで運用していたら、製造業の決算ショック時に連続でやられました。。。株が売られすぎに見えても、ファンダメンタルズが悪化していると更に下がる。RSIだけでは「これ以上は下がらないはず」という判断が危ういんです。

MACDを加えると、トレンドの方向性が確認できます。RSIが30以下でも、MACDがまだデッドクロス中なら「まだ下落トレンドが続いている可能性あり」→ エントリーを見送る、という判断ができるようになります。

Pythonで実装してみよう

では実際のコードです。yfinanceで日本株データを取得してRSI・MACDを計算し、ダブルシグナルを検出します。


import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 銘柄コード(日本株は末尾に.T)
ticker = "7203.T"  # トヨタ自動車
df = yf.download(ticker, start="2024-01-01", end="2026-06-01", auto_adjust=True)
df = df[["Close"]].copy()

# ========== RSI計算 ==========
def calc_rsi(series, period=14):
    delta = series.diff()
    gain = delta.where(delta > 0, 0.0)
    loss = -delta.where(delta < 0, 0.0)
    avg_gain = gain.ewm(com=period - 1, min_periods=period).mean()
    avg_loss = loss.ewm(com=period - 1, min_periods=period).mean()
    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

df["RSI"] = calc_rsi(df["Close"], period=14)

# ========== MACD計算 ==========
ema_short = df["Close"].ewm(span=12, adjust=False).mean()
ema_long  = df["Close"].ewm(span=26, adjust=False).mean()
df["MACD"]        = ema_short - ema_long
df["MACD_Signal"] = df["MACD"].ewm(span=9, adjust=False).mean()
df["MACD_Hist"]   = df["MACD"] - df["MACD_Signal"]

# ========== ダブルシグナル検出 ==========
df["MACD_CrossUp"] = (df["MACD_Hist"] > 0) & (df["MACD_Hist"].shift(1) <= 0)
df["BuySignal"]    = (df["RSI"] < 35) & df["MACD_CrossUp"]

df["MACD_CrossDn"] = (df["MACD_Hist"] < 0) & (df["MACD_Hist"].shift(1) >= 0)
df["SellSignal"]   = (df["RSI"] > 65) & df["MACD_CrossDn"]

# ========== 結果表示 ==========
buy_dates  = df[df["BuySignal"]].index
sell_dates = df[df["SellSignal"]].index

print("=== 買いシグナル発生日 ===")
for d in buy_dates:
    price = df.loc[d, "Close"]
    rsi   = df.loc[d, "RSI"]
    print(f"  {d.date()}  終値={price:.0f}円  RSI={rsi:.1f}")

print("\n=== 売りシグナル発生日 ===")
for d in sell_dates:
    price = df.loc[d, "Close"]
    rsi   = df.loc[d, "RSI"]
    print(f"  {d.date()}  終値={price:.0f}円  RSI={rsi:.1f}")

コードの補足

RSIの閾値を30/70ではなく35/65にしているのは、大型株(トヨタ・日立など)だと本当に30まで売られることが少なく、シグナルが全く出なかったためです。銘柄や相場環境によって調整してみてください。

MACDのヒストグラム(MACD-シグナルライン)を使った「クロス判定」は、ゴールデンクロス・デッドクロスより1日早くシグナルが出る場合があるので実用的です。

製造メーカー株での実際の動き(体感)

トヨタ・日立・コマツなど流動性の高い大型製造株では、このダブルシグナルがかなりきれいに機能する印象です。理由としては:

  • 機関投資家の売買が多いため、チャートが「教科書通りに動きやすい」
  • 取引量が多く、シグナルのダマシが小型株より少ない
  • 決算・業績の透明性が高く、突然の値動きが相対的に少ない

逆に小型株はちょっとした出来高で値が飛ぶので、RSI・MACDの信頼性が落ちやすいです。僕は製造メーカー中心の投資スタイルなので、この手法との相性は良いと感じています。

まとめ

RSIとMACDを組み合わせたダブルシグナル方式は、「過熱感」と「トレンド転換」を同時に確認できる実用的な手法です。特にトヨタや日立のような大型製造メーカー株では、流動性の高さがアルゴの精度を助けてくれます。

このコードはあくまでシグナル検出のベースです。次はバックテストで実際の損益を検証してみようと思っています。コードを動かしてみてください。大型株のほうが意外と結果が安定していて驚くかもしれません。

タイトルとURLをコピーしました