CCXTで仮想通貨トレードをしてみる(第1回):インストールから価格取得まで【Python】

約16分で読めます by ぽんたぬき
CCXTで仮想通貨トレードをしてみる(第1回):インストールから価格取得まで【Python】

CCXTで仮想通貨トレードをしてみる(第1回):インストールから価格取得まで【Python】

はじめに

Pythonで仮想通貨の自動売買Botを作りたい——そう思ったとき、最初の壁になるのが「取引所ごとにAPIの仕様が違いすぎる」という問題です。取引所Aではエンドポイントが /v1/ticker、取引所Bでは /api/spot/ticker……と、対応するたびにコードを書き直すのは非常に非効率です。

この連載では、そうした問題を一気に解決してくれるライブラリ CCXT を使って、仮想通貨トレードの自動化を段階的に学んでいきます。

テーマ
第1回(本記事) CCXTのインストール・価格データ取得
第2回 APIキーを使った残高確認と注文
第3回 自動売買Botの基礎設計

対象読者: Pythonの基礎(変数・関数・ループ)を理解していて、仮想通貨の自動売買に興味がある方

動作確認環境: Python 3.10以上 / CCXT v4.5.40


1. CCXTとは?なぜ使うのか

1-1. CCXTの概要

CCXT(CryptoCurrency eXchange Trading Library)は、100以上の仮想通貨取引所のAPIを統一したインターフェースで操作できるオープンソースライブラリです。

2026年7月時点でも活発にメンテナンスが続けられており、最新バージョンは v4.5.40(2026年2月リリース)です。GitHubのスター数は3万を超え、仮想通貨トレードの自動化に取り組む開発者の間では事実上の標準ライブラリとして広く採用されています。

1-2. CCXTを使う3つのメリット

① 統一インターフェース

取引所ごとのAPI仕様の違いをCCXTが吸収してくれます。Binanceでも、bitFlyerでも、同じコード構造で操作できるため、取引所を乗り換えたときのリファクタリングコストが大幅に削減されます。

② マルチ言語対応

Python / JavaScript / C# / Go / Java に対応しており、自分のスキルセットや用途に合わせて言語を選択できます。本連載ではPythonを使用します。

③ APIキー不要で始められる

価格の取得はパブリックAPIのみで完結します。アカウント登録やAPIキーの発行なしに、今すぐコードを動かして試せるのがCCXTの大きな魅力です。

1-3. 対応取引所の種類

CCXTでは取引所を品質ティアで分類しています。

ティア 説明 主な取引所
Tier-1(認定済み) 全機能の動作が保証 Binance・Bybit・OKX・Coinbase・Bitget
Tier-2以降 一部機能の制限あり その他100以上の取引所
国内対応 日本の取引所 bitFlyer・Coincheck・bitbank・Zaif

対応取引所の一覧はコード上から確認できます。

import ccxt
print(ccxt.exchanges)
# ['aax', 'alpaca', 'ascendex', ..., 'binance', ..., 'bitflyer', ...]

2. 事前準備とインストール

2-1. 必要なもの

  • Python 3.10以上
  • pip(Pythonパッケージ管理ツール)
  • ※ 今回はパブリックAPIのみ使用するため、APIキーは不要

仮想環境を使う場合は、以下のコマンドで事前に作成しておくことをベストプラクティスとして推奨します。プロジェクトごとに依存ライブラリを分離することで、バージョン競合を防げます。

python -m venv venv
source venv/bin/activate  # Windowsの場合: venv\Scripts\activate

2-2. CCXTのインストール手順

インストールは pip の1コマンドで完了します。

pip install ccxt

インストール後、Pythonインタープリタでバージョンを確認しましょう。

import ccxt
print(ccxt.__version__)
# 4.5.40

2-3. インストール時のよくあるエラーと対処法

バージョン競合が発生した場合

pip install --upgrade ccxt

依存ライブラリ(requestsなど)のエラーが発生した場合

pip install --upgrade pip
pip install ccxt --no-cache-dir

実際の開発現場では、requirements.txt にバージョンを明記しておくことで、チーム内の環境を統一できます。

ccxt==4.5.40
pandas==2.2.0

3. CCXTの基本的な使い方

3-1. 取引所インスタンスの作成

CCXTでは、使用したい取引所名をクラス名として呼び出すことでインスタンスを作成します。

import ccxt

# Binanceに接続する場合
exchange = ccxt.binance({
    'enableRateLimit': True,  # レート制限の自動管理を有効化
})

# bitFlyerに接続する場合
exchange = ccxt.bitflyer({
    'enableRateLimit': True,
})

enableRateLimit=True は必ず設定してください。 これを有効にすることで、CCXTがAPIの呼び出し間隔を自動的に調整し、取引所から制限(429エラー)を受けるリスクを回避できます。

APIキーを使ったプライベートAPIへのアクセスは、次のように設定します(第2回以降で詳解)。

exchange = ccxt.bitflyer({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    'enableRateLimit': True,
})

3-2. 取引所の基本情報を取得する

取引所インスタンスを作成したら、まず load_markets() でマーケット情報をロードします。

markets = exchange.load_markets()

# 取引可能な通貨ペアの一覧を確認
print(list(markets.keys())[:10])
# ['BTC/USDT', 'ETH/USDT', 'BNB/USDT', ...]

# 取引所がサポートする機能を確認
print(exchange.has['fetchOHLCV'])  # True or False

exchange.has を参照することで、対象の取引所がOHLCVや板情報の取得に対応しているかどうかを事前に確認できます。本番コードを書く前に必ず確認する習慣をつけましょう。


4. 価格データを取得してみよう

4-1. Ticker(現在価格)を取得する

fetch_ticker() は指定した通貨ペアの現在の価格情報を取得するメソッドです。

import ccxt

exchange = ccxt.bitflyer({'enableRateLimit': True})
ticker = exchange.fetch_ticker('BTC/JPY')

print(f"通貨ペア  : {ticker['symbol']}")
print(f"最終価格  : {ticker['last']:,.0f} 円")
print(f"買い気配値: {ticker['ask']:,.0f} 円")
print(f"売り気配値: {ticker['bid']:,.0f} 円")
print(f"取得時刻  : {ticker['datetime']}")

取得できる主なフィールド:

フィールド 説明
last 最終約定価格
ask 最良売り気配値(買いたい場合の最安値)
bid 最良買い気配値(売りたい場合の最高値)
high / low 24時間の高値・安値
volume 24時間の出来高
datetime データ取得のタイムスタンプ(ISO 8601形式)

4-2. 複数通貨の価格をまとめて取得する

複数の通貨ペアを一括で取得したい場合は fetch_tickers() を使います。

import ccxt

exchange = ccxt.binance({'enableRateLimit': True})

# 主要通貨の価格を一括取得
symbols = ['BTC/USDT', 'ETH/USDT', 'XRP/USDT']
tickers = exchange.fetch_tickers(symbols)

for symbol, ticker in tickers.items():
    print(f"{symbol}: {ticker['last']:,.4f} USDT")

# BTC/USDT: 95,234.5000 USDT
# ETH/USDT: 3,412.8000 USDT
# XRP/USDT:     2.3450 USDT

4-3. OHLCVローソク足データを取得する

fetch_ohlcv() はテクニカル分析の基本となるローソク足データ(Open・High・Low・Close・Volume)を取得するメソッドです。

import ccxt

exchange = ccxt.binance({'enableRateLimit': True})

# BTC/USDTの日足データを20本取得
ohlcv = exchange.fetch_ohlcv(
    symbol='BTC/USDT',
    timeframe='1d',  # 時間足の指定
    limit=20         # 取得本数
)

# 1件のデータ構造を確認
print(ohlcv[0])
# [1706745600000, 42150.0, 43200.5, 41800.0, 42900.0, 18523.4]
# [timestamp,     open,    high,    low,      close,   volume]

timeframe パラメータの主な選択肢:

説明
'1m' 1分足
'5m' 5分足
'1h' 1時間足
'4h' 4時間足
'1d' 日足

4-4. 取得データをpandas DataFrameに変換する

生のリスト形式で返ってくるOHLCVデータは、pandasのDataFrameに変換することで格段に扱いやすくなります。バックテストや可視化への橋渡しとして、このコードはほぼ定型文として活用できます。

import ccxt
import pandas as pd

exchange = ccxt.binance({'enableRateLimit': True})

ohlcv = exchange.fetch_ohlcv('BTC/USDT', timeframe='1d', limit=20)

