[Python numpy TA-lib Cryptowatch] BTC-FX の OHLCV データから ADX±DI を計算
TA-lib のメソッドを利用するだけだがまとめておく。
環境
コード
# -*- Coding: utf-8 -*-
import requests
import json
import numpy as np
import talib as ta
from datetime import datetime
# Main Logics
if __name__ == "__main__":
#ローソク足の時間を指定
periods = ["60"] # 60sec
#クエリパラメータを指定
query = {"periods": ','.join(periods), "before": "", "after": ""}
#ローソク足取得
rspJson = json.loads(requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc", params=query).text)
ohlcvs = rspJson["result"]
for period in periods:
ohlcv_data = ohlcvs[period]
ohlcv_ary = np.asarray(ohlcv_data) # Numpy で行列取得
ohlcv_aryT = ohlcv_ary.T # 転置して各要素に分解
# OHLCV を取得
ts = ohlcv_aryT[0]
op = ohlcv_aryT[1]
hi = ohlcv_aryT[2]
lo = ohlcv_aryT[3]
cl = ohlcv_aryT[4]
vol = ohlcv_aryT[5]
# ADX±DI の計算
adx = ta.ADX(hi, lo, cl, 14)
dip = ta.PLUS_DI(hi, lo, cl, 14)
dim = ta.MINUS_DI(hi, lo, cl, 14)
# 各要素を出力
for i in range(0, len(ts)):
print("{0},{1},{2},{3},{4},{5},{6},{7},{8}".format(datetime.fromtimestamp(ts[i]), op[i], hi[i], lo[i], cl[i], vol[i], adx[i], dip[i], dim[i]))
前回のコードとほとんど同じ。for ループに入る前の4行が、ADX±DI の計算箇所。
実行結果
長いので抜粋、末尾3データが ADX, +DI, -DI である。
ADX±DI は期間を指定して計算する指標のため、途中までは nan で返ってくる。15個目のデータから ±DI が、28個目のデータから ADX が算出されている。
2018-07-03 07:16:00,750324.0,750500.0,750173.0,750341.0,94.81735,nan,nan,nan
2018-07-03 07:17:00,750323.0,750332.0,749997.0,750084.0,45.80196,nan,nan,nan
2018-07-03 07:18:00,750084.0,750215.0,749776.0,749780.0,76.43604,nan,nan,nan
2018-07-03 07:19:00,749800.0,749849.0,749385.0,749660.0,105.79368,nan,nan,nan
2018-07-03 07:20:00,749655.0,750000.0,749648.0,749851.0,63.060913,nan,nan,nan
2018-07-03 07:21:00,749840.0,750011.0,749800.0,750011.0,66.802284,nan,nan,nan
2018-07-03 07:22:00,750011.0,750300.0,750011.0,750299.0,75.96811,nan,nan,nan
2018-07-03 07:23:00,750278.0,750405.0,750001.0,750097.0,77.098495,nan,nan,nan
2018-07-03 07:24:00,750080.0,750189.0,749800.0,749858.0,71.55821,nan,nan,nan
2018-07-03 07:25:00,749856.0,750116.0,749854.0,750104.0,59.86403,nan,nan,nan
2018-07-03 07:26:00,750103.0,750277.0,750042.0,750225.0,43.87076,nan,nan,nan
2018-07-03 07:27:00,750201.0,750367.0,750181.0,750265.0,35.681572,nan,nan,nan
2018-07-03 07:28:00,750266.0,750420.0,750255.0,750419.0,47.916317,nan,nan,nan
2018-07-03 07:29:00,750424.0,751358.0,750424.0,751202.0,134.96384,nan,nan,nan
2018-07-03 07:30:00,751200.0,751228.0,750821.0,751110.0,73.18534,nan,35.13566328447952,19.326568959037953
2018-07-03 07:31:00,751110.0,751196.0,750500.0,750688.0,93.75607,nan,30.348537465005926,22.977185313026535
2018-07-03 07:32:00,750688.0,750921.0,750620.0,750850.0,68.28405,nan,28.537668154858554,21.60615780420814
2018-07-03 07:33:00,750850.0,751680.0,750842.0,751205.0,40.332207,nan,37.95162175489821,18.32738034319654
2018-07-03 07:34:00,751188.0,751737.0,751019.0,751476.0,93.98379,nan,34.26529453454207,16.076324494651306
2018-07-03 07:35:00,751475.0,751497.0,751111.0,751274.0,81.0537,nan,31.9904399827529,15.009025921868554
2018-07-03 07:36:00,751274.0,751499.0,751157.0,751351.0,55.15939,nan,30.119518529775192,14.114896573831635
2018-07-03 07:37:00,751351.0,751447.0,751095.0,751291.0,94.171234,nan,28.253881301463586,14.331612495023471
2018-07-03 07:38:00,751282.0,751349.0,751020.0,751149.0,48.336872,nan,26.59571256483221,14.828392644582555
2018-07-03 07:39:00,751129.0,751129.0,750844.0,750984.0,42.08922,nan,25.123663777477027,17.201569789201308
2018-07-03 07:40:00,750985.0,751228.0,750818.0,751105.0,47.339794,nan,25.051163071213594,15.92550564883284
2018-07-03 07:41:00,751113.0,751950.0,751075.0,751551.0,57.672615,nan,33.421303048888056,13.605779442445638
2018-07-03 07:42:00,751950.0,752545.0,751142.0,752255.0,178.80176,nan,35.22761736474196,10.87137738734054
2018-07-03 07:43:00,752292.0,752323.0,751167.0,751977.0,72.679535,32.134282645863934,29.896230215495695,9.226090932188926
...
TradingView との比較、上が TradingView、下が Cryptowatch から取得した OHLCV をもとに計算した結果。Ctyptowatch の OHLCV と TradingView のローソク足データにズレがあるため、細かい数値には違いがあるが、概ね同じ波形になっているのが分かる。
解説
Cryptowatch から OHLCV データ取得
ここにまとめた。
ADX±DI の計算
メソッドはこちら。
real = ADX(high, low, close, timeperiod=14)
real = PLUS_DI(high, low, close, timeperiod=14)
real = MINUS_DI(high, low, close, timeperiod=14)
どれも high, low, close, timeperiod を渡すだけ。high, low, close はリスト型(配列)に古い順で並んでいる必要がある。また、timeperiod(デフォルト 14) 以上のデータが必要です。
実行結果部分でも書いた通り、途中まで nan が返ってくることに注意。
リファレンス
[参考] TA-lib を使わない方法
こちらが参考になる。
[参考] TA-lib その他
おわりに
有料(¥100)にしてるけど、これで内容は全部です。募金してくれる人がいれば、ジュース代としていただけると嬉しい。Pine スクリプトは、インデントくずれが起きるようなので、コピペ時には注意してください。
マガジン
コメント用note(未購入者向け)
干し芋
ここから先は
¥ 100
サポート頂けると励みになります BTC,BCH: 39kcicufyycWVf8gcGxgsFn2B8Nd7reNUA LTC: LUFGHgdx1qqashDw4WxDcSYQPzd9w9f3iL MONA: MJXExiB7T7FFXKYf9SLqykrtGYDFn3gnaM