【Python】【テクニカル分析】大循環MACDを移動平均線大循環分析チャートへ追加描画
移動平均線大循環分析は、日足チャートにおいて、短期線(5日)・中期線(20日)・長期線(40日)の3本の移動平均線の並び順と傾き、そして中期線、長期線の間の間隔を分析し、今後相場の展開を予測する分析手法で、小次郎講師が考案した分析手法でした。
https://note.com/scilabcafe/n/n8d5c1482638c
大循環MACDも同様に小次郎講師が考案した分析手法で、移動平均線大循環分析の短期、中期、長期の移動平均線の間隔を見ていくことで、2本の移動平均線の間隔が広がったり狭くなったりする変化を分析していきます。それにより、移動平均線大循環分析におけるステージの移行を先読みすることが可能になると思われます。
https://www.okasan-online.co.jp/fx/service/chartplus/chartplus_kojiro.html
ここでは株価データを取得し、mplfinanceを使用してローソク足チャートを描画し、移動平均線大循環分析チャートに大循環MACDを追加ていきます。
なお、最低限のポイントのみの説明にするため、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)
https://note.com/scilabcafe/n/n0060466ef5c3
2.ライブラリをインポートする
まず、mplfinance、talibをインポートします。mplfinanceを使用することで簡単にローソク足チャートを描画できます。また、Ta-Lib(Technical Analysis Library)を使用することでも指数平滑移動平均を算出することができます。Ta-Libはさまざまなテクニカル指標を計算するためのPythonのライブラリです。
import mplfinance as mpf
import talib as ta
https://note.com/scilabcafe/n/nd0719f248df0
3.3本の移動平均と大循環MACDを算出する
移動平均線大循環分析における短期、中期、長期の移動平均の算出については、下記を参照して頂けたらと思います。
https://note.com/scilabcafe/n/n8d5c1482638c
大循環MACDの構成としては、3本のMACDからなります。
・MACD1 = 5日EMA - 20日EMA
・MACD2 = 5日EMA - 40日EMA
・MACD3(帯MACD) = 20日EMA - 40日EMA
上の式より、MACDが0ラインのところにあるところが、2本の移動平均線がくっついているところです。つまり、ゴールデンクロス、デッドクロスとなっているところです。
下記のコードでは、Ta-Lib(Technical Analysis Library)を使用して、短期5日指数平滑移動平均線、中期20日指数平滑移動平均線、長期40日指数平滑移動平均線を算出しています。また、MACD1、MACD2、MACD3を算出しています。そして、算出した値をdfのカラムに追加しています。
# 移動平均大循環分析(5日EMA、20日EMA、40日EMAを採用)
df['EMA5'] = ta.EMA(df['Close'], timeperiod=5) # 短期 5日指数平滑移動平均線
df['EMA20'] = ta.EMA(df['Close'], timeperiod=20) # 中期 20日指数平滑移動平均線
df['EMA40'] = ta.EMA(df['Close'], timeperiod=40) # 長期 40日指数平滑移動平均線
# MACDラインを計算
df['MACD1'] = df['EMA5'] - df['EMA20'] # 5日EMAと20日EMAの差を見るMACD (短期線と中期線の間隔)
df['MACD2'] = df['EMA5'] - df['EMA40'] # 5日EMAと40日EMAの差を見るMACD (短期線と長期線の間隔)
df['MACD3'] = df['EMA20'] - df['EMA40'] # 20日EMAと40日EMAの差を見るMACD (中期線と長期線の間隔。帯の幅)
# 補助線
df['0'] = [0 for _ in df['Close']]
4.ステージ判定とステージに応じた色を設定
前回記事を参考にステージ判定とステージに応じた色を設定します。
# ステージ判定
df['Stage_MEA']=0
df.loc[(df['EMA5'] > df['EMA20']) & (df['EMA20'] > df['EMA40']), 'Stage_MEA'] = 1 # 上昇期
df.loc[(df['EMA20'] > df['EMA5']) & (df['EMA5'] > df['EMA40']), 'Stage_MEA'] = 2 # 上昇相場の終焉
df.loc[(df['EMA20'] > df['EMA40']) & (df['EMA40'] > df['EMA5']), 'Stage_MEA'] = 3
df.loc[(df['EMA40'] > df['EMA20']) & (df['EMA20'] > df['EMA5']), 'Stage_MEA'] = 4 # 下降期
df.loc[(df['EMA40'] > df['EMA5']) & (df['EMA5'] > df['EMA20']), 'Stage_MEA'] = 5 # 下降相場の終焉
df.loc[(df['EMA5'] > df['EMA40']) & (df['EMA40'] > df['EMA20']), 'Stage_MEA'] = 6
# ステージに応じた色を設定
df['Stage_color']='white'
df.loc[(df['Stage_MEA']==1), 'Stage_color'] = 'yellow' # 上昇期
df.loc[(df['Stage_MEA']==2), 'Stage_color'] = 'greenyellow' # 上昇相場の終焉
df.loc[(df['Stage_MEA']==3), 'Stage_color'] = 'c' # 下降相場の入口
df.loc[(df['Stage_MEA']==4), 'Stage_color'] = 'darkcyan' # 下降期
df.loc[(df['Stage_MEA']==5), 'Stage_color'] = 'c' # 下降相場の終焉
df.loc[(df['Stage_MEA']==6), 'Stage_color'] = 'greenyellow' # 上昇相場の入口
5.ローソク足チャートに追加して描画する
3で算出したdf['EMA5']、df['EMA20']、df['EMA40']、df['MACD1']、df['MACD2']、df['MACD3']をaddplotで追加します。addplotの中には、リスト形式で表示したいデータを指定します。
panelオプションでパネル番号を指定
colorオプションでプロットの色を指定
widthオプションで描画の線の太さを設定
移動平均線は0番目のパネルに、MACDは1番目のパネルに表示されます。
# スタイルを定義
my_style = mpf.make_mpf_style(
base_mpf_style='binance',
rc={
'xtick.labelsize': 12,
'ytick.labelsize': 12,
'grid.alpha': 0.7,
}
)
# 移動平均大循環分析(5日EMA、20日EMA、40日EMAを採用)
apd = [
mpf.make_addplot(df['EMA5'], color='red', width=1, panel=0), # 5日指数平滑移動平均線
mpf.make_addplot(df['EMA20'], color='green', width=1, panel=0), # 20日指数平滑移動平均線
mpf.make_addplot(df['EMA40'], color='blue', width=1, panel=0), # 40日指数平滑移動平均線
mpf.make_addplot(df['MACD1'], color='blue', width=1, panel=1), # MACD1
mpf.make_addplot(df['MACD2'], color='red', width=1, panel=1), # MACD2
mpf.make_addplot(df['MACD3'], color='green', width=1, panel=1), # MACD3(帯MACD)
mpf.make_addplot(df['MACD3'], type='bar', color='greenyellow', alpha=0.5, panel=1), # MACD3(帯MACD)
mpf.make_addplot(df['0'], color='grey', width=1, panel=1), # 補助線
]
# ラベルをつけてチャートを表示
fig, ax = mpf.plot(df, type='candle', volume=False, style=my_style, addplot=apd, title='Moving Average Cycles Analysis / MACD',
returnfig=True, figsize=(14, 10), datetime_format='%Y/%m/%d', tight_layout=True,
fill_between=dict(y1=df['EMA20'].values, y2=df['EMA40'].values, alpha=0.5, color='orange'),
# ゴールデンクロス・デッドクロス位置を一点鎖線表示
vlines=dict(vlines=df['Stage_MEA'].index.tolist(), colors=df['Stage_color'].tolist(), linewidths=6, alpha=0.4, linestyle='-'))
# ラベルを追加
ax[0].legend(['EMA5', 'EMA20', 'EMA40'])
ax[2].legend(['MACD1', 'MACD2', 'MACD3'])
# チャートを表示
fig.show()
ローソク足チャートの描画の参考
https://note.com/scilabcafe/n/nd0719f248df0
mplfinanceを使用して移動平均線大循環分析チャートに、ステージの移行を先読みすることが可能になる大循環MACDを追加することができました。