Pythonを使ってビットコインのDMI(方向性指数)を計算してみた
DMIとは
DMI(Directional Movement Index、方向性指数)とは、
トレンドの有無と強弱を探るために使われるトレンド系の指標で、順張り的な使い方をされる。
DMIは通常、以下3本のラインを使って売買の判断をします。
+DI 上昇トレンドである可能性を判断します
-DI 下降トレンドである可能性を判断します
ADX トレンドの強弱を判断します
*+DIが-DIを下から上に上抜いたら買いシグナル
*+DIが-DIを上から下に下抜いたら売りシグナル
更に、ADXが上昇していれば買いシグナル(上昇トレンド)、売りシグナル(下落トレンド)の信頼度がより高くなります。
↑後半パートで上のようなグラフを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%返却されてお得ですので是非。
↓有料部分には上のコードをまとめたファイルを貼っておきます。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?