【Python】ccxtを活用した仮想通貨・ビットコイン取引の自動売買|板情報・価格・注文・約定APIの利用

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • 仮想通貨・ビットコインの自動売買に興味がある!
  • 仮想通貨の自動売買・取引を実現する最強ツール「ccxtライブラリ」について詳しく知りたい。
  • ccxtライブラリを用いたPythonプログラム構築方法が知りたい
目次

【仮想通貨ライブラリ】ccxtとは

ccxtとは複数の仮想通貨取引所のAPI操作が集約されたライブラリです。ccxtを実行することで複数取引所のAPIを容易に呼び出せます。ccxtで実行できる取引所のAPIは、パブリックAPIプライベートAPIを用いた場合で特徴が異なり、具体的に下記が実現できます。

パブリックAPI 取引所のアカウント登録なしに実行できる
プライベートAPI 取引所にアカウント登録し、APIキーとSecretキーを取得した上で実行できる

パブリックAPIを用いてできること

  • 取引所で取り扱っている通貨情報の取得
  • 板情報の取得
  • ローソク足の取得

プライベートAPIを用いてできること

  • 口座残高の取得
  • 仮想通貨の取引(注文)
  • 注文内容をキャンセル
  • (未約定の)注文状況を確認
  • 約定状況を確認

ccxtを用いたpythonプログラミング実践

本記事ではccxtで準備されている下記のメソッドを紹介します。

実施内容対応API利用メソッド
取引所で取り扱う通貨情報の取得Publicload_markets()
板情報の取得Publicfetch_ticker()
板情報+注文量の取得PubulicfetchOrderBook()
ローソク足の取得Publicfetch_ohlcv()
口座残高の取得Privatefetch_balance()
仮想通貨の取引(注文)Privatecreate_order()
注文内容をキャンセルPrivatecancel_order()
(未約定の)注文状況の確認Privatefetch_open_orders()
約定状況を確認Privatefetch_my_trades()

言語はPython主体とし、1つ1つのプログラム実行方法と出力イメージを見ていきましょう。

合わせて読みたい

残念ながらccxt非対応ですがのAPI利用も魅力的です。

「API機能が豊富」「最低取引単位を小さく設定可能」「取引時の手数料が低い」「レバレッジ取引ができる」という自動売買ツール作成に適したAPIが提供されています。

GMOコインのAPI利用手順は下記にまとめていますため、合わせてご覧ください。

ccxtの活用準備

ccxtライブラリを活用するには、事前にインストールが必要です。

pip install ccxt

【参考】ccxtが利用できるおすすめ暗号資産取引所

スクロールできます
取引所名最低取引量現物取引手数料*1入金手数料[円]入金手数料[BTC]出金手数料[円]送金手数料[BTC]信用取引API提供ccxt自動売買おすすめ
0.0001BTCMaker:-0.01%
Taker:0.05%
無料無料0円/
400円(大口出金)
無料×★★★★★
0.0001BTCMaker:-0.02%
Taker:0.12%
無料無料550円/
770円(3万円以上)
0.0006 BTC×★★★★☆
*20.001 BTC0.01〜0.15%0〜330 円無料220〜770 円0.0004 BTC★★★★☆
0.0001 BTC無料無料無料330 円無料××★★★★☆
0.0001 BTC無料無料無料330 円0.0005 BTC★★★★★
0.005 BTC無料無料無料407円0.0005 BTC×★★★★★
表:暗号資産取引所の比較表(最低取引量の単位はBTCで記載)
補足
  1. 現物取引手数料の対象通貨はBTC/JPY。手数料は約定数量 × 上記記載の割合[%]として算出可能。
  2. bitFlyerの取引手数料はLightningBTC現物の手数料を表示

代表的な国内の暗号資産(仮想通貨)取引所を上記に示します。

その中でもccxtに対応しており、自動取引とも相性が良い筆者おすすめの取引所は下記になります。

API取得手順はこちらAPI取得手順はこちらAPI取得手順はこちら
※口座開設ページは画像リンクからも確認できます

上記手数料比較表も参考にし、自動取引システムの方向性に合った取引所APIが利用できると良いですね。

ccxt利用|パブリックAPI

準備事項|オブジェクト作成

特定の取引所におけるパブリックAPIを呼び出すには、対象取引所に対応したオブジェクトを事前に生成する必要があります。下記のようにコードを実行しておきましょう。

