見出し画像

RSI,MACD,BBのある株価チャート(日足、週足、月足も!)


1.初めに

前回、移動平均を使った株価予測を行いました。さらに予測精度を上げるには、その他のパラメーターを検討も一案です。
 そこで今回は、代表的な指標となる、RSI ,MACD,BB(BollingerBands)について紹介します。またそれらグラフの時間軸を従来の日足から週足、月足のグラフを描くことで、どの時間軸を予測するかの参考にしていただければと思います。ぜひお付き合い下さい。


補足)
今回のQQQ:NASDAQ100に連動するETFの日足・週足・月足データ及び各種パラメーターのチャートから得られたことを簡単にまとめます。
 現在のトレンドはRSIでは、日足・週足・月足とも高めな水準であり、月足MACDでも上昇傾向継続の傾向です。ただし、週足MACDやBB上限に張り付いているなど、いつ調整があってもおかしくないと読み取れます。ただ、過去からの上昇傾向は月足・対数軸目盛で一直線を超える右肩あがりであり、今後もハイテク分野のテクノロジーの進化は止まらずむしろ加速している直近の状況であれば、早く投資したほうが有利な可能性が高いように思えます。
 皆様も様々なチャートを解析して、自分なりの投資方針の参考にしてみていただければ幸いです。



今回のゴール

QQQ月足チャート(対数表示)

前回の移動平均を使った株価予測についてのリンク↓

2.各パラメーターの説明

1)RSI(相対力指数)

RSI(Relative Strength Index)は、資産の買われ過ぎや売られ過ぎの状態を判断するために使用されるモメンタム指標です。この指標は、0から100の範囲で動き、一般に70を超えると買われ過ぎ、30を下回ると売られ過ぎと見なされます。RSIは、価格変動の速度と変化の大きさを測定し、トレーダーが市場の潜在的な反転点を特定するのに役立ちます。14日間が一般的な計算期間であり、この期間を基に、上昇幅と下降幅の平均を用いてRSIが算出されます。市場の過熱や冷却を示す重要なシグナルとして、多くのトレーダーが注目しています。
 PYTHON では、今回下記のようにRSIを計算する関数を定義し、14日間に対応するRSIを計算させています。

# RSIを計算する関数
def calculate_rsi(data, window=14):
    delta = data.diff(1)
    gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()

    rs = gain / loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

# RSIの計算
df['RSI'] = calculate_rsi(df['Close'])

2)MACD(移動平均収束拡散指標)

MACD(Moving Average Convergence Divergence)は、トレンドの勢いや方向、そしてその変化を示すために使われるテクニカル分析ツールです。この指標は、短期の指数移動平均(EMA)と長期EMAの差に基づいており、具体的には短期EMA(12日間)から長期EMA(26日間)を引いた値で構成されます。今回のグラフでは、MACDラインのみを使用し、シグナルラインは含まれていません。MACDラインが正の値を示す場合、短期EMAが長期EMAよりも高いことを意味し、市場の勢いが強いことを示唆します。逆に、MACDラインが負の値をとる場合、短期EMAが長期EMAよりも低いことを意味し、市場の勢いが弱いことを示します。MACDラインのゼロクロスは、トレンドの変化を示唆し、トレーダーにとって重要なシグナルとなります。この指標は、トレンドの勢いを把握し、トレンドの転換点を早期に識別するのに役立ちます。
 PYTHON では、今回下記のようにMACD12日、26日の移動平均を計算しプロットしています。

# MACDの計算
# 短期EMA
short_ema = df['Close'].ewm(span=12, adjust=False).mean()
# 長期EMA
long_ema = df['Close'].ewm(span=26, adjust=False).mean()
# MACDの計算
df['MACD'] = short_ema - long_ema
# シグナルラインの計算
df['Signal_Line'] = df['MACD'].ewm(span=9, adjust=False).mean()

3)ボリンジャーバンド(BB)

ボリンジャーバンドは、価格の標準偏差を基にしたバンドで、市場のボラティリティを測定するテクニカル分析ツールです。この指標は、中央の移動平均線と、この移動平均から上下に配置された2つのバンド(上部バンドと下部バンド)から成り立っています。バンドの幅は価格の標準偏差に基づいており、市場のボラティリティが高まるとバンドが広がり、低下するとバンドが縮まります。ボリンジャーバンドは、価格がバンドの外側に達した場合の過買いや過売りの状態、さらには価格の圧縮が将来的な大きな動きの前触れである可能性を示すのに使用されます。
 今回下記のように20日移動平均とその標準偏差:σを計算し、2σのプロットを表示させています。

