Pythonを使ってビットコインのDMI(方向性指数)を計算してみた

DMIとは

DMI(Directional Movement Index、方向性指数)とは、

トレンドの有無と強弱を探るために使われるトレンド系の指標で、順張り的な使い方をされる。
DMIは通常、以下3本のラインを使って売買の判断をします。

+DI 上昇トレンドである可能性を判断します
-DI 下降トレンドである可能性を判断します
ADX トレンドの強弱を判断します

*+DIが-DIを下から上に上抜いたら買いシグナル
*+DIが-DIを上から下に下抜いたら売りシグナル

更に、ADXが上昇していれば買いシグナル(上昇トレンド)、売りシグナル(下落トレンド)の信頼度がより高くなります。

画像1

↑後半パートで上のようなグラフをpythonで作成します。

計算式

計算式は少し複雑です。

■+DM、-DM  (上昇幅と下降幅)
+DM=本日の高値-昨日の高値
-DM=昨日の安値-本日の安値

上記の計算式が基本ですが、以下の条件があります。

+DM<0の時は+DM=0、-DM<0の時は-DM=0
+DM>-DMの時は-DM=0、-DM>+DMの時は+DM=0

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

■+DI、-DI 上昇の強さと下降の強さ
+DI=(N日間の+DMの合計/N日間のTRの合計)×100
-DI=(N日間の-DMの合計/N日間のTRの合計)×100
※通常Nは14を採用。

■ADX トレンドの強さ
DX=|(+DI)-(-DI)|/{(+DI)+(-DI)}×100
ADX=DXのN日平均

Pythonで計算

必要なライブラリをインポート

import datetime
import ccxt 
import pandas as pd
import matplotlib.pyplot as plt

ccxtのインストールが必要なので注意。

無い場合は下記のコマンドで「ccxt」をインストール
pip install ccxt

ろうそく足(日足)をbinanceから取得する。

# ろうそく足を取得する
def get_past_data(exchange, symbol, barsymbol, bar, period, end_day=None):
   if not end_day:
       timest = exchange.fetch_ticker(symbol)['timestamp']
   else:
       timest = day_to_unixtime(end_day)
   timest = timest - period*bar*60*1000
   candles = exchange.fetch_ohlcv(symbol, timeframe=barsymbol, since=timest, limit=min(500,period))
   pd_candles = pd.DataFrame(candles)
   return pd_candles

binance = ccxt.binance()
symbol = "BTC/USDT"
barsymbol = "1d"
bar = 60*24
period = 200 # ろうそく足の本数
candle = get_past_data(binance, symbol, barsymbol, bar, period)
timestamp = candle[0].values.tolist()
date = [datetime.datetime.fromtimestamp(timestamp[i]/1000) for i in range(len(timestamp))]
date = pd.to_datetime(date)
close = candle[4]
high = candle[2]
low = candle[3]


ろうそく足を日足から1時間足に変えたければ、
barsymbol = "1d"
bar = 60*24

barsymbol = "1h"
bar = 60
に変更すればOK。

DMIの計算

# DMIの計算
pDM = (high - high.shift(1))
mDM = (low.shift(1) - low)
pDM.loc[pDM<0] = 0
pDM.loc[pDM-mDM < 0] = 0
mDM.loc[mDM<0] = 0
mDM.loc[mDM-pDM < 0] = 0
# trの計算
a = (high - low).abs()
b = (high - close.shift(1)).abs()
c = (low - close.shift(1)).abs()
tr = pd.concat([a, b, c], axis=1).max(axis=1)
pDI = pDM.rolling(14).sum()/tr.rolling(14).sum() * 100
mDI = mDM.rolling(14).sum()/tr.rolling(14).sum() * 100
# ADXの計算
DX = (pDI-mDI).abs()/(pDI+mDI) * 100
DX = DX.fillna(0)
ADX = DX.rolling(14).mean()

グラフを作成

# グラフを作成
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(date,close,label='btc/usdt')
ax1.set_ylabel("btc/usdt")
ax1.axes.xaxis.set_visible(False)
ax2 = fig.add_subplot(2,1,2)
ax2.plot(date,pDI,label='+DI')
ax2.plot(date,mDI,label='-DI')
ax2.plot(date,ADX,label='ADX')
ax2.legend()
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

まとめ

Pythonを使ってビットコインのDMIを計算して、グラフ化しました。
実際のトレード判断に使えるか今後検証していきたいです。

↓取引所binance新規口座開設はこちら

上のリンクから登録すると、取引手数料が10%返却されてお得ですので是非。

↓有料部分には上のコードをまとめたファイルを貼っておきます。


ここから先は

0字 / 1ファイル

¥ 100

この記事が気に入ったらチップで応援してみませんか?