import ccxt
from pprint import pprint

#オブジェクト生成 ccxt.●●●●()の●●●●部分は取引所名を入力
base = ccxt.coincheck()

上記はのパブリックAPIを呼び出すためにオブジェクトを例として記載しました。

ccxtでAPIが呼び出せる他の取引所はccxtのgithubライブラリから確認できます。

取引所で取り扱っている通貨情報の取得

指定した取引所の通貨情報(通貨レート)は下記を実行して取得できます。

markets = base.load_markets() 
#出力
pprint(markets)
# 出力結果
# {'BTC/JPY': {'base': 'BTC',
#              'baseId': 'btc',
#              'id': 'btc_jpy',
#              'limits': {'amount': {'max': None, 'min': None}
#                         'cost': {'max': None, 'min': None}
#                         'price': {'max': None, 'min': None}}
#              'maker': 0,
#              'percentage': True,
#              'precision': {},
#              'quote': 'JPY',
#              'quoteId': 'jpy',
#              'symbol': 'BTC/JPY',
#              'taker': 0,
#              'tierBased': False}}

板情報の取得

取引所の板情報は、fetch_ticker()メソッドに通貨情報を渡すこと取得できます。

ticker = base.fetch_ticker(symbol='BTC/JPY')

#出力
pprint(ticker)
# 出力結果
# {'ask': 6364567.0,
#  'askVolume': None,
#  'average': None,
#  'baseVolume': 1785.55388838,
#  'bid': 6363000.0,
#  'bidVolume': None,
#  'change': None,
#  'close': 6363373.0,
#  'datetime': '2021-05-03T05:58:02.000Z',
#  'high': 6394783.0,
#  'info': {'ask': 6364567.0,
#           'bid': 6363000.0,
#           'high': 6394783.0,
#           'last': 6363373.0,
#           'low': 6145001.0,
#           'timestamp': 1620021482,
#           'volume': 1785.55388838},
#  'last': 6363373.0,
#  'low': 6145001.0,
#  'open': None,
#  'percentage': None,
#  'previousClose': None,
#  'quoteVolume': None,
#  'symbol': 'BTC/JPY',
#  'timestamp': 1620021482000,
#  'vwap': None}

板情報+注文量の取得

取引所の板情報は、注文量と合わせてfetchOrderBook()メソッドでも取得できます。

orderbook = base.fetchOrderBook(symbol="BTC/JPY")

# 出力
pprint(result)
# 出力イメージ BTC価格     注文量
# {'asks': [[5570001.0, 2.5346],
#           [5570054.0, 0.0179],
#           [5570154.0, 0.0003],
#           [5570399.0, 0.0927],
#           [5570400.0, 0.01],
#           [5570564.0, 0.0161],
#           [5570771.0, 0.0488],
#           [5571631.0, 0.01],
#           [5571792.0, 0.01],
#           [5572025.0, 0.0466],
#           [5572194.0, 1.65],
#           [5572729.0, 0.1],
#  'bids': [[5570000.0, 0.0646],
#           [5569900.0, 0.0003],
#           [5569700.0, 0.0005],
#           [5568010.0, 0.001],
#           [5568000.0, 0.001],
#           [5567565.0, 0.0002],
#           [5567110.0, 0.3708],
#           [5567108.0, 3.5838],
#           [5566371.0, 0.01],
#           [5566327.0, 0.106],
#           [5566303.0, 0.01],
#  'datetime': '2022-04-06T11:56:41.308Z',
#  'nonce': None,
#  'symbol': 'BTC/JPY',
#  'timestamp': 1649246201308}

ローソク足の取得

取引所のローソク足の取得は、引数としてsymbol(通貨レート)、timeframe{時間足:’1m’, ‘5m’, ‘1h’, ‘1d’)を渡し、下記のように実行します。下記には15分足を作成する際のサンプルコードを示します。

candles = base.fetch_ohlcv(symbol='BTC/JPY',     # 暗号資産[通貨]
                           timeframe = '15m',    # 時間足('1m', '5m', '1h', '1d')
                           since=None,           # 取得開始時刻(Unix Timeミリ秒)
                           limit=None,           # 取得件数(デフォルト:100、最大:500)
                           params={}             # 各種パラメータ
                          )

