【Python】【テクニカル指標】DMI(プラスDI, マイナスDI, ADX)のローソク足への追加描画

DMI(Directional Movement Index)は、J.Wells Wilder.Jrが1970年代半ばに開発したトレンドの強弱をはかるテクニカル指標です。ADX(Average Directional Index)をDMIの中に含むケースと独立してADXという指標として使われるケースもあるようです。このADXは真のトレンドの有無(トレンド相場かもみあい相場か)を判定するほとんど唯一の指標とも言われています。

これらの指標は、特に相場がトレンドともみ合い相場を行き来する場合や、新しいトレンドの開始を見極めたい場合に利用され、多くのテクニカルアナリストから賞賛されているテクニカル指標のようです。

参考までにテクニカルアナリストのコメントを小次郎講師が紹介しているYouTube動画を紹介しておきます。
以下、小次郎講師YouTubeチャンネルより抜粋

・ADXを正しく読み取ることが出来れば儲かる相場を見つけられる確率は大きく上がるだろう。
・これは極めて応用範囲の広い非常に有効な指標である。
・結論としてあらゆるテクニカル指標の中でADXは最も使える指標である

「マーケットのテクニカル秘録」著者 チャールズ・ルボー

「最も勝てる可能性の高い相場」を選択する手助けするものとして、自身を持って薦めたい。

「マーケットのテクニカル秘録」共著者 デビッド・ルーカス

あらゆる指標の中でDMIは最もドローダウンが少なかった。

「エンサイクロペディア・オブ・テクニカル・マーケット・インディケーター」著書 
コルビー、マイアーズ



ここでは株価データを取得し、mplfinanceを使用してローソク足チャートを描画し、ローソク足チャートにDMI(プラスDI, マイナスDI, ADX)を追加ていきます。

なお、最低限のポイントのみの説明にするため、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)を使用することでもプラスDI、マイナスDI、ADXを算出することができます。Ta-Libはさまざまなテクニカル指標を計算するためのPythonのライブラリです。

import mplfinance as mpf
import talib as ta

https://note.com/scilabcafe/n/nd0719f248df0


3.プラスDI, マイナスDI, ADXを算出する

プラスDIは上昇力を示し、マイナスDIは下降力を示します。プラスDIが上昇していると買い勢力が増加している、マイナスDIが増加していると売り勢力が増加していると見ます。プラスDIとマイナスDIがクロスするところで売り勢力と買い勢力の主役交代となると見ます。ADXについては、トレンドができる時には上昇時も下降時もどんどん値が上昇していきます。トレンドに勢いがなくなるとADX値は下降に転じます。

①プラスDI (Positive Directional Index):
一日の最大値動きの中で上昇幅がどのくらいかを計算した指標。上昇力を表します。

②マイナスDI (Negative Directional Index):
一日の最大値動きの中で下降幅がどのくらいかを計算した指標。下降力を表します。

PDM = 本日の高値 - 昨日の高値
MDM = 昨日の安値 - 本日の安値

ただし、PDM < 0 の時は PDM = 0,     MDM < 0 の時は MDM = 0
    (PDM, MDMは 0 以下の値はとらない)
              PDM > MDM の時は MDM = 0,     MDM > PDM の時は PDM = 0
    (1日の中では大きい方を採用する)

A = 本日の高値 - 前日の終値
B = 前日の終値 - 本日の安値
C = 本日の高値 - 本日の安値
とすると、一日の最大値動きTR(True Range)は、
TR = MAX (A, B, C)  ・・・・ TRはABCの中の最大値

+DI =(N日間の PDM の合計 / N日間の TR の合計)× 100
- DI =(N日間の MDM の合計 / N日間の TR の合計)× 100
※ 通常 N は14 
を採用。Nは本来パラメーターであるが、ワイルダーは14という数字をハーフサイクルとして重要視した。

つまり意味するところをまとめると、
本日の高値が昨日の高値を更新した部分を上昇力とし、本日の安値が昨日の安値を更新した部分を下降力とした場合、一定期間の値動き全体の中で上昇力部分が何%を占め、下降部分が何%を占めるかを算出したのがDMI(方向性指数)であり、トレンドの方向性と強さを知ることができる指標といえる。

