Pythonによるビットコイン価格取得:ローソク足描画まで

Python code
スポンサーリンク

[トレード口座開設はコチラ↓]

Cryptowatch APIが利用できない???

ビットコインのローソク足が必要になったため、久しぶりに定番のCryptowatch APIを利用しました。ところが、以下のようにCryptowatchからローソク足データを価格を呼び出そうとしてみたところ、うまく動かずエラーが返ってきました。

import request
base_url= f"https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=0"
res=requests.get(base_url)
print(res.json())
{'message': 'CW_API_Disabled', 'status': 410}

Cryptowatch APIは以前にも制限がかかったり有料になったりと、仕様変更はあったようですが、どうも2023年現在利用自体できなくなっているようです。
これに限らず暗号通貨のAPIは突然使えなくなったりすることもいくらでもあり得るので仕方がないといえば仕方がないですよね。

代替案としてのKraken API

代替案として、Kraken APIを使ってみました。

Coincheckなども以前はAPIを提供していましたが、現在は利用できないようです(2023年11月時点)。他に、Bitflyer APIなども動作します。こちらは日本語ドキュメントもあって扱いやすいですが、OHLCデータを提供していないため、板情報などから自身で作成する必要があります。
現状はKrakenがベストのようですが、こちらも今後仕様など変わる可能性があります。この業界の宿命ですね。

備忘録として利用方法を以下に記します。
*利用は自己責任でお願いいたします。

Kraken APIの使い方

通貨名がよくわからないため、とりあえずキーとして用いられている通貨名(の別名?)の一覧を取得します。

import request
base_url = 'https://api.kraken.com/0/public/'
endpoint='Assets'
resp = requests.get(base_url+endpoint)
res=resp.json()['result']
keys=res.keys()

for k in keys:
    if "X" in k[0]:
        print(k,res[k]["altname"])

とすると以下のように返ってきます。

XBT.M XBT.M
XCN XCN
XETC ETC
XETH ETH
XLTC LTC
XMLN MLN
XREP REP
XRT XRT
XTZ XTZ
XTZ.S XTZ.S
XXBT XBT
XXDG XDG
XXLM XLM
XXMR XMR
XXRP XRP
XZEC ZEC

どうやら、通貨名の読み替えが必要なようで、暗号通貨の頭文字にXが必要なようです。

ローソク足は、”OHLC?pair=XXXX”のように指定します。
ここでは”XBTJPY”を指定します。

import request
from datetime import datetime

interval=1440 # minute
onset=datetime.now()

params = {"interval":interval, "since":onset}
base_url='https://api.kraken.com/0/public/'
endpoint='OHLC?pair=XBTJPY'
response=requests.get(base_url+endpoint,params=params)
data = response.json()

data内には、以下のようなJSON形式でローソク足データが入っています。

{'error': [],
 'result': {'XXBTZJPY': [[1700063100,
    '5479429',
    '5479429',
    '5479429',
    '5479429',
    '0',
    '0.00000000',
    0],
   [1700063160,
    '5479429',
    '5479429',
    '5479429',
    '5479429',
    '0',
    '0.00000000',
    0],
   [1700063220,
    '5479429',
    '5479429',
    '5479429',
    '5479429',
    '0',
    '0.00000000',
    0],
...
    '5665000',
    '0',
    '0.00000000',
    0]],
  'last': 1700106180}}

JPYなどの普通通貨の頭文字にはZが必要のよう(?)です。(X–Z—のような形式となります。)
このあたりドキュメントにも明記されていないようでよくわかりませんでした。
とにもかくにも、取得データのJSON表記に従うしかありませんので、今の場合”XXBTZJPY”となります。
(ドル建ての場合は”XBTUSD”となり、JSON内では”XXBTZUSD”となります。)

data[“result”][“XXBTZJPY”]

とするとある時刻におけるデータを取り出せます。
データの中身は、Krakenのドキュメントによると、「時間、Open, High, Low, Close, VWAP, Volume, カウント」の8種類となっています。

今はローソク足に必要な時間とOHLCのみ抽出します。

ohlc = []
for i in data["result"][currency_name]:
    ohlc.append({
        "close_datetime" : datetime.fromtimestamp(i[0]), 
        "open_price" : i[1],
        "high_price" : i[2],
        "low_price" : i[3],
        "close_price": i[4] })  

