暗号資産の自動売買や分析システムを構築する上で、历史K線(ローソク足)データの取得は基本中の基本です。本記事では、Binance公式REST APIを使用してPythonで過去K線データをを取得する具体的な方法を、筆者の実践経験を交えながら丁寧に解説します。
Binance K線APIの基本仕様
BinanceのK線データは/api/v3/klinesエンドポイントで取得可能です。リクエストパラメータを理解することが、効率的なデータ取得の第一步となります。
リクエストパラメータ一覧
- symbol:取引ペア(例:BTCUSDT、ETHBUSD)
- interval:時間足(1m、5m、15m、1h、4h、1d、1wなど)
- limit:取得件数(最大1000件)
- startTime:開始時刻(Unixタイムスタンプミリ秒)
- endTime:終了時刻(Unixタイムスタンプミリ秒)
実践的なPythonコード
基本取得:単一期間のデータ取得
# binance_klines_basic.py
import requests
import pandas as pd
from datetime import datetime, timedelta
class BinanceKlineFetcher:
"""Binance K線データ取得クラス"""
BASE_URL = "https://api.binance.com/api/v3"
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
def get_klines(self, symbol: str, interval: str, limit: int = 500) -> pd.DataFrame:
"""
K線データを取得してDataFrameで返す
Args:
symbol: 取引ペア(例:BTCUSDT)
interval: 時間足(1m, 5m, 15m, 1h, 4h, 1d)
limit: 取得件数(最大1000)
Returns:
K線データのDataFrame
"""
endpoint = f"{self.BASE_URL}/klines"
params = {
'symbol': symbol.upper(),
'interval': interval,
'limit': limit
}
response = self.session.get(endpoint, params=params, timeout=10)
response.raise_for_status()
data = response.json()
# カラム名の定義
columns = [
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
]
df = pd.DataFrame(data, columns=columns)
# 数値型の変換
for col in ['open', 'high', 'low', 'close', 'volume', 'quote_volume']:
df[col] = pd.to_numeric(df[col], errors='coerce')
# 日時変換
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
df['close_time'] = pd.to_datetime(df['close_time'], unit='ms')
return df[['open_time', 'open', 'high', 'low', 'close', 'volume']]
使用例
if __name__ == "__main__":
fetcher = BinanceKlineFetcher()
# BTC/USDTの日足データを直近500日分取得
df = fetcher.get_klines('BTCUSDT', '1d', limit=500)
print(f"取得件数: {len(df)}")
print(f"期間: {df['open_time'].min()} ~ {df['open_time'].max()}")
print(df.tail())
応用:複数期間のデータ取得とAI分析連携
過去のK線データを分析了する場合は、大量のデータを取得する必要があります。以下は複数 Symbol のデータを一括取得し、AI 分析サービスに連携する実践的な例です。
# binance_klines_advanced.py
import requests
import pandas as pd
import time
from datetime import datetime, timedelta
from typing import List, Dict, Optional
import json
class AdvancedBinanceFetcher:
"""Binance K線データ高度取得クラス + AI分析連携"""
BASE_URL = "https://api.binance.com/api/v3"
# HolySheep AI 設定(API_KEYは各自取得)
HOLYSHEEP_API_URL = "https://api.holysheep.ai/v1/chat/completions"
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # реальний ключ отримайте на https://www.holysheep.ai/register
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'BinanceKlineAnalyzer/1.0'
})
def get_historical_klines(
self,
symbol: str,
interval: str,
start_str: str,
end_str: Optional[str] = None
) -> pd.DataFrame:
"""
指定期間のK線データを全件取得(limit超過対応)
Args:
symbol: 取引ペア
interval: 時間足
start_str: 開始日時(ISO形式またはUnixタイムスタンプ)
end_str: 終了日時
"""
df_total = pd.DataFrame()
# 開始時間の変換
if isinstance(start_str, str):
start_ts = int(pd.Timestamp(start_str).timestamp() * 1000)
else:
start_ts = int(start_str)
end_ts = int(pd.Timestamp(end_str).timestamp() * 1000) if end_str else None
while True:
params = {
'symbol': symbol.upper(),
'interval': interval,
'startTime': start_ts,
'limit': 1000
}
if end_ts:
params['endTime'] = end_ts
try:
response = self.session.get(
f"{self.BASE_URL}/klines",
params=params,
timeout=15
)
response.raise_for_status()
data = response.json()
if not data:
break
df = pd.DataFrame(data)
df.columns = ['open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades',
'taker_buy_base', 'taker_buy_quote', 'ignore']
df_total = pd.concat([df_total, df], ignore_index=True)
# 次の取得開始位置を更新
start_ts = int(df['open_time'].iloc[-1]) + 1
# 無限ループ防止
if len(data) < 1000:
break
time.sleep(0.2) # APIリクエスト制限対応
except requests.exceptions.RequestException as e:
print(f"APIエラー: {e}")
time.sleep(5)
continue
# 数値変換
for col in ['open', 'high', 'low', 'close', 'volume']:
df_total[col] = pd.to_numeric(df_total[col], errors='coerce')
df_total['open_time'] = pd.to_datetime(df_total['open_time'].astype(int), unit='ms')
return df_total[['open_time', 'open', 'high', 'low', 'close', 'volume', 'quote_volume']]
def analyze_with_holysheep(self, kline_summary: str) -> str:
"""
HolySheep AI を使用してK線データを分析
筆者の経験上、¥1=$1の為替レート(公式¥7.3=$1比85%節約)で
DeepSeek V3.2($0.42/MTok)がコストパフォーマンスに優れています。
"""
payload = {
"model": "deepseek-chat",
"messages": [
{
"role": "system",
"content": "あなたは暗号資産分析 specialists. K線データの特徴を分析し、トレンド判定を行ってください。"
},
{
"role": "user",
"content": f"以下のK線サマリーを分析してください:\n{kline_summary}"
}
],
"temperature": 0.3,
"max_tokens": 500
}
headers = {
"Authorization": f"Bearer {self.HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
response = requests.post(
self.HOLYSHEEP_API_URL,
headers=headers,
json=payload,
timeout=30
)
response.raise_for_status()
result = response.json()
return result['choices'][0]['message']['content']
メイン実行
if __name__ == "__main__":
fetcher = AdvancedBinanceFetcher()
# BTCUSDT 2025年1年間の4時間足を全件取得
df = fetcher.get_historical_klines(
symbol='BTCUSDT',
interval='4h',
start_str='2025-01-01',
end_str='2026-01-01'
)
# データサマリー作成
summary = f"""
Symbol: BTCUSDT
期間: {df['open_time'].min()} ~ {df['open_time'].max()}
データ件数: {len(df)}件
平均終値: ${df['close'].mean():,.2f}
最高値: ${df['high'].max():,.2f}
最安値: ${df['low'].min():,.2f}
ボラティリティ: {((df['high'] - df['low']) / df['close'] * 100).mean():.2f}%
"""
print("=== K線データサマリー ===")
print(summary)
# HolySheep AIで分析(オプション)
# print("\n=== AI分析結果 ===")
# analysis = fetcher.analyze_with_holysheep(summary)
# print(analysis)
よくあるエラーと対処法
エラー1:HTTP 429 Too Many Requests(レートリミット超過)
Binance APIは1分あたり1200リクエストの制限があります。ループ処理で発生しやすいエラーです。
# 対処法:リクエスト間にクールダウンを追加
import time
from ratelimit import limits, sleep_and_retry
@sleep_and_retry
@limits(calls=10, period=1) # 1秒あたり10リクエストまで
def get_klines_with_limit(symbol, interval, limit=500):
"""レート制限対応のK線取得"""
# ... APIリクエスト処理
time.sleep(0.2) # 追加の待機時間
return response.json()
エラー2:Invalid symbol(無効なシンボル指定)
先物(Futures)と現物(Spot)のエンドポイントを混同した場合に発生します。
# 対処法:エンドポイントを明確に使い分ける
SPOT_BASE = "https://api.binance.com/api/v3" # 現物
FUTURES_BASE = "https://fapi.binance.com/fapi/v1" # USD-M 先物
COIN_BASE = "https://dapi.binance.com/dapi/v1" # COIN-M 先物
先物データの取得例
def get_futures_klines(symbol, interval, limit=500):
params = {
'symbol': symbol.upper(), # 先物はBTCUSDT_210625等形式
'interval': interval,
'limit': limit
}
response = requests.get(f"{FUTURES_BASE}/klines", params=params)
return response.json()
エラー3:Invalid timestamp(タイムスタンプエラー)
startTime/endTimeのタイムスタンプが不正な形式で送信された場合に発生します。
# 対処法:ミリ秒単位のUnixタイムスタンプに変換
from datetime import datetime
import time
def datetime_to_milliseconds(dt_str):
"""文字列からミリ秒タイムスタンプへ変換"""
# ISO形式: "2025-01-01T00:00:00Z"
dt = pd.to_datetime(dt_str)
return int(dt.timestamp() * 1000)
def milliseconds_to_datetime(ms):
"""ミリ秒タイムスタンプからdatetimeへ変換"""
return datetime.fromtimestamp(ms / 1000)
使用例
start_ms = datetime_to_milliseconds("2025-01-01 00:00:00")
end_ms = datetime_to_milliseconds("2025-12-31 23:59:59")
params = {
'symbol': 'BTCUSDT',
'interval': '1h',
'startTime': start_ms,
'endTime': end_ms,
'limit': 1000
}
エラー4:Response timeout(レスポンスタイムアウト)
ネットワーク不安定な環境や、大量データ取得時に発生します。
# 対処法:再試行ロジック付きリクエスト
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def create_session_with_retry(retries=3, backoff_factor=0.5):
"""再試行機能付きセッション作成"""
session = requests.Session()
retry_strategy = Retry(
total=retries,
backoff_factor=backoff_factor,
status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
return session
使用
session = create_session_with_retry()
response = session.get(endpoint, timeout=30)
AI分析コスト比較:月間1000万トークン実績
筆者の実務経験では、K線データの自動分析和サービスにAIを活用する場合、月間1000万トークン程度的トークンを消費します。以下に主要AIプロバイダのコスト比較を示します。
| AIプロバイダ / モデル | Output価格 ($/MTok) | 月間1000万トークンコスト | HolySheep経由コスト* | 特徴 |
|---|---|---|---|---|
| GPT-4.1 | $8.00 | $80 | $80 | 最高品質、長いコンテキスト |
| Claude Sonnet 4.5 | $15.00 | $150 | $150 | 長文読解に強い |
| Gemini 2.5 Flash | $2.50 | $25 | $25 | コストバランス型 |
| DeepSeek V3.2 | $0.42 | $4.20 | $4.20 | 最安値・高性能 |
* HolySheep経由の場合、¥1=$1の為替レート(公式¥7.3=$1比85%節約)で日本円決済可能
向いている人・向いていない人
こんな方におすすめ
- 暗号資産の自動売買 Bots を自作したい投資家
- исторические данные を使った機械学習モデル構築を検討しているデータサイエンティスト
- TradingView以外のチャート分析ツールを探しているトレーダー
- K線データとAI分析を組み合わせた独自レポートを作りたい方
向いていない人
- Binance API初心者のうち大量データ取得只想玩玩の方(まずは少量で動作確認を)
- 高频取引(ミリ秒単位の執行)を前提としている方(Binance現物APIはレイテンシ要件を満たさない可能性)
- 自己責任でのAPI利用に抵抗感のある方
価格とROI
Binance API自体は免费ですが、データ分析・AI活用を組み合わせるとコストが発生します。筆者の試算では:
| サービス構成 | 月額コスト | 活用シーン | 投資対効果 |
|---|---|---|---|
| Binance API + 自前分析 | $0 | 基本的なチャート分析 | ★★☆ |
| Binance API + Gemini 2.5 Flash 分析 | $25/月 | 每日トレンドレポート | ★★★ |
| Binance API + DeepSeek V3.2(HolySheep) | 約¥420/月* | 高频分析・実用レポート | ★★★★★ |
* HolySheepの場合:$4.20 ÷ ¥1=$1 = 約¥420/月
HolySheepを選ぶ理由
筆者がHolySheepを主要用于AI分析連携ている理由は主に3つです:
- 為替レートの優位性: 공식 ¥7.3=$1に対し、HolySheepは¥1=$1を実現。美國プロバイダ利用時に85%のコスト削減が可能
- 多様な決済手段:WeChat Pay・Alipay対応で、中国在住或在勤のユーザーでも容易に入金・決済できる
- 低レイテンシ:<50msの応答速度で、リアルタイム分析用途にも耐えうる性能
特にDeepSeek V3.2は$0.42/MTokの破格の安さで、月間1000万トークン利用時わずか$4.2(约¥420)という驚異的なコストパフォーマンスを実現しています。
まとめ:今すぐ始めるための最小構成
本記事のコードをベースに、以下のおすすめ構成で始めることを提案します:
- データ取得:Binance REST API(免费)
- データ保存:SQLite / PostgreSQL / CSV
- 分析エンジン:HolySheep DeepSeek V3.2($0.42/MTok)
- 可視化:Plotly / Matplotlib
まずは1日分のデータ取得から始めて、動作確認後にHistoricalデータ取得へ расширять のが確実なアプローチです。
👉 HolySheep AI に登録して無料クレジットを獲得
登録特典として無料クレジットがもらえるので、実際のAPI連携を試すことができます。¥1=$1のレートでDeepSeek V3.2を試用してみましょう。