過去N日間の値動き合計を、上昇波と下降波ともみ合いにわけたものなので、100に近づくのは極めて困難である。30を超えると大きい。20を下回ると小さいというのが一つの目安になる。通常5~70くらいの動きで50を超えることもめったにない。

③ADX (Average Directional Index):

DX = | プラスDI - マイナスDI | / (プラスDI + マイナスDI ) × 100
ADX = DX の N 日平均

※ 通常 N は14 を採用

ADXは、DMIの一部として用いられDMIから計算されます。
具体的には、DMIで計算された+DIと-DIの差の絶対値と、+DIと-DIの合計の比率(DX)を求め、これらの平均を取ることでADXR(平均振幅指数)が得られます。通常は14日間の単純移動平均がADXRとされ、これがADXと呼ばれる指標です。

ADXは、もみ合い部分を省き、上昇力と下降力だけを見ているため数値が変化しやすいため、25から30を目安にすると良いと言われる。通常5~60くらいの動きを取り、10を割ることも50を超えることもめったにない。

注意事項としては、上昇力と下降力を表すプラスDI, マイナスDIを計算にしているため、もみあい相場を意識してない点に注意が必要といえる。

<DXの意味>

小次郎講師YouTubeチャンネルより抜粋


下記のコードでは、Ta-Lib(Technical Analysis Library)を使用して、プラスDI、マイナスDI、ADXを算出しています。また、算出したそれぞれの値をdfのカラムに追加しています。

なお、下記サンプルで用いる各パラメータの値はすべて、timeperiod=14 を利用しています。

# DMI
df['+DI'] = ta.PLUS_DI(df['High'], df['Low'], df['Close'], timeperiod=14)
df['-DI'] = ta.MINUS_DI(df['High'], df['Low'], df['Close'], timeperiod=14)
df['ADX'] = ta.ADX(df['High'], df['Low'], df['Close'], timeperiod=14)


4.ローソク足チャートに+DI, -DI, ADXを追加して描画する

3で算出したdf['+DI']、df['-DI']、df['ADX']をaddplotで追加します。addplotの中には、リスト形式で表示したいデータを指定します。

  • panelオプションでパネル番号を指定

  • colorオプションでプロットの色を指定

  • widthオプションで描画の線の太さを設定

ローソク足は0番目のパネルに、+DIと-DIは1番目のパネルに、ADXは2番目のパネルに表示されます。

# スタイルを定義
my_style = mpf.make_mpf_style(
    base_mpf_style='binance',
    rc={
        'xtick.labelsize': 20,
        'ytick.labelsize': 20,
        'grid.alpha': 0.7,
    }
)
    
    
# 移動平均大循環分析(5日EMA、20日EMA、40日EMAを採用)
apd = [       
    # +DIと-DI, ADXを描画
    mpf.make_addplot(df['+DI'], color='blue', width=1, panel=1),
    mpf.make_addplot(df['-DI'], color='red', width=1, panel=1),
    mpf.make_addplot(df['ADX'], color='green', width=1, panel=2),
    mpf.make_addplot(df['ADX'], type='bar', color='greenyellow', alpha=0.5, panel=2),
]
    
# ラベルをつけてチャートを表示
fig, ax = mpf.plot(df, type='candle', volume=False, style=my_style, addplot=apd, title='DMI(+DI,-DI, ADX) ',
                     returnfig=True, figsize=(12, 10), datetime_format='%Y/%m/%d', tight_layout=True)


# ラベルを追加
ax[2].legend(['+DI', '-DI'])
ax[4].legend(['ADX'])


# チャートを表示
fig.show()



ローソク足チャートの描画の参考

https://note.com/scilabcafe/n/nd0719f248df0

mplfinanceを使用してローソク足チャートにDMI(+DI, -DI, ADXを)を追加しました。DMIを利用することで、真のトレンドの有無(トレンド相場かもみあい相場か)を判定することや、トレンドの開始を見極めたい場合に利用でき、より詳細なテクニカル分析が可能になります。


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