RSIとMACDを組み合わせる理由
テクニカル分析でよく使われる指標はたくさんありますが、その中でも特に人気が高いのが RSI(Relative Strength Index) と MACD(Moving Average Convergence Divergence) です。
RSI単体・MACD単体でもシグナルを出すことができますが、2つを組み合わせることで「精度が格段に上がる」と言われています。その理由を一言で言うと:
- RSI:相場の「過熱感」を測る(買われすぎ・売られすぎを判定)
- MACD:トレンドの「方向性と強さ」を測る(上昇トレンド・下降トレンドを判定)
この2つが同時に同じ方向のシグナルを出したとき、信頼性の高い売買タイミングになります。今回はPythonでこの組み合わせ戦略を実装する方法を解説します。
必要なライブラリのインストール
pip install yfinance pandas ta matplotlib
今回は ta(Technical Analysis)ライブラリを使います。TA-Libと違いC言語ライブラリへの依存がなく、pipで簡単にインストールできるので初心者におすすめです。
株価データの取得とインジケーター計算
import yfinance as yf
import pandas as pd
import ta
ticker = "^N225"
df = yf.download(ticker, start="2023-01-01", end="2026-05-01", auto_adjust=True)
df.columns = [c[0] for c in df.columns]
# RSIを計算(期間14日が標準)
df['RSI'] = ta.momentum.RSIIndicator(close=df['Close'], window=14).rsi()
# MACDを計算(短期12・長期26・シグナル9が標準)
macd = ta.trend.MACD(close=df['Close'], window_slow=26, window_fast=12, window_sign=9)
df['MACD'] = macd.macd()
df['MACD_signal'] = macd.macd_signal()
df['MACD_hist'] = macd.macd_diff()
売買シグナルの定義
買いシグナルの条件:
- RSIが30以下から上昇し、30を上抜けたタイミング
- かつ、MACDラインがシグナルラインを上抜け(ゴールデンクロス)
売りシグナルの条件:
- RSIが70以上から下落し、70を下抜けたタイミング
- かつ、MACDラインがシグナルラインを下抜け(デッドクロス)
import numpy as np
df['buy_signal'] = False
df['sell_signal'] = False
for i in range(1, len(df)):
rsi_cross_up = (df['RSI'].iloc[i-1] < 30) and (df['RSI'].iloc[i] >= 30)
macd_cross_up = (df['MACD'].iloc[i-1] < df['MACD_signal'].iloc[i-1]) and (df['MACD'].iloc[i] >= df['MACD_signal'].iloc[i])
rsi_cross_down = (df['RSI'].iloc[i-1] > 70) and (df['RSI'].iloc[i] <= 70)
macd_cross_down = (df['MACD'].iloc[i-1] > df['MACD_signal'].iloc[i-1]) and (df['MACD'].iloc[i] <= df['MACD_signal'].iloc[i])
if rsi_cross_up and macd_cross_up:
df.at[df.index[i], 'buy_signal'] = True
if rsi_cross_down and macd_cross_down:
df.at[df.index[i], 'sell_signal'] = True
チャートで可視化する
import matplotlib.pyplot as plt
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
fig.suptitle('RSI x MACD 複合シグナル戦略', fontsize=16)
buy_dates = df[df['buy_signal']].index
sell_dates = df[df['sell_signal']].index
axes[0].plot(df.index, df['Close'], color='#38bdf8', lw=1.5)
axes[0].scatter(buy_dates, df.loc[buy_dates, 'Close'], marker='^', color='#34d399', s=100)
axes[0].scatter(sell_dates, df.loc[sell_dates, 'Close'], marker='v', color='#f87171', s=100)
axes[0].set_ylabel('株価')
axes[1].plot(df.index, df['RSI'], color='#a78bfa', lw=1.5)
axes[1].axhline(70, color='#f87171', ls='--', alpha=0.7)
axes[1].axhline(30, color='#34d399', ls='--', alpha=0.7)
axes[1].set_ylim(0, 100); axes[1].set_ylabel('RSI')
axes[2].plot(df.index, df['MACD'], color='#38bdf8', lw=1.5)
axes[2].plot(df.index, df['MACD_signal'], color='#f87171', lw=1.5)
axes[2].bar(df.index, df['MACD_hist'],
color=['#34d399' if v >= 0 else '#f87171' for v in df['MACD_hist']], alpha=0.5)
axes[2].set_ylabel('MACD')
plt.tight_layout()
plt.savefig('rsi_macd_strategy.png', dpi=150, bbox_inches='tight')
plt.show()
注意点:ダマシを減らすための工夫
どんな戦略にも「ダマシ(偽シグナル)」は存在します。精度を上げるためのヒントをいくつか紹介します。
まず、より上位の時間軸でトレンドを確認しましょう。日足でシグナルが出ていても、週足では下落トレンド中ということはよくあります。上位足の方向に沿ったシグナルのみを採用することで精度が上がります。
次に、出来高との組み合わせも有効です。シグナル発生時に出来高が増加していれば、より信頼性が高くなります。また、損切りルールを必ず設定してください。エントリー価格から3〜5%下落したら損切りするといったルールを事前に決めておくことが資金管理の基本です。
まとめ
今回はPythonでRSIとMACDを組み合わせた複合シグナル戦略を実装しました。単体の指標よりも精度が高いシグナルが得られますが、あくまでも補助ツールとして使うことが重要です。次のステップとして、ぜひBacktesting.pyを使ってこの戦略の過去パフォーマンスを検証してみてください!