# ボリンジャーバンドの計算
# 20日移動平均
df['MA20'] = df['Close'].rolling(window=20).mean()
# 20日の標準偏差
df['STD20'] = df['Close'].rolling(window=20).std()
# 上部バンド
df['Upper'] = df['MA20'] + (df['STD20'] * 2)
# 下部バンド
df['Lower'] = df['MA20'] - (df['STD20'] * 2)

3.株価チャート(日足、週足、月足)

1)日足チャート

今回、NASDAQ100に連動するETFであるQQQの日足・週足・月足のデータをもとに、RSI,MACD,BBとともにプロットするコードを紹介します。
 まず日足ですが、前回の移動平均(MA)に追加して、それぞれ計算・プロット線の設定を行います。最後にロウソク足チャートをプロットすることができるmplfinanceを使用してグラフを出力します。

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np

# データの取得
df = yf.download('QQQ', start='2023-01-01', end='2024-03-02')

# 移動平均線の計算
df['ma5'] = df['Close'].rolling(window=5).mean()
df['ma20'] = df['Close'].rolling(window=20).mean()
df['ma50'] = df['Close'].rolling(window=50).mean()
# 移動平均線の追加プロット
ap0 = mpf.make_addplot(df['ma5'], color='r', width=1)
ap1 = mpf.make_addplot(df['ma20'], color='g', width=1)
ap2 = mpf.make_addplot(df['ma50'], color='b', width=1)


# RSIを計算する関数
def calculate_rsi(data, window=14):
    delta = data.diff(1)
    gain = (delta.where(delta > 0, 0)).rolling(window=window).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=window).mean()

    rs = gain / loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

# RSIの計算
df['RSI'] = calculate_rsi(df['Close'])
# RSIのプロット用データ
ap_rsi = mpf.make_addplot(df['RSI'], panel=2, color='purple', ylabel='RSI')
# RSIの罫線用データの生成
rsi_70 = np.full_like(df['RSI'], 70)  # RSIが70の場合の線
rsi_50 = np.full_like(df['RSI'], 50)  # RSIが50の場合の線
rsi_30 = np.full_like(df['RSI'], 30)  # RSIが30の場合の線
# 罫線の追加プロットを作成
ap_rsi_70 = mpf.make_addplot(rsi_70, panel=2, color='red', linestyle='--', width=0.5)
ap_rsi_50 = mpf.make_addplot(rsi_50, panel=2, color='gray', linestyle='--', width=0.5)
ap_rsi_30 = mpf.make_addplot(rsi_30, panel=2, color='red', linestyle='--', width=0.5)

# MACDの計算
# 短期EMA
short_ema = df['Close'].ewm(span=12, adjust=False).mean()
# 長期EMA
long_ema = df['Close'].ewm(span=26, adjust=False).mean()
# MACDの計算
df['MACD'] = short_ema - long_ema
# シグナルラインの計算
df['Signal_Line'] = df['MACD'].ewm(span=9, adjust=False).mean()

# MACDとシグナルラインのプロット用データ
ap_macd = mpf.make_addplot(df['MACD'], panel=3, color='blue', ylabel='MACD')
ap_signal = mpf.make_addplot(df['Signal_Line'], panel=3, color='red')

# ボリンジャーバンドの計算
# 20日移動平均
df['MA20'] = df['Close'].rolling(window=20).mean()
# 20日の標準偏差
df['STD20'] = df['Close'].rolling(window=20).std()
# 上部バンド
df['Upper'] = df['MA20'] + (df['STD20'] * 2)
# 下部バンド
df['Lower'] = df['MA20'] - (df['STD20'] * 2)

# ボリンジャーバンドのプロット用データ
ap_upper = mpf.make_addplot(df['Upper'], color='gray', linestyle='--')
ap_lower = mpf.make_addplot(df['Lower'], color='gray', linestyle='--')

# mplfinanceでのチャートプロット(ボリンジャーバンドを追加)
mpf.plot(df, type='candle', style='charles', addplot=[ap0, ap1, ap2, ap_rsi, ap_macd, ap_signal, ap_upper, ap_lower, ap_rsi_70, ap_rsi_50, ap_rsi_30],
         title='QQQ with Moving Averages, RSI, MACD, and Bollinger Bands',
         ylabel='Price USD ($)',
         volume=True,
         ylabel_lower='Volume',
         show_nontrading=False,
         figratio=(12,8),
         figscale=1.2,
         panel_ratios=(12,3,3,3)) 