#出力
pprint(candles)
# 出力結果
# [[1620020700000, //UTC timestamp
#   6363374.0,    // Open(開始値)
#   6364680.0,    // High(最高値)
#   6363373.0,    // Low(最安値)
#   6363373.0,    // Close(終値)
#   0.73488501    // Volume(出来高)
# ]]  

【補足】取引所によってはsince(データ取得開始時刻:Unix Time)を設定しないと動作しない場合があるようです。sinceを正確に設定する際のサンプルコードも下記に示します。

from datetime import datetime
import calendar

""" Unix Time取得 """
# 現在時刻
datenow = datetime.utcnow()

# Unix時刻変換
unixtime = calendar.timegm(datenow.utctimetuple())

# 15分前のUnixTime(ミリ秒)を算出
minute = 15
since = (unixtime - 60 * minute) * 1000

""" ローソク足情報取得 """
candles = base.fetch_ohlcv(symbol='BTC/JPY',     # 暗号資産[通貨]
                           timeframe = '15m',    # 時間足('1m', '5m', '1h', '1d')
                           since=since,          # 取得開始時刻(Unix Timeミリ秒)
                           limit=None,           # 取得件数(デフォルト:100、最大:500)
                           params={}             # 各種パラメータ
                          )

#出力
pprint(candles)

ccxt利用|プライベートAPI

特定の取引所におけるプライベートAPIの呼び出し方を解説します。プライベートAPIを呼び出すには、事前に取引所のサイトでアカウント登録を済ませた後、APIキーおよびSecretキーを取得しておく必要があります。

暗号資産の取引が初めての方は、CoincheckのAPIをおすすめします。即日口座開設ができ、他の取引所と比べて少額取引が可能です。そのため、万一のAPI取引失敗リスクを最小限に抑えることができるでしょう。

アカウントをお持ちでない方はこちら

既にAPI情報をお持ちの方はこのままお進みください。

準備事項|オブジェクト作成

まず、下記のように事前にオブジェクトを生成しておきましょう。

import ccxt
from pprint import pprint

#APIキー&シークレットキー
apiKey  = "APIキーを入力"
secret  = "シークレットキーを入力"

#オブジェクト生成 ccxt.●●●●()の●●●●部分は取引所名を入力
base = ccxt.coincheck({'apiKey':apiKey,'secret':secret})

口座残高の取得

指定の取引所の口座残高は、下記のように記載して取得できます。

balance = base.fetch_balance()

#出力
pprint(balance)
# 出力結果
# {'BTC': {'free': 1.0, 'total': 0.0, 'used': 0.0},
#  'JPY': {'free': 1000000, 'total': 1000000, 'used': 0.0},
#  'free': {'BTC': 1.0, 'JPY': 1000000},

上記ビットコイン(BTC)および日本円の口座残高をレスポンス結果の例として示しています。取引所が取り扱っている他の仮想通貨の口座残高も同様に取得可能です。

仮想通貨の取引(注文)

仮想通貨を実際に注文するには、下記のように記載して実行します。

order = base.create_order(
                symbol = 'BTC/JPY',    #通貨
                type   = 'limit',      #注文方法:market(成行)、limit(指値)
                price  = 4000000,      #指値の場合価格を指定
                side   = 'buy',        #購入(buy) or 売却(sell)
                amount = 0.005,        #購入数量[BTC]
                )

#出力
pprint(order)

仮想通貨の注文は、create_order()メソッドに以下の引数は渡すことで実現できます。

引数名 概要 必須or任意
symbol 通貨レート 必須
type 注文方法:limit(指値),market(成行) 必須
price 指値価格 指値注文(limit)では必須
side 売買方法(buy or sell) 必須
amount(またはquantity) 仮想通貨取引数量 必須
# 出力結果
# {'id': '3372744406',
#  'info': {'amount': '0.005',
#           'created_at': '2021-05-04T01:25:44.000Z',
#           'id': 3372744406,
#           'market_buy_amount': None,
#           'order_type': 'buy',
#           'pair': 'btc_jpy',
#           'rate': '4000000.0',
#           'stop_loss_rate': None,
#           'success': True}}

注文後のレスポンスには注文IDとその情報が含まれるのが特徴です。

暗号資産(仮想通貨)取引は、元本を保証するものでなく、価格変動により損失が生じるリスクがあります。お取引される際には、取引内容をよく理解し、ご自身の判断で行ってください。