抽出されたohlcデータには以下のようになります。

[{'close_datetime': datetime.datetime(2023, 11, 16, 2, 35),
  'open_price': '5494595',
  'high_price': '5494595',
  'low_price': '5494595',
  'close_price': '5494595'},
 {'close_datetime': datetime.datetime(2023, 11, 16, 2, 36),
  'open_price': '5494595',
  'high_price': '5494595',
  'low_price': '5494595',
  'close_price': '5494595'},
 {'close_datetime': datetime.datetime(2023, 11, 16, 2, 37),
  'open_price': '5494595',
  'high_price': '5494595',
  'low_price': '5494595',
  'close_price': '5494595'},
 {'close_datetime': datetime.datetime(2023, 11, 16, 2, 38),
  'open_price': '5494595',
  'high_price': '5494595',
  'low_price': '5494595',
  'close_price': '5494595'},
 {'close_datetime': datetime.datetime(2023, 11, 16, 2, 39),
  'open_price': '5494595',
  'high_price': '5494595',
  'low_price': '5494595',
  'close_price': '5494595'},
...
 {'close_datetime': datetime.datetime(2023, 11, 16, 14, 34),
  'open_price': '5665000',
  'high_price': '5665000',
  'low_price': '5665000',
  'close_price': '5665000'}]

Plotlyによるローソク足の描画

[トレード口座開設はコチラ↓]

描画のためにpandasのDataFrameに変換しておきます。

import pandas as pd
price=pd.DataFrame.from_dict(ohlc)

次にplotlyでローソク足を描画します。

from plotly.graph_objs import *
trace = {
    'type': 'candlestick',
    'x': price['close_datetime'],
    'yaxis': 'y2',
    'low': price['low_price'],
    'high': price['high_price'],
    'open': price['open_price'],
    'close': price['close_price']
}
fig = Figure(data=[trace])
fig.show()
XBTJPYのローソク足(日)

Plotlyはインタラクティブなグラフを提供してくれます。
下の小さいボックスの方で描画範囲の指定ができます。

コード完全版(コピペで動きます) / Complete code

全体のコードは以下のようになります。

from datetime import datetime
import requests
import pandas as pd
from plotly.graph_objs import *

# 取得する通貨名を指定
currency_name="XBTUSD"
base_url='https://api.kraken.com/0/public/'
endpoint='OHLC?pair='+currency_name

# currency_pairごとのJSON内表記の対応。これは調べるしかない。
currency_dict={
    "XBTJPY" : "XXBTZJPY",
    "XBTUSD" : "XXBTZUSD"
}

onset=datetime.now()

def plot_candle(currency_name, interval):
    # KrakenAPIによりRawデータをJSON形式で取得
    params = {"interval":interval, "since":onset}
    response=requests.get(base_url+endpoint,params=params)
    data = response.json()

    # ローソク足に必要なデータだけを抽出し、DataFrameに変換
    ohlc = []
    for i in data["result"][currency_dict[currency_name]]:
        ohlc.append({
            "close_datetime" : datetime.fromtimestamp(i[0]), 
            "open_price" : i[1],
            "high_price" : i[2],
            "low_price" : i[3],
            "close_price": i[4] })
    price=pd.DataFrame.from_dict(ohlc)

    # ローソク足データを描画
    trace = {
        'type': 'candlestick',
        'x': price['close_datetime'],
        'yaxis': 'y2',
        'low': price['low_price'],
        'high': price['high_price'],
        'open': price['open_price'],
        'close': price['close_price']
    }
    fig = Figure(data=[trace])
    fig.show()

ドル建ての週足を描画したい場合は以下のようにします。

plot_candle('XBTUSD', 10080)
XBTUSDのローソク足(週)

描画の開始時点を変更したい場合には、変数onsetを変更したり、引数として与えるようにしてください。

以上となります。
ちょっと面倒な箇所もありますが、これで様々な暗号通貨ペアの価格取得が行なえます。
板情報なども取得できますので、さらに踏み込んで知りたい方はKrakenのドキュメントをご参照ください。

楽しんでいただけましたでしょうか?
この記事がみなさまのお役に立てればうれしいです♪

♪♪♪ Have a nice coding day ♪♪♪

[トレード口座開設はコチラ↓]

コメント

タイトルとURLをコピーしました