【Python】コインチェックAPIの取得と自動売買の実践手順|Coincheck仮想通貨・ビットコイン取引機能入門

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

こんな方に向けた記事です
  • 暗号資産(仮想通貨)の自動取引に興味がある
  • Coincheck APIの取得方法が知りたい
  • Python環境でAPI機能を利用する方法が知りたい
  • 仮想通貨(ビットコイン等)の自動売買ツールを自作したい
目次

暗号資産(仮想通貨)の自動取引とは

仮想通貨の自動取引とは、通貨情報参照・決済・送金等の取引に関連する操作をプログラムで代替することを指します。

システム化された自動取引ツールを作成することで、手動操作による手間削減はもちろんのこと、仮想通貨収益化プロセスの効率化にも繋がります。

自動取引ツールの実装には「取引所が提供するAPI」が欠かせません。

APIと聞くと、難しく感じるかもしれませんが、実際に使ってみると意外と簡単!と思えるはずです。

本記事では仮想通貨の自動取引ツール作成に挑戦してみたい方向けに、Python環境でCoincheckのAPIを活用し、仮想通貨自動取引ツールを作成する方法について解説します。

なお、後述のPythonプログラムは、ビットコイン取引を例に言及しますが、ビットコイン以外の通貨にも横展開できる内容となっております。ビットトコイン以外の自作ツールを作成したい方も必見です!

様々な仮想通貨の自動売買手法はこちらの記事で解説しています。合わせてご覧下さい。

コインチェック(Coincheck)取引所の概要・API取得方法

【引用】公式

Coincheck取引所のAPIを用いて自動売買ツールを作成する前に、Coincheckの概要とAPIを利用する上で必要となる事前準備について言及します。

Coincheckとは、東証プライム上場マネックスグループ会社が運用する暗号資産取引所です。

2022年時点で国内最大級17種類の仮想通貨を取扱っていたり、Coincheckが提供する仮想通貨アプリは、アプリ画面の見やすさや使い勝手の良さに定評があることから、2019年仮想通貨アプリダウンロード数No1を記録したりなど、評判高い特徴を多数有しています。

Coincheckが提供するサービスのセキュリティレベルや安全性は非常に高く、金融庁に登録もされている暗号資産交換業者であるため、安心して活用できる点も好評です。

【参考】主要な仮想通貨取引所の比較情報

スクロールできます
取引所名最低取引量現物取引手数料*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現物の手数料を表示

Coincheckの取引所は取引時の手数料が無料であり、最低取引数量も低いという特徴から、仮想通貨取引未経験者にも優しい条件が揃っていると言えます。

また、ビットコイン価格取得や売買機能だけでなく送金系のAPI機能も提供しているため、高度かつ柔軟な自動取引ツールを作成したい方も必見です。

Coincheckの口座開設

仮想通貨の自動売買ツールには、APIの利用が必須です。

Coincheck APIを使うには、事前にCoincheckの口座開設をしておく必要があります

Coincheckの口座開設が未済の方は下記より開設手続きを行いましょう。口座開設はスマホと本人確認書類さえあれば10分で手続き完了でき、即日口座開設および暗号資産取引も瞬時に開始できます。

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

Coincheck APIアクセスキー・シークレットを取得

口座開設完了後は、APIを利用するための認証情報をCoincheckマイページから入手する必要があります。

以下、APIアクセスキーとシークレットキーの取得手順を示します。

【Python】Coincheck APIの使い方解説とビットコイン自動売買実践

仮想通貨自動取引をPythonで実現するために、次のようなCoincheck API機能の使い方を解説します。

No作成する自動売買機能
必須APIキー・シークレットキー設定
1取引通貨情報の取得
2板情報の取得
3残高情報の取得
4仮想通貨を注文
5仮想通貨の注文内容キャンセル
6注文内容の照会
7約定結果の確認
8入出金記録を確認
9ビットコインの送金

※Coincheck APIはccxtという暗号資産APIを容易に扱えるパッケージに対応しているため、そちらを用いることします。

事前にccxtをインストールしておきましょう!

pip install ccxt

APIキー・シークレットキーの設定

仮想通貨自動売買ツールの動作実行に必要なAPI認証情報を記述します。必要となるPythonパッケージも合わせてインポートしましょう。

import ccxt
from pprint import pprint

apiKey  = "APIアクセスキーを入力"
secret  = "シークレットキーを入力"