注文内容をキャンセル

未約定の注文をキャンセルするには、引数として通貨レートと注文IDを渡して下記のように実行します。

#注文した際のID
order_id = '3372744406'

cancel_order = base.cancel_order(
                symbol = "BTC/JPY",
                id = order_id,)

#出力
pprint(cancel_order)
引数名 概要 必須or任意
symbol 通貨レート 必須
id 注文ID 必須
# 出力イメージ
# {'id': 3372744406, 'success': True}

注文キャンセルが成立すると、キャンセル対象の注文IDとステータスがレスポンスとして得られます。

(未約定の)注文状況の確認

注文内容の照会は、下記のように通貨レートを引数で渡すことで取得できます。

open_order = base.fetch_open_orders(symbol = 'BTC/JPY')

#出力
pprint(open_order)
# 出力結果
# [{'amount': 0.005,
#   'average': None,
#   'clientOrderId': None,
#   'cost': 0.0,
#   'datetime': '2021-05-04T01:25:45.000Z',
#   'fee': None,
#   'filled': 0.0,
#   'id': '3372744406',
#   'info': {'created_at': '2021-05-04T01:25:45.000Z',
#            'id': 3372744406,
#            'order_type': 'buy',
#            'pair': 'btc_jpy',
#            'pending_amount': '0.005',
#            'pending_market_buy_amount': None,
#            'rate': '4000000.0',
#            'stop_loss_rate': None},
#   'lastTradeTimestamp': None,
#   'price': 4000000.0,
#   'remaining': 0.005,
#   'side': 'buy',
#   'status': 'open',
#   'symbol': 'BTC/JPY',
#   'timestamp': 1620091545000,
#   'trades': None,
#   'type': None}]

約定状況の確認

約定後の取引内容の取得は、通貨レートを引数で渡して下記のように実行します。

trades = base.fetch_my_trades(symbol = 'BTC/JPY')

#出力
pprint(trades)
# 出力結果
# [{'amount': 0.01,
#   'cost': -53500.0,
#   'datetime': '2021-04-23T04:13:50.000Z',
#   'fee': {'cost': 0.0, 'currency': None},
#   'id': '357493257',
#   'info': {'created_at': '2021-04-23T04:13:50.000Z',
#            'fee': '0.0',
#            'fee_currency': None,
#            'funds': {'btc': '0.01', 'jpy': '-53500.0'},
#            'id': 357493257,
#            'liquidity': 'T',
#            'order_id': 3339115495,
#            'pair': 'btc_jpy',
#            'rate': '5350000.0',
#            'side': 'buy'},
#   'order': '3339115495',
#   'price': 5350000.0,
#   'side': 'buy',
#   'symbol': 'BTC/JPY',
#   'takerOrMaker': 'taker',
#   'timestamp': 1619151230000,
#   'type': None},]

【仮想通貨・ビットコイン】自動取引実践法・その他優良情報

最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。

取引所別:APIの取得手順と使い方の解説記事

スクロールできます
対応言語記事名
Python【GMOコイン】 APIで仮想通貨取引の自動化
Python【Huobi Japan】 APIで仮想通貨取引の自動化
Python【bitbank】 APIで仮想通貨取引の自動化
Python【Coincheck】APIで仮想通貨取引の自動化
Python【bitFlyer】APIで仮想通貨取引を自動化
Python【BITPOINT】APIで仮想通貨取引の自動化

機械学習やテクニカル分析を採用した仮想通貨取引の解説記事

スクロールできます
対応言語記事名指標
共通自動売買の種類・自作時のポイント全て
Pythonリアルタイムチャート分析基礎トレンド
Python移動平均線トレンド
Pythonゴールデンクロス・デッドクロストレンド
Pythonアービトラージ(裁定取引)時間・値幅
Pythonボリンジャーバンドオシレータ
PythonMACDオシレータ
PythonRSIオシレータ
Python時系列予測モデルの構築機械学習・AI
【トレンド】:値動きが上昇・下降どちらのトレンドなのか判断に有効
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効

その他仮想通貨自動トレード解説記事

スクロールできます
対応言語記事名
Python【データ収集】仮想通貨の過去データを大量取得する方法
Python【初心者向け】ccxtを活用した仮想通貨の自動取引
Node.js【初心者向け】ccxtを活用した仮想通貨の自動取引

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次