QQQチャート(日足)
Table:各指数が計算できていることが確認できる。
*Nanは移動平均の計算のため数値無


2)週足チャート

週足チャートをプロットするには、日足データから週足データに変換します。具体的には、resample().agg() にそれぞれ下記のように引数を指定することでデータが変化することができます。

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np

# データの取得
df = yf.download('QQQ', start='2016-01-01', end='2024-03-02')

# 日次データを週足データにリサンプリング
df_weekly = df.resample('W').agg({'Open': 'first', 
                                  'High': 'max',
                                  'Low': 'min',
                                  'Close': 'last',
                                  'Volume': 'sum'})

# 週足データに基づいて移動平均を計算
df_weekly['ma5'] = df_weekly['Close'].rolling(window=5).mean()
df_weekly['ma20'] = df_weekly['Close'].rolling(window=20).mean()
df_weekly['ma50'] = df_weekly['Close'].rolling(window=50).mean()

# 移動平均線の追加プロット
ap0 = mpf.make_addplot(df_weekly['ma5'], color='r', width=0.5)
ap1 = mpf.make_addplot(df_weekly['ma20'], color='g', width=0.5)
ap2 = mpf.make_addplot(df_weekly['ma50'], color='b', width=0.5)

# RSIの計算とプロット
df_weekly['RSI'] = calculate_rsi(df_weekly['Close'])
ap_rsi = mpf.make_addplot(df_weekly['RSI'], panel=2, color='purple', ylabel='RSI')

# RSI罫線用データ
rsi_70 = np.full_like(df_weekly['RSI'], 70)
rsi_50 = np.full_like(df_weekly['RSI'], 50)
rsi_30 = np.full_like(df_weekly['RSI'], 30)
ap_rsi_70 = mpf.make_addplot(rsi_70, panel=2, color='red', linestyle='--', width=0.5)
ap_rsi_50 = mpf.make_addplot(rsi_50, panel=2, color='gray', linestyle='--', width=0.5)
ap_rsi_30 = mpf.make_addplot(rsi_30, panel=2, color='red', linestyle='--', width=0.5)

# MACDの計算とプロット
short_ema = df_weekly['Close'].ewm(span=12, adjust=False).mean()
long_ema = df_weekly['Close'].ewm(span=26, adjust=False).mean()
df_weekly['MACD'] = short_ema - long_ema
df_weekly['Signal_Line'] = df_weekly['MACD'].ewm(span=9, adjust=False).mean()
ap_macd = mpf.make_addplot(df_weekly['MACD'], panel=3, color='blue', ylabel='MACD')
ap_signal = mpf.make_addplot(df_weekly['Signal_Line'], panel=3, color='red')

# ボリンジャーバンドの計算とプロット
df_weekly['MA20'] = df_weekly['Close'].rolling(window=20).mean()
df_weekly['STD20'] = df_weekly['Close'].rolling(window=20).std()
df_weekly['Upper'] = df_weekly['MA20'] + (df_weekly['STD20'] * 2)
df_weekly['Lower'] = df_weekly['MA20'] - (df_weekly['STD20'] * 2)
ap_upper = mpf.make_addplot(df_weekly['Upper'], color='gray', linestyle='--')
ap_lower = mpf.make_addplot(df_weekly['Lower'], color='gray', linestyle='--')

# mplfinanceでのチャートプロット
mpf.plot(df_weekly, type='candle', style='charles', addplot=[ap0, ap1, ap2, ap_rsi, ap_macd, ap_signal, ap_upper, ap_lower, ap_rsi_70, ap_rsi_50, ap_rsi_30],
         title='QQQ Weekly with Moving Averages, RSI, MACD, and Bollinger Bands',
         ylabel='Price USD ($)',
         volume=True,
         ylabel_lower='Volume',
         show_nontrading=False,
         figratio=(12,8),
         figscale=1.2,
         panel_ratios=(12,3,3,3))


QQQチャート(週足)

3)月足チャート(対数表示)

さらに長期で見たい場合は、月足が最適です。週足と同様にresample()を使用し、その引数に’M’を指定することで月足データとなります。
実際に過去20年のQQQの価格をプロットすると、今回のQQQ右肩あがりの場合、過去データの変動が見えなくなります。そのためメモリを対数表示とすることで、変化率を一定にした表示が可能です。mplfinanceではyscale='log'を引数に指定することで対数目盛のグラフがプロットできます。

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
import numpy as np

