ccxtとは何か?
ccxt(CryptoCurrency eXchange Trading)とは、世界中の仮想通貨取引所に接続してデータ取得や取引するために使用されるライブラリです。
次のようなメリットがあります。
- ccxtライブラリのメソッド(関数)を使用することで、異なる仮想通貨取引所(コインチェック、ビットフライヤー、ビットバンクなど)であっても同じメソッド(関数)でアクセスできます。
主なメソッド
メソッドは「パブリックAPI」と「プライベートAPI」に分類されます。
- パブリックAPIは仮想通貨取引所の認証が不要のメソッド
- プライベートAPIは仮想通貨取引所の認証が必要なメソッド(取引所に登録し、認証用APIキーを取得する必要がある)
APIとは?
API(Application Programming Interface)とは、アプリケーション同士でデータをやりとりする際の窓口や、その仕様といった意味で使われます。
本来、仮想通貨取引所ごとにAPIの仕様が異なるため、データをやり取りするためには、その取引所のAPIの仕様に合わせて、コーディングをしないといけません。
しかし、ccxtを使用することで統一した書き方(メソッド)で仮想通貨取引所のAPIを利用することができます。
メソッドの主な機能としては以下のようなものがあります。
パブリックAPI | プライベートAPI |
---|---|
取引履歴の取得 板情報の取得 ローソク足の取得 など | 成行注文・指値注文 残高照会 資金の入出金 など |
サポートしている取引所
国内の主な取引所ですと、以下をサポートしています。
名前 | id |
---|---|
Coincheck(コインチェック) | coincheck |
bitbank(ビットバンク) | bitbank |
Zaif(ザイフ) | zaif |
bitFlyer(ビットフライヤー) | bitflyer |
idはccxtで仮想通貨取引所を指定する際に使用します。
公式ページにサポート取引所一覧があります。
ccxtの基本的な使い方
ccxtのインストール方法
Pythonの場合、pipを使用して次のようにインストールできます。
pip install ccxt
インスタンス化
取引所に接続して取引を開始するには、取引所idを使ってインスタンス化する必要があります。
言い換えると、インスタンス化の際に取引所を指定することになります。
具体にインスタンス化するためには、次のように「ccxt.」+「取引所id()」とします。
import ccxt
# インスタンス化
coincheck = ccxt.coincheck()
ここではコインチェックのid「coincheck」を使ってインスタンス化しています。
市場(markets)のシンボル
各取引所には「ビットコイン⇔円」、「イーサリアム⇔円」などの複数の市場(markets)があり、それを指定する必要があります。
しかし、仮想通貨取引所ごとに市場IDの書き方は異なります。
ccxtでは、それらを抽象化して共通の記号、シンボルで表し、市場を指定しやすくしています。
例えば、コインチェックのシンボル(市場)の一覧を取得するコードは次になります。
import ccxt
from pprint import pprint
# インスタンス化
coincheck = ccxt.coincheck()
# ロードマーケット
markets = coincheck.load_markets()
# シンボル一覧を取得
print(coincheck.id, coincheck.symbols)
「load_markets()」で取引所の市場のシンボルのリストをロードしてから、「coincheck.symbols」でシンボル一覧を表示します。
出力結果は次になります。
# 出力
coincheck ['BTC/JPY', 'ETC/BTC', 'ETC/JPY', 'FCT/JPY', 'MONA/JPY']
この「’BTC/JPY」などが市場のシンボルであり、この場合は「ビットコイン⇔円」の市場を表します。
一方、コインチェックの「取引所APIドキュメント」によると市場のidは次が利用可能とあります。
これを見ると、ccxtのシンボルとコインチェックの市場idでは、表記方法が異なることが分かります。
また、市場の数や種類も異なっています。
もしかするとccxtのアップデートがコインチェックのAPIの仕様変更に追い付いていないのかもしれません。
いずれにしても、ccxtのシンボルのリストにあっても、実際にデータ取得できないこともあるので注意が必要です。
実際に「ETC/BTC」の情報を取ろうとしても失敗しました。
コインチェックのビットコイン取引履歴データ取得
コインチェックのビットコイン取引履歴データを取得してみます。
まずコード全体を示し、その後、各部分の解説という流れです。
ただし、インスタンス化やロードマーケットについては、上で解説していますので省略します。
コード全体
# ライブラリのインポート
import ccxt
import pandas as pd
# インスタンス化
coincheck = ccxt.coincheck()
# ロードマーケット:取引所の市場シンボルのリスト等の情報を取得
markets = coincheck.load_markets()
# 取得するデータの件数
# 取引所によって最大件数が異なるようです
limit = 100
# 取引履歴の取得
trades = coincheck.fetch_trades('BTC/JPY', limit=limit)
# 必要なデータを抽出してpandas DataFrameへ変換
trades_df = pd.DataFrame([[d['id'],d['datetime'],d['side'],d['price'],d['amount'],d['cost']] for d in trades])
# 列名をセット
trades_df.set_axis(['id','datetime', 'side', 'price', 'amount', 'cost'], axis=1, inplace=True)
# 'datetime'のデータ型をdatetime型へ変換
trades_df['datetime'] = pd.to_datetime(trades_df['datetime'])
# 'datetime'のタイムゾーンを協定世界時(UTC)⇒日本標準時(JST)へ変換
trades_df['datetime'] = trades_df['datetime'].dt.tz_convert('Asia/Tokyo')
# pickle形式で保存
trades_df.to_pickle('trades_df.pickle')
コード解説
取引履歴の取得
# 取得するデータの件数
# 取引所によって最大件数が異なるようです
limit = 100
# 取引履歴の取得
trades = coincheck.fetch_trades('BTC/JPY', limit=limit)
「fetchTrades()」でコインチェックから取引履歴データを取得しています。
fetchTrades (symbol, since , limit )
- symbol : 市場のシンボルを設定
- since : いつからのデータにするか
- limit : 件数
ここでは、件数を100件にしています。
ちにみに、指定可能な最大件数は取引所によって異なるようです。
ccxtのマニュアルでも次のように書かれています。
取得データ(tradesの中身)は以下のようなものになります。
各項目の説明はccxtのマニュアルにあります。
# 取得データ
{'id': '247199559',
'info': {'id': '247199559',
'amount': '0.0019',
'rate': '4500001.0',
'pair': 'btc_jpy',
'order_type': 'sell',
'created_at': '2023-07-04T01:01:06.000Z'},
'datetime': '2023-07-04T01:01:06.000Z',
'timestamp': 1688432466000,
'symbol': 'BTC/JPY',
'type': None,
'side': 'sell',
'order': None,
'takerOrMaker': None,
'price': 4500001.0,
'amount': 0.0019,
'cost': 8550.0019,
'fee': None,
'fees': []},
{'id': '247199560',
'info': {'id': '247199560',
'amount': '0.0031',
'rate': '4500001.0',
'pair': 'btc_jpy',
'order_type': 'sell',
'created_at': '2023-07-04T01:01:06.000Z'},
'datetime': '2023-07-04T01:01:06.000Z',
'timestamp': 1688432466000,
'symbol': 'BTC/JPY',
'type': None,
'side': 'sell',
'order': None,
'takerOrMaker': None,
'price': 4500001.0,
'amount': 0.0031,
'cost': 13950.0031,
'fee': None,
'fees': []},
必要なデータを抽出、整形
# 必要なデータを抽出してpandas DataFrameへ変換
trades_df = pd.DataFrame([[d['id'],d['datetime'],d['side'],d['price'],d['amount'],d['cost']] for d in trades])
# 列名をセット
trades_df.set_axis(['id','datetime', 'side', 'price', 'amount', 'cost'], axis=1, inplace=True)
# 'datetime'のデータ型をdatetime型へ変換
trades_df['datetime'] = pd.to_datetime(trades_df['datetime'])
# 'datetime'のタイムゾーンを協定世界時(UTC)⇒日本標準時(JST)へ変換
trades_df['datetime'] = trades_df['datetime'].dt.tz_convert('Asia/Tokyo')
「fetchTrades()」で取得したデータそのものだと扱いにくいので、必要そうな項目を抽出して、pandas DateFrameに変換しています。
項目「’datetime’」がstring型でしたので、時刻として扱えるようにdatetime型へ変換しています。
最後にタイムゾーンを東京に変換しています。
pickle形式で保存
# pickle形式で保存
trades_df.to_pickle('trades_df.pickle')
データの読み書きが速いpickle形式で保存しています。
取引履歴のグラフ
試しに横軸を「’datetime’」、縦軸を「’price’」項目としてプロットすると、以下のようになります。