# Coincheck取引所のインスタンス作成
coincheck = ccxt.coincheck({'apiKey':apiKey,'secret':secret})

取引通貨情報の取得

Coincheckが取り扱う暗号資産情報は下記を実行することで確認可能です。

# 取引通貨
def market_info():
    result = coincheck.load_markets() 
    return result

# 出力
pprint(market_info())
# 出力イメージ
# {'BTC/JPY': {'base': 'BTC',
#              'baseId': 'btc',
#              'id': 'btc_jpy',
#              'limits': {'amount': {'max': None, 'min': None},
#                         'cost': {'max': None, 'min': None},
#                         'leverage': {'max': None, 'min': None},
#                         'price': {'max': None, 'min': None}},
#              'maker': 0.0,
#              'percentage': True,
#              'precision': {},
#              'quote': 'JPY',
#              'quoteId': 'jpy',
#              'spot': True,
#              'symbol': 'BTC/JPY',
#              'taker': 0.0,
#              'tierBased': False,
#              'type': 'spot'},
#  'ETC/BTC': {'base': 'ETC',
#              'baseId': 'etc',
#              'id': 'etc_btc',
#              'limits': {'amount': {'max': None, 'min': None},
#                         'cost': {'max': None, 'min': None},
#                         'leverage': {'max': None, 'min': None},
#                         'price': {'max': None, 'min': None}},
#              'maker': 0.0,
#              'percentage': True,
#              'precision': {},
#              'quote': 'BTC',
#              'quoteId': 'btc',
#              'spot': True,
#              'symbol': 'ETC/BTC',
#              'taker': 0.0,
#              'tierBased': False,
#              'type': 'spot'},
#  'ETC/JPY': {'base': 'ETC',
#              'baseId': 'etc',
#              'id': 'etc_jpy',
#              'limits': {'amount': {'max': None, 'min': None},
#                         'cost': {'max': None, 'min': None},
#                         'leverage': {'max': None, 'min': None},
#                         'price': {'max': None, 'min': None}},
#              'maker': 0.0,
#              'percentage': True,
#              'precision': {},
#              'quote': 'JPY',
#              'quoteId': 'jpy',
#              'spot': True,
#              'symbol': 'ETC/JPY',
#              'taker': 0.0,
#              'tierBased': False,
#              'type': 'spot'},
#  'FCT/JPY': {'base': 'FCT',
#              'baseId': 'fct',
#              'id': 'fct_jpy',
#              'limits': {'amount': {'max': None, 'min': None},
#                         'cost': {'max': None, 'min': None},
#                         'leverage': {'max': None, 'min': None},
#                         'price': {'max': None, 'min': None}},
#              'maker': 0.0,
#              'percentage': True,
#              'precision': {},
#              'quote': 'JPY',
#              'quoteId': 'jpy',
#              'spot': True,
#              'symbol': 'FCT/JPY',
#              'taker': 0.0,
#              'tierBased': False,
#              'type': 'spot'},
#  'MONA/JPY': {'base': 'MONA',
#               'baseId': 'mona',
#               'id': 'mona_jpy',
#               'limits': {'amount': {'max': None, 'min': None},
#                          'cost': {'max': None, 'min': None},
#                          'leverage': {'max': None, 'min': None},
#                          'price': {'max': None, 'min': None}},
#               'maker': 0.0,
#               'percentage': True,
#               'precision': {},
#               'quote': 'JPY',
#               'quoteId': 'jpy',
#               'spot': True,
#               'symbol': 'MONA/JPY',
#               'taker': 0.0,
#               'tierBased': False,
#               'type': 'spot'}}

板情報の取得

板情報は次のコードを実行して取得します。関数の引数には、通貨情報(symbol)を指定しましょう。

# 板情報
def ticker_info(symbol):
    result = coincheck.fetch_ticker(symbol=symbol)
    return result

# 引数情報
symbol = "BTC/JPY"

# 出力
pprint(ticker_info(symbol))
# 出力イメージ
# {'ask': 5560505.0,
#  'askVolume': None,
#  'average': None,
#  'baseVolume': 1780.57586135,
#  'bid': 5561750.0,
#  'bidVolume': None,
#  'change': None,
#  'close': 5560926.0,
#  'datetime': '2022-04-06T00:31:02.000Z',
#  'high': 5795245.0,
#  'info': {'ask': '5560505.0',
#           'bid': '5561750.0',
#           'high': '5795245.0',
#           'last': '5560926.0',
#           'low': '5505328.0',
#           'timestamp': '1649205062',
#           'volume': '1780.57586135'},
#  'last': 5560926.0,
#  'low': 5505328.0,
#  'open': None,
#  'percentage': None,
#  'previousClose': None,
#  'quoteVolume': None,
#  'symbol': 'BTC/JPY',
#  'timestamp': 1649205062000,
#  'vwap': None}

残高情報の取得

Coincheckに入金した日本円残高や仮想通貨残高情報を確認したい場合、次のように実行します。

# 残高
def balance_info():
    result = coincheck.fetchBalance()
    return result

# 出力
pprint(balance_info())
# 出力イメージ
# {'BTC': {'free': 3.0, 'total': 3.0, 'used': 0.0},
#  'ETC': {'free': 0.0, 'total': 0.0, 'used': 0.0},
#  'FCT': {'free': 0.0, 'total': 0.0, 'used': 0.0},
#  'JPY': {'free': 1000000, 'total': 1000000, 'used': 0.0},
#  'MONA': {'free': 0.0, 'total': 0.0, 'used': 0.0},
#  'free': {'BTC': 0.0,
#           'ETC': 0.0,
#           'FCT': 0.0,
#           'JPY': 110910.95445186,
#           'MONA': 0.0},   
#  'total': {'BTC': 0.0,
#            'ETC': 0.0,
#            'FCT': 0.0,
#            'JPY': 1000000,
#            'MONA': 0.0},
#  'used': {'BTC': 0.0, 'ETC': 0.0, 'FCT': 0.0, 'JPY': 0.0, 'MONA': 0.0}}

仮想通貨の注文

仮想通貨を注文できるコードは以下になります。

コード実行で実際に注文が走ります。取り扱いには十分注意です。

# 引数情報
order_symbol = 'BTC/JPY'   # 取引通貨
type_value   = 'limit'     # 注文タイプ(limit:指値注文, market:成行注文)
side_value   = 'buy'       # 買い(buy) or 売り(sell)
price_value  = 4000000     # 指値価格[円/BTC]
amount_value = 0.005       # 取引数量[BTC]


# 注文コード
order = coincheck.create_order(
                symbol = order_symbol,  # 取引通貨
                type = type_value,      # 注文タイプ
                side= side_value,       # 買 or 売
                amount= amount_value,   # 取引数量
                price=price_value,      # 指値価格
                )

# 結果出力
pprint(order)
# 出力イメージ
{'id': '1000000000',
 'info': {'amount': '0.005',
          'created_at': '2022-12-12T00:00:00.000Z',
          'id': '1000000000',
          'market_buy_amount': None,
          'order_type': 'buy',
          'pair': 'btc_jpy',
          'rate': '4000000.0',
          'stop_loss_rate': None,
          'success': True}}

ccxt.create_order()に次のような引数を渡してビットコインの注文を行なっています。

引数名概要必須or任意
symbol取引通貨必須
type成行(market)or指値(limit)必須
price指値価格指値注文では必須
side売買(buy or sell)必須
amount(またはquantity)仮想通貨取引数量必須

ビットコインの注文内容キャンセル

注文のキャンセルには、注文IDを引数に指定し、次のように実行します。

def OrderCancel(order_id, symbol):
    result = coincheck.cancel_order(
                    symbol = symbol,  # 取引通貨
                    id = order_id,    # 注文ID
                    )
    return result

# 引数情報
order_id = '1000000001'
symbol =   'BTC/JPY'

# 出力
pprint(OrderCancel(order_id,symbol))
# 出力イメージ
# {'id': '1000000001', 'success': True}

注文の照会

指値注文した際、約定せずに注文が残り続ける場合があります。そのような未約定の注文照会は、次のようなコードが有効です。

関数の引数には、通貨情報(symbol)を指定しましょう。

def OpenOrder(symbol):
    result = coincheck.fetchOpenOrders(symbol = symbol)
    return result

# 引数情報
symbol = 'BTC/JPY'

# 出力
pprint(OpenOrder(symbol))
# 出力イメージ
# [{'amount': -0.0015,
#   'cost': 5839.7265,
#   'datetime': '2022-06-00T00:00:00.000Z',
#   'fee': {'cost': 0.0, 'currency': None},
#   'fees': [{'cost': 0.0, 'currency': None}],
#   'id': '1000000001',
#   'info': {'created_at': '2022-06-00T00:00:00.000Z',
#            'fee': '0.0',
#            'fee_currency': None,
#            'funds': {'btc': '-0.0015', 'jpy': '500.0000'},
#            'id': '1000000001',
#            'liquidity': 'T',
#            'order_id': '1000000001',
#            'pair': 'btc_jpy',
#            'rate': '5000000.0',
#            'side': 'sell'},
#   'order': '1000000001',
#   'price': 3893151.0,
#   'side': 'sell',
#   'symbol': 'BTC/JPY',
#   'takerOrMaker': 'taker',
#   'timestamp': 111111111111,
#   'type': None},
# ]

約定結果の確認

約定した取引結果は、次に示すコードで確認できます。

通貨情報(symbol)を引数に指定しましょう。

def Yakujo(symbol):
    result = coincheck.fetchMyTrades(symbol = symbol)
    return result

# 引数情報
symbol = 'BTC/JPY'

# 出力
pprint(Yakujo(symbol))
# 出力イメージ
# [{'amount': -0.0015,
#   'cost': 5839.7265,
#   'datetime': '2022-06-00T00:00:00.000Z',
#   'fee': {'cost': 0.0, 'currency': None},
#   'fees': [{'cost': 0.0, 'currency': None}],
#   'id': '1000000001',
#   'info': {'created_at': '2022-06-00T00:00:00.000Z',
#            'fee': '0.0',
#            'fee_currency': None,
#            'funds': {'btc': '-0.0015', 'jpy': '500.0000'},
#            'id': '1000000001',
#            'liquidity': 'T',
#            'order_id': '1000000001',
#            'pair': 'btc_jpy',
#            'rate': '5000000.0',
#            'side': 'sell'},
#   'order': '1000000001',
#   'price': 3893151.0,
#   'side': 'sell',
#   'symbol': 'BTC/JPY',
#   'takerOrMaker': 'taker',
#   'timestamp': 111111111111,
#   'type': None},
# ]

ビットコインの送金

ビットコインの送金には、送り先のアドレスと送付数量[BTC]を引数に渡して次のように実行します。

ビットコインの送金はccxtに対応していないため、requestモジュールを用いて記述しています。

import json
import requests
import time
import hmac
import hashlib

def send_bitcoin(address,amount):
    
    # 認証情報
    timestamp = str(int(time.time()))
    base_url  = 'https://coincheck.com'
    path      = '/api/send_money'
    
    # 送付先情報
    params    = json.dumps({
                        "address": address,
                        "amount": amount,
                        })
   
    # リクエストメッセージ
    message   = timestamp + base_url + path + params

    # 署名:シークレットキーを用いて、上記messageをHMAC-SHA256 hash形式で署名した結果
    signature = hmac.new(
                    bytes(secret.encode('ascii')),
                    bytes(message.encode('ascii')),
                    hashlib.sha256
                ).hexdigest()

    # HTTPヘッダー作成
    headers = {
                'ACCESS-KEY': apiKey,
                'ACCESS-NONCE': timestamp,         # リクエスト毎に増加する必要のある正の整数。UNIXタイムスタンプを利用。
                'ACCESS-SIGNATURE': signature,     # 署名
                'Content-Type': 'application/json' # APIでサポートするデータ形式
            }
    
    return requests.post(base_url+path,             # リクエスト先
                         data=params,               # Post情報
                         headers=headers            # ヘッダー情報
                        ).json()
# 引数情報
address = '送り先のアドレス'  # 送り先のアドレス
amount  = 0.1              # 送付数量[BTC]

# 関数実行
send_bitcoin(address,amount)

# 出力イメージ
# {'success': True, 'address': 'xxxxxxxxxx'}

たまに以下のようなエラーに遭遇することがあるかもしれません。

{'success': False, 'error': 'Nonce must be incremented'}

このエラーに遭遇した場合、一度APIキーを新しく作成することで解消されることが多々あります。

合わせて読みたい

暗号資産の取引経験があり、レバレッジ取引もしたい方には、のAPIもおすすめです。

レバレッジ取引のAPI機能を活用すると、自作ツールでできることが大幅に広がります。

Coincheck同様「API機能が豊富」「最低取引単位を小さく設定できる」「取引時の手数料が低い」という特徴があるため、使い勝手が良いと言えます。

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

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

取引所別: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を活用した仮想通貨の自動取引

最後に

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

本記事をシェア!
目次