# データの取得
df = yf.download('QQQ', start='2004-01-01', end='2024-03-02')

# 日次データを月足データにリサンプリング
df_monthly = df.resample('M').agg({'Open': 'first', 
                                   'High': 'max',
                                   'Low': 'min',
                                   'Close': 'last',
                                   'Volume': 'sum'})

# 月足データに基づいて移動平均を計算
df_monthly['ma5'] = df_monthly['Close'].rolling(window=5).mean()
df_monthly['ma20'] = df_monthly['Close'].rolling(window=20).mean()
df_monthly['ma50'] = df_monthly['Close'].rolling(window=50).mean()

# 移動平均線の追加プロット
ap0 = mpf.make_addplot(df_monthly['ma5'], color='r', width=1)
ap1 = mpf.make_addplot(df_monthly['ma20'], color='g', width=1)
ap2 = mpf.make_addplot(df_monthly['ma50'], color='b', width=1)

# RSIの計算とプロット
df_monthly['RSI'] = calculate_rsi(df_monthly['Close'])
ap_rsi = mpf.make_addplot(df_monthly['RSI'], panel=2, color='purple', ylabel='RSI')

# RSI罫線用データ
rsi_70 = np.full_like(df_monthly['RSI'], 70)
rsi_50 = np.full_like(df_monthly['RSI'], 50)
rsi_30 = np.full_like(df_monthly['RSI'], 30)
ap_rsi_70 = mpf.make_addplot(rsi_70, panel=2, color='red', linestyle='--', width=0.5)
ap_rsi_50 = mpf.make_addplot(rsi_50, panel=2, color='gray', linestyle='--', width=0.5)
ap_rsi_30 = mpf.make_addplot(rsi_30, panel=2, color='red', linestyle='--', width=0.5)

# MACDの計算とプロット
short_ema = df_monthly['Close'].ewm(span=12, adjust=False).mean()
long_ema = df_monthly['Close'].ewm(span=26, adjust=False).mean()
df_monthly['MACD'] = short_ema - long_ema
df_monthly['Signal_Line'] = df_monthly['MACD'].ewm(span=9, adjust=False).mean()
ap_macd = mpf.make_addplot(df_monthly['MACD'], panel=3, color='blue', ylabel='MACD')
ap_signal = mpf.make_addplot(df_monthly['Signal_Line'], panel=3, color='red')

# ボリンジャーバンドの計算とプロット
df_monthly['MA20'] = df_monthly['Close'].rolling(window=20).mean()
df_monthly['STD20'] = df_monthly['Close'].rolling(window=20).std()
df_monthly['Upper'] = df_monthly['MA20'] + (df_monthly['STD20'] * 2)
df_monthly['Lower'] = df_monthly['MA20'] - (df_monthly['STD20'] * 2)
ap_upper = mpf.make_addplot(df_monthly['Upper'], color='gray', linestyle='--')
ap_lower = mpf.make_addplot(df_monthly['Lower'], color='gray', linestyle='--')

# mplfinanceでのチャートプロット
mpf.plot(df_monthly, type='candle', style='charles', addplot=[ap0, ap1, ap2, ap_rsi, ap_macd, ap_signal, ap_upper, ap_lower, ap_rsi_70, ap_rsi_50, ap_rsi_30],
         title='QQQ Monthly with Moving Averages, RSI, MACD, and Bollinger Bands',
         ylabel='Price USD ($)',
         volume=True,
         ylabel_lower='Volume',
         show_nontrading=False,
         figratio=(12,8),
         figscale=1.2,
         panel_ratios=(12,3,3,3),
         yscale='log')  # 対数目盛りの設定
QQQチャート(月足):Price対数目盛

4.最後に

今回、ロウソク足チャートに、RSI ,MACD,BBを計算させ、プロットまでのコードを紹介しました。また日足データだけでなく、週足、月足での計算、プロット方法を紹介しました。PYTHON でも簡単にデータの取得から表示まで実現できることをお伝えできたのかと思います。皆様ぜひトライしてみて下さい。
 次回も、PYTHON 入門&米国株チャンネルに相応しい内容を掲載していきますので、引き続き応援の程よろしくお願いいたします!!


この記事が気に入ったらサポートをしてみませんか?