# DataFrameに変換
df = pd.DataFrame(
    ohlcv,
    columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']
)

# タイムスタンプをdatetimeに変換(UTCからJSTに調整する場合は+9時間)
df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')
df = df.set_index('datetime')
df = df.drop(columns=['timestamp'])

print(df.tail())

出力例(イメージ):

                          open      high       low     close       volume
datetime
2026-07-19 00:00:00  94500.0  96800.0  93200.0  95400.0  18230.5
2026-07-20 00:00:00  95400.0  97200.0  94800.0  96100.0  17850.2
2026-07-21 00:00:00  96100.0  98500.0  95700.0  97800.0  21043.7
...

このDataFrameをそのままmatplotlibで可視化したり、移動平均を計算してトレードシグナルを生成したりと、次のステップへシームレスに繋げられます。


5. レート制限とエラーハンドリング

5-1. レート制限(Rate Limit)とは

APIのレート制限とは、取引所が「一定時間内に受け付けるリクエスト数」を制限する仕組みです。この制限を超えると、HTTP 429 Too Many Requests エラーが返され、一時的にAPIへのアクセスをブロックされる場合があります。

冒頭で解説した enableRateLimit=True を設定しておくと、CCXTがリクエスト間隔を自動的に調整してくれます。ループ処理で繰り返しAPIを叩くスクリプトでは、この設定が特に重要です。

5-2. よくあるエラーと対処法

実際の開発現場では、以下のエラーに遭遇することがよくあります。適切なエラーハンドリングをコードに組み込んでおきましょう。

import ccxt
import time

exchange = ccxt.binance({'enableRateLimit': True})

try:
    ticker = exchange.fetch_ticker('BTC/USDT')
    print(ticker['last'])

except ccxt.BadSymbol as e:
    # 通貨ペアの記法ミス(例:'BTC-USDT' → 'BTC/USDT' が正しい)
    print(f"通貨ペアの指定が正しくありません: {e}")

except ccxt.NetworkError as e:
    # ネットワーク接続エラー(リトライ処理を検討)
    print(f"ネットワークエラーが発生しました: {e}")
    time.sleep(5)  # 5秒待ってリトライ

except ccxt.ExchangeError as e:
    # 取引所側のエラー(メンテナンス・サービス停止など)
    print(f"取引所エラーが発生しました: {e}")

よくあるエラー一覧:

エラークラス 主な原因 対処法
BadSymbol 通貨ペア名の記法ミス BTC/JPY(スラッシュ区切り)を使用
NetworkError 接続タイムアウト・通信障害 リトライ処理を実装
ExchangeError 取引所のメンテナンス・仕様変更 エラーメッセージを確認・待機
RateLimitExceeded APIコール頻度の超過 enableRateLimit=True の設定を確認

6. まとめと次回予告

6-1. 今回学んだこと

本記事では、CCXTを使った価格データ取得の基礎を段階的に理解を深めていきました。

  • ✅ CCXTの概要と3つのメリット(統一インターフェース・マルチ言語・キー不要)
  • pip install ccxt によるシンプルなインストール手順
  • fetch_ticker() による現在価格の取得
  • fetch_ohlcv() によるローソク足データの取得
  • ✅ OHLCVデータのpandas DataFrame変換
  • ✅ レート制限とエラーハンドリングの基本

6-2. 次回予告:APIキーを使った残高確認と注文

第2回では、実際に取引所でAPIキーを発行し、プライベートAPIを使った操作に進みます。

  • APIキーの発行手順とsecretの安全な管理方法(.envファイルの活用)
  • fetch_balance() による口座残高の取得
  • create_order() を使った成行注文・指値注文の基本

価格を「見る」だけでなく、実際に「動かす」ところまで踏み込んでいきます。ぜひお楽しみに。


参考リンク

関連記事

Pandas → Polars 完全移行ガイド 2026:groupby・join・文字列処理の書き換え実例とベンチマーク比較
Python

Pandas → Polars 完全移行ガイド 2026:groupby・join・文字列処理の書き換え実例とベンチマーク比較

PandasからPolarsへの移行方法をgroupby・join・文字列処理の実例コードで解説。LazyFrameの仕組みやベンチマーク比較、移行の落とし穴も網羅した2026年版完全ガイド。

コメント

0/2000