CCXTを使って仮想通貨のトレードをしてみる(第1回)

はじめに

楽に小銭を設ける手段として、仮想通貨の自動トレードを思いつきました。面倒なことはすべてPCに任せて、不労所得を得ようという算段です。

仮想通貨市場は24時間365日動き続けており、手動での取引には限界があります。そこで注目されているのが、プログラムを使った自動取引です。今回から数回に分けて、Python用の仮想通貨取引ライブラリ「CCXT」を使った取引の基本から応用までを解説していきます。

この第1回では、CCXTの基本概念から環境構築、そして実際に市場データを取得するところまでを詳しく説明します。プログラミング初心者の方でも理解できるよう、丁寧に進めていきますので、ぜひ最後までお付き合いください。

CCXTとは?

CCXTの概要

CCXT(CryptoCurrency eXchange Trading Library)は、100以上の仮想通貨取引所に統一されたインターフェースでアクセスできるオープンソースライブラリです。2017年に開発が開始され、現在では世界中の開発者に利用されています。

なぜCCXTを選ぶのか?

1. 統一されたAPI
各取引所は独自のAPIを提供していますが、CCXTを使うことで同じコードで複数の取引所にアクセスできます。例えば、Binanceで動くコードを少しの修正でKrakenでも動かすことが可能です。

2. 豊富な対応取引所
主要な取引所のほとんどをサポートしており、日本の取引所(bitFlyer、Coincheck等)も含まれています。

3. アクティブな開発
定期的にアップデートされており、新しい取引所への対応や機能追加が継続的に行われています。

4. 多言語対応
PythonだけでなくJavaScript(Node.js)、PHP等でも利用可能です。

対応している主要取引所

  • 海外取引所: Binance、Coinbase Pro、Kraken、Bitfinex、Huobi、OKX等
  • 国内取引所: bitFlyer、Coincheck、Zaif等

環境セットアップ

必要な環境

CCXTを使用するために以下の環境を準備しましょう:

  • Python 3.7以上 (推奨:Python 3.8以上)
  • pip (Pythonパッケージ管理ツール)
  • テキストエディタまたはIDE (Visual Studio Code、PyCharm等)

Pythonのインストール確認

まず、Pythonがインストールされているか確認します:

python --version
# または
python3 --version

Python 3.7以上が表示されればOKです。インストールされていない場合は、Pythonの環境構築を参照してください。

CCXTのインストール

以下のコマンドでCCXTと関連ライブラリをインストールします:

pip install ccxt pandas numpy requests

各ライブラリの役割:

  • ccxt: 仮想通貨取引所API用ライブラリ
  • pandas: データ分析・操作用ライブラリ
  • numpy: 数値計算用ライブラリ
  • requests: HTTP通信用ライブラリ

インストール確認

Pythonインタープリターまたはスクリプトで以下を実行し、エラーが出なければインストール成功です:

import ccxt
print(f"CCXT version: {ccxt.__version__}")
print(f"対応取引所数: {len(ccxt.exchanges)}")

取引所のAPI設定

APIキーの取得手順(CoinCheck例)

  1. CoinCheckアカウントの作成

  2. APIキーの生成

    • ログイン後、「設定」→「API設定」へ移動
    • 「新しいAPIキーを追加」をクリック
    • API名を入力(例:「Python Trading Bot」)
    • 二段階認証を完了してAPIキーとシークレットキーを取得
  3. 権限設定

    • 読み取り専用: 市場データ・残高確認のみ
    • 取引権限: 実際の売買が可能
    • 出金権限: 資金の移動が可能(通常は無効にしておく)

セキュリティの重要性

絶対に守るべきルール:

  • APIキーとシークレットキーは絶対に他人に教えない
  • GitHubなどの公開リポジトリにコミットしない
  • 不要な権限は付与しない
  • IP制限を設定する(可能な場合)

推奨される管理方法:

# 環境変数を使用(推奨)
import os
api_key = os.getenv('COINCHECK_API_KEY')
secret_key = os.getenv('COINCHECK_SECRET_KEY')

# または設定ファイルを使用
# config.pyファイルを作成し、.gitignoreに追加

基本的な使い方

取引所への接続

まずは取引所のインスタンスを作成します:

import ccxt

# 公開データのみアクセス(APIキー不要)
exchange = ccxt.coincheck()

# APIキーを使用する場合
exchange = ccxt.coincheck({
    'apiKey': 'your_api_key_here',
    'secret': 'your_secret_key_here',
    'enableRateLimit': True,  # API制限を自動で処理
})

重要なオプション:

  • enableRateLimit: API呼び出し制限を自動で処理
  • sandbox: CoinCheckはサンドボックス環境を提供していないため、テストは少額で行うことを推奨

対応取引所の確認

CCXTがサポートしている取引所を確認:

import ccxt

# 全取引所のリストを表示
print("対応取引所一覧:")
for exchange_id in ccxt.exchanges:
    print(f"- {exchange_id}")

