【Python】ccxtを使用した仮想通貨のデータ取得の基礎

目次(このページで分かること)

ccxtとは何か?

ccxt(CryptoCurrency eXchange Trading)とは、世界中の仮想通貨取引所に接続してデータ取得や取引するために使用されるライブラリです。

次のようなメリットがあります。

  • ccxtライブラリのメソッド(関数)を使用することで、異なる仮想通貨取引所(コインチェック、ビットフライヤー、ビットバンクなど)であっても同じメソッド(関数)でアクセスできます。

なお、ccxtは何かのサーバなどではなく、あくまでライブラリですので、各仮想通貨取扱所には自分のPCからの直接アクセスになります。(自分のPCで実行した場合)

主なメソッド

メソッドは「パブリックAPI」と「プライベートAPI」に分類されます。

パブリック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は次が利用可能とあります。

 btc_jpy, etc_jpy, lsk_jpy, mona_jpy, omg_jpy, plt_jpy, fnct_jpy, dai_jpy

これを見ると、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のマニュアルでも次のように書かれています。

一部の取引所は上場した日から始まる取引を返しますが、他の取引所は縮小した取引セット(過去 24 時間、過去 100 件の取引など)を返します。

取得データ(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’」項目としてプロットすると、以下のようになります。

    ご意見・ご感想をください
    葉っぱ

    サイトをご訪問いただき、ありがとうございました。
    このサイトの作成者の葉っぱです。
    分かりやすく、面白いサイトを作るため、ご意見・ご感想をいただけると嬉しいです。
    いただく際は次のTwitterのDM、もしくはページ下部の「お問い合わせ」からお願いいたします。

    よかったらシェアしてね!
    • URLをコピーしました!
    • URLをコピーしました!
    目次(このページで分かること)