【Python】【テクニカル分析】移動平均線大循環分析チャートを描画する
移動平均線大循環分析は、日足チャートにおいて、短期線(5)・中期線(20)・長期線(40)の3本の移動平均線の並び順と傾き、そして中期線、長期線の間の間隔を分析し、今後相場の展開を予測する分析手法で、小次郎講師が考案した分析手法です。
相場動向を視覚的に分かりやすく把握することができ、価格変動の中で買いにエッジが発生する局面、売りにエッジが発生する局面を見つけ出すことができる非常にわかりやすい手法だと思います。
ここでは株価データを取得し、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)
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本の移動平均を算出する
移動平均線大循環分析では、短期、中期、長期の指数平滑移動平均(EMA:Exponential Moving Average)を算出し、3本の移動平均線の並び順のパターンよりステージに分類されます。
下記のコードでは、Ta-Lib(Technical Analysis Library)を使用して、短期5日指数平滑移動平均線、中期20日指数平滑移動平均線、長期40日指数平滑移動平均線を算出しています。また、算出した値を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日指数平滑移動平均線
4.ステージ判定とステージに応じた色を設定
短期5日指数平滑移動平均線(EMA5)、中期20日指数平滑移動平均線(EMA20)、長期40日指数平滑移動平均線(EMA40)の並び順より、ステージ1から6にナンバリングします。
# ステージ判定
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']をaddplotで追加します。addplotの中には、リスト形式で表示したいデータを指定します。
panelオプションでパネル番号を指定
colorオプションでプロットの色を指定
widthオプションで描画の線の太さを設定
# スタイルを定義
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日指数平滑移動平均線
]
# ラベルをつけてチャートを表示
fig, ax = mpf.plot(df, type='candle', volume=False, style=my_style, addplot=apd, title='Moving Average Cycles Analysis',
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'])
# チャートを表示
fig.show()
ローソク足チャートの描画の参考
https://note.com/scilabcafe/n/nd0719f248df0
mplfinanceを使用してローソク足チャートに移動平均線大循環分析チャートを描画することで、相場動向を視覚的に分かりやすく把握することができます。