
【Python】【テクニカル指標】ゴールデンクロスとデッドクロスの算出と描画
ここでは取得した株価データから単純移動平均線(SMA:Simple Moving Average)を算出し、移動平均線の短期線と長期線からゴールデンクロスとデッドクロスを算出して、ゴールデンクロスとデッドクロスの発生を描画します。
短期線が長期線を下から上に交差して追い抜くことをゴールデンクロス、短期線が長期線を上から下に交差して追い抜くことをデッドクロスといいます。
一般的に、ゴールデンクロスは株価が上昇する前兆、デッドクロスは株価が下降する前兆で、長期線と短期線が交差する角度が大きいほど、交差以降の上昇 / 下降の度合いが大きいといわれています。
ここでは株価データを取得し、mplfinanceを使用してローソク足チャートを描画し、ローソク足チャート、単純移動平均線にゴールデンクロス、デッドクロス発生を追加していきます。
なお、最低限のポイントのみの説明にするため、Pythonライブラリ、モジュール等のインストール方法については割愛させて頂きます。お使いのPC環境等に合わせてインストールしてもらえればと思います。
1.株価データを取得する
下記を参考にOHLCV(始値 / 高値 / 安値 / 終値 / 出来高)形式の日経平均株価(^NKX)データを取得します。データの取得期間は、2022年10月1日から現在の日付までです。
※stooqでデータ取得した場合、日付の降順にデータが並ぶようです。df.sort_index(inplace=True)で昇順に並び替えています。
import pandas_datareader.data as web
import datetime
start = '2022-10-01'
end = datetime.date.today()
df = web.DataReader('^NKX', 'stooq', start, end)
# 日付を昇順に並び替える
df.sort_index(inplace=True)
2.ライブラリをインポートする
まず、mplfinance, talib, numpyをインポートします。mplfinanceを使用することで簡単にローソク足チャートを描画できます。また、Ta-Lib(Technical Analysis Library)を使用することでも単純移動平均線を算出することができます。Ta-Libはさまざまなテクニカル指標を計算するためのPythonのライブラリです。
import mplfinance as mpf
import talib as ta
import numpy as np
3.ゴールデンクロス、デッドクロスを算出する
まず、Ta-Lib(Technical Analysis Library)を使用して、短期単純移動平均(5日移動平均)と長期単純移動平均(25日移動平均)を算出します。
次に、cross列を df に追加し、5日移動平均と25日移動平均を比較して、5日移動平均の方が25日移動平均より大きい場合 True、小さい場合 False を格納します。更に、cross_shift 列を df に追加し、cross列の値を1行下にずらした値を格納します。シリーズをずらす処理はshiftメソッドで行うことができます。
# 移動平均
df['ma5'] = ta.SMA(df['Close'], 5)
df['ma25'] = ta.SMA(df['Close'], 25)
# 5日移動平均と25日移動平均の比較
df['cross'] = df['ma5'] > df['ma25']
# crossを1行下にずらす
df['cross_shift'] = df['cross'].shift(1)
df

ここで、ゴールデンクロスとデッドクロスの発生日を検出する処理を考えます。ゴールデンクロスとデッドクロスの発生日は、それぞれ連続する True の最初、あるいは連続する False の最初です。連続したシリーズから最初のデータを検出するためには、cross列とcrossを1つずらした列を比較して値が異なるとき (df['cross'] != df['cross_shift']) が最初のデータであると考えられます。更に5日移動平均が25日移動平均より大きい場合 (df['cross'] == True) がゴールデンクロス、小さい場合 (df['cross'] == False) がデッドクロスと判断できます。
# ゴールデンクロスの発生
flag_gc = (df['cross'] != df['cross_shift']) & (df['cross'] == True)
# デッドクロスの発生
flag_dc = (df['cross'] != df['cross_shift']) & (df['cross'] == False)
gc 列と dc列を df に追加し、ゴールデンクロス発生(flag_gc == True)であれば、5日移動平均の値を gc列に追加し、デッドクロス発生(flag_dc == True)であれば、25日移動平均の値を dc列に追加します。それ以外はNaNを格納します。
# ゴールデンクロス発生であればMA5の値、それ以外はNaN
golden_cross = [ma if gc==True else np.nan for gc, ma in zip(flag_gc, df['ma5'])]
# デッドクロス発生であればMA25の値、それ以外はNaN
dead_cross = [ma if gc==True else np.nan for gc, ma in zip(flag_dc, df['ma25'])]
# データフレームのカラムとして保存
df['gc'], df['dc'] = golden_cross, dead_cross
df

4.ローソク足チャートに単純移動平均線、ゴールデンクロス、デッドクロスを追加して描画する
5日移動平均、25日移動平均、ゴールデンクロス 、デッドクロスをaddplotで追加します。addplotの中には、リスト形式で表示したいデータを指定します。
panelオプションでパネル番号を指定
colorオプションでプロットの色を指定
widthオプションで描画の線の太さを設定
typeオプションで点の描画
markerオプションでマーカーの種類を指定
markersizeオプションでマーカーサイズを指定
apd = [
# 5日移動平均線
mpf.make_addplot(df['ma5'], color='blue', panel=0, width=1.0),
# 25日移動平均線
mpf.make_addplot(df['ma25'], color='green', panel=0, width=1.0),
# ゴールデンクロス
mpf.make_addplot(df['gc'], type='scatter', markersize=150, marker='o', color='red'),
# デッドクロス
mpf.make_addplot(df['dc'], type='scatter', markersize=150, marker='o', color='blue')
]
# ラベルをつけてチャートを表示
fig, axes = mpf.plot(df, type='candle', addplot=apd, returnfig=True)
# ラベルを追加
axes[0].legend(['MA5', 'MA25'])
# チャートを表示
fig.show()

単純移動平均線の描画の参考
mplfinance、Ta-Libを使用してローソク足チャート、単純移動平均線にゴールデンクロス、デッドクロス発生を追加することができます。