【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本の移動平均線の並び順のパターンよりステージに分類されます。


3本の移動平均線の並び順には全部で6種類あります。それぞれを第1ステージ~第6ステージと名付けました。(下図参照)

価格変動の中でステージは基本的に時計回りで推移し、ときに一時的に反時計回りで推移します。つまり現在が第1ステージであれば、次に移行するのは第2ステージが基本で、ときに第6ステージに戻ることもあります。これ以外の展開はありません。つまりステージを確認することで次の展開が読みやすくなるのです。

この並び順は移動平均線と移動平均線のクロスによってステージが変化していきますが、ステージの変化は下図の順で変化するのが基本です。

SBI証券 移動平均線大循環分析 by 小次郎講師より抜粋

また、6つのステージにはそれぞれ特徴があります。

第1ステージ・・・安定上昇期
3本の移動平均線が右肩上がりであれば「買い」にエッジがある状態。
安定上昇になりやすいステージ。
トレンドがすぐに終わるときは逆行して第6ステージに移行するが、トレンドが出来れば次のステージは第2ステージとなる。

第2ステージ・・・上昇相場の終焉
上昇トレンドに勢いが無ければ順行して第3ステージとなる。
上昇トレンドが継続するときは逆行して第1ステージに移行する。

第3ステージ・・・下降相場の入り口
下降の勢いが強ければ順行して第4ステージとなる。
上昇する動きが強くなれば逆行して第2ステージに移行する。
第2、第3ステージが続く場合はもみ合い相場の可能性が高い。

第4ステージ・・・安定下降期
3本の移動平均線が右肩下がりであれば「売り」にエッジがある状態。
安定下降になりやすいステージ。
トレンドがすぐに終わるときは逆行して第3ステージに移行するが、トレンドが出来れば次のステージは第5ステージとなる。

第5ステージ・・・下降相場の終焉
下降トレンドに勢いが無ければ順行して第6ステージとなる。
下降トレンドが継続するときは逆行して第4ステージに移行する。

第6ステージ・・・上昇相場の入り口
上昇の勢いが強ければ順行して第1ステージとなる。
下降する動きが強くなれば逆行して第5ステージに移行する。
第5、第6ステージが続く場合はもみ合い相場の可能性が高い。

SBI証券 移動平均線大循環分析 by 小次郎講師より抜粋
SBI証券 移動平均線大循環分析 by 小次郎講師より抜粋

下記のコードでは、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を使用してローソク足チャートに移動平均線大循環分析チャートを描画することで、相場動向を視覚的に分かりやすく把握することができます。


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