# 特定の取引所が対応しているかチェック
if 'coincheck' in ccxt.exchanges:
    print("CoinCheckは対応しています")

市場データの取得

ティッカー情報の取得

ティッカーは、各通貨ペアの現在価格や24時間の取引量などの基本情報です:

import ccxt

exchange = ccxt.coincheck()

# 単一の通貨ペアのティッカー取得
ticker = exchange.fetch_ticker('BTC/JPY')
print(f"BTC/JPY 現在価格: ¥{ticker['last']:,.0f}")
print(f"24時間変動: {ticker['percentage']:.2f}%")
print(f"24時間出来高: {ticker['baseVolume']:.2f} BTC")

# 複数の通貨ペアのティッカー取得
tickers = exchange.fetch_tickers(['BTC/JPY', 'ETH/JPY', 'XRP/JPY'])
for symbol, ticker in tickers.items():
    print(f"{symbol}: ¥{ticker['last']:,.0f}")

ティッカーデータの主要な項目:

  • last: 最新取引価格
  • bid: 買い注文の最高価格
  • ask: 売り注文の最低価格
  • high: 24時間最高価格
  • low: 24時間最低価格
  • volume: 24時間取引量

板情報(オーダーブック)の取得

オーダーブックは、現在の買い注文と売り注文の状況を表示します:

# 板情報の取得
orderbook = exchange.fetch_order_book('BTC/JPY')

print("=== 売り注文(Ask)===")
for i, (price, amount) in enumerate(orderbook['asks'][:5]):
    print(f"¥{price:,.0f} - {amount:.6f} BTC")

print("\n=== 買い注文(Bid)===")
for i, (price, amount) in enumerate(orderbook['bids'][:5]):
    print(f"¥{price:,.0f} - {amount:.6f} BTC")

# スプレッド(売りと買いの価格差)
spread = orderbook['asks'][0][0] - orderbook['bids'][0][0]
print(f"\nスプレッド: ¥{spread:,.0f}")

過去の価格データ(ローソク足)の取得

テクニカル分析に必要な過去の価格データを取得:

import pandas as pd
from datetime import datetime, timedelta

# 1時間足のデータを取得(最新100本)
# 注意: CoinCheckは過去データのAPIが制限されている場合があります
try:
    ohlcv = exchange.fetch_ohlcv('BTC/JPY', '1h', limit=100)

    # データをDataFrameに変換
    df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')

    print(df.tail())  # 最新5件を表示

    # 移動平均の計算例
    df['ma20'] = df['close'].rolling(window=20).mean()
    print(f"最新の20期間移動平均: ¥{df['ma20'].iloc[-1]:,.0f}")
except Exception as e:
    print(f"過去データの取得エラー: {e}")
    print("CoinCheckでは過去データのAPIが制限されている場合があります")

利用可能な時間足(取引所により異なります):

  • ‘1m’, ‘5m’, ’15m’, ’30m’ (分足)
  • ‘1h’, ‘4h’, ’12h’ (時間足)
  • ‘1d’, ‘1w’, ‘1M’ (日足、週足、月足)

利用可能な市場の確認

取引可能な通貨ペアを確認:

# 市場情報の取得
markets = exchange.load_markets()

# 日本円建ての取引ペアを表示
jpy_markets = [symbol for symbol in markets.keys() if '/JPY' in symbol]
print("日本円建ての取引ペア:")
for symbol in jpy_markets:
    market = markets[symbol]
    min_amount = market['limits']['amount']['min']
    if min_amount:
        print(f"- {symbol}: 最小注文量 {min_amount}")
    else:
        print(f"- {symbol}: 最小注文量 未設定")

エラーハンドリングの基本

APIを使用する際は、ネットワークエラーや取引所のメンテナンスなどでエラーが発生する可能性があります:

import ccxt

exchange = ccxt.coincheck()

try:
    ticker = exchange.fetch_ticker('BTC/JPY')
    print(f"取得成功: ¥{ticker['last']:,.0f}")
except ccxt.NetworkError as e:
    print(f"ネットワークエラー: {e}")
except ccxt.ExchangeError as e:
    print(f"取引所エラー: {e}")
except Exception as e:
    print(f"その他のエラー: {e}")

まとめ

第1回では、CCXTライブラリの基本概念から環境構築、市場データの取得方法までを解説しました。重要なポイントを振り返ってみましょう:

  1. CCXTの利点: 統一されたインターフェースで複数の取引所にアクセス可能
  2. セキュリティ: APIキーの管理は最重要事項
  3. 基本操作: ティッカー、板情報、過去データの取得方法
  4. エラー処理: 安定したプログラムのための例外処理

次回(第2回)では、実際の残高確認や注文の実行について詳しく解説します。また、基本的な取引戦略の実装にも挑戦する予定です。


注意事項: この記事は投資助言ではありません。実際の取引を行う際は、十分なリスク管理を行い、自己責任で実施してください。CoinCheckではサンドボックス環境が提供されていないため、実際の取引APIを使用する際は少額でのテストから始めることを強く推奨します。


関連記事: