APIを触ったことがないあなたへ。Pythonを使って幣取引所の歴史的な価格データを取得する方法を、ゼロから丁寧に解説します。この記事を読み終えれば、あなたもAPIマスターへの第一歩を踏み出せるでしょう。
---はじめに:APIってなに?
「API」という言葉を知らないまま、この記事を見ている方は多いのではないでしょうか。放心しないでください。幣取引所のAPIも、餐厅のメニューと同じ考え方です。 **餐厅で食事を頼むイメージをしてください:** - **あなた** = プログラム(パソコン) - **メニュー** = API(取引所に「この数据をください」と伝える約束事) - **キッチン** = 幣取引所(Binance)のコンピュータ - **料理** = 歴史的价格データ(BTC/USDの過去の価格など) обычный餐厅では、「温かい拉面をください」と口にしますが、APIでは「BTC/USDTの2024年1月1日から1月15日までの1時間ごとの价格データをください」という具合に、コンピュータ同士が话し合います。
💡 ポイント:APIは「約束事の集まり」です。技师间の意思疎通手段と覚えればOK!
---
この記事でできるようになること
| できるようになること | 具体的な例 | |---|---| | Binance APIに接続できる | PythonからBinanceの计算机と通信できる | | 過去の価格データを取得できる | 「BTCが昨日どんな值段だった?」という質問に答えてくれる | | 移動平均線を計算できる | 短期と长期の趋势を一目で确认できる | | CSVファイルに保存できる | Excelで開いて自由に分析できる | ---前提條件:準備するもの
| 準備するもの | 推奨バージョン | 在哪里下载 | |---|---|---| | Python | 3.8以上 | https://www.python.org/downloads/ | | pip(Pythonパッケージ管理) | 最新版 | Pythonと一緒にインストール済み | | テキストエディタ | VS Code推奨 | https://code.visualstudio.com/ | | Binanceアカウント | - | https://www.binance.com/ | | インターネット接続 | 常時接続 | ご自宅のWi-Fiなど | > **スクリーンショットポイント①:** Python安装完毕后、「コマンドプロンプト」(Windows)または「ターミナル」(Mac)を開いて、python --version と入力。像のように Python 3.11.5 のような数字が表示されたら成功です。
---
ステップ1:必要なライブラリをインストールする
まず、PythonでAPIを使うための道具(ライブラリ)をインストールします。-libraryは「道具箱」のようなものと想像してください。pipを使ったインストール
# コマンドプロンプトまたはターミナルで以下のコマンドを実行
Binance API用のライブラリ(公式が 제공하는もの)
pip install python-binance
データ分析用のライブラリ
pip install pandas
グラフ描画用のライブラリ
pip install matplotlib
日付・時刻処理用のライブラリ(通常は標準ライブラリだが念のため)
pip install python-dateutil
💡 インストールで困ったら:Windowsでは「管理者として実行」、Macではコマンドの前に「sudo」をつけて试试吧。
> **スクリーンショットポイント②:** 安装成功时、各ライブラリ名の下に「Successfully installed python-binance-1.0.19」のように「Successfully」と表示されます。
---
ステップ2:Binance APIキーを取得する
APIを使うためには、取引所から「許可証」のようなものが必要です。これを「APIキー」と呼びます。APIキーの作成手順
# 1. Binanceにログインする
https://www.binance.com/ にアクセスしてログイン
2. プロフィールアイコンをクリック → 「API Management」を選択
3. 「Create API」ボタンをクリック
※「System Generated」の方を選択(推奨)
4. セキュリティ確認(2段階認証など)を完了
5. 表示される「API Key」と「Secret Key」を大切に保存
⚠️ この画面を閉じると二度と表示されないので要注意!
⚠️ セキュリティ注意:APIキーは银行卡の暗証番号と同じです。誰にも渡さない、GitHubなどにアップロードしないを守りましょう。
> **スクリーンショットポイント③:** API Management页面で、「Edit restrictions」で「Enable Spot & Margin Trading」だけを許可すると安全です。
---
ステップ3:PythonでBinanceに接続する
それでは、いよいよPythonコードを作成します。VS Codeなどのテキストエディタを開き、binance_data.pyというファイル名で保存してください。
# binance_data.py
============================================
Binance APIに接続するための準備
============================================
from binance.client import Client
import pandas as pd
from datetime import datetime, timedelta
============================================
★ 重要:ここに自分のAPIキーを入力 ★
============================================
API_KEY = "YOUR_BINANCE_API_KEY" # 自分のAPI Keyに置き換える
API_SECRET = "YOUR_BINANCE_API_SECRET" # 自分のSecret Keyに置き換える
Binanceクライアントを作成
client = Client(API_KEY, API_SECRET)
接続テスト
try:
account_info = client.get_account()
print("✅ Binance接続成功!")
print(f" アカウント状態: {account_info['accountType']}")
except Exception as e:
print(f"❌ 接続エラー: {e}")
💡 ポイント:自分のAPIキーには、必ず上で取得した実際のキーを入れてください。「YOUR_BINANCE_API_KEY」という文字そのままでは動きません。
---
ステップ4:歴史的な価格データを取得する
BTC/USDTの过去30日分の日足データを取得
# binance_data.py の続き
============================================
歴史的価格データの取得
============================================
def get_historical_prices(symbol="BTCUSDT", interval="1d", days=30):
"""
指定した銘柄の過去データを変て得来
Parameters:
symbol: 銘柄名(BTCUSDT = BTCとUSDTのペア)
interval: 時間足(1d = 1日足、1h = 1時間足)
days: 何日前からのデータを取得するか
Returns:
pandas DataFrame(表形式のデータ)
"""
# 開始日時を計算
end_date = datetime.now()
start_date = end_date - timedelta(days=days)
# Binanceからデータを取得
klines = client.get_historical_klines(
symbol=symbol,
interval=interval,
start_str=start_date.strftime("%Y-%m-%d %H:%M:%S"),
end_str=end_date.strftime("%Y-%m-%d %H:%M:%S")
)
# データを整理しやすい形に変換
df = pd.DataFrame(klines, columns=[
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
])
# 数値列を浮動小数点に変換
numeric_columns = ['open', 'high', 'low', 'close', 'volume']
for col in numeric_columns:
df[col] = pd.to_numeric(df[col], errors='coerce')
# 日時列を удобный な形式に変換
df['datetime'] = pd.to_datetime(df['open_time'], unit='ms')
return df
データを取得
btc_data = get_historical_prices(symbol="BTCUSDT", interval="1d", days=30)
結果を表示
print(f"📊 BTC/USDT 過去30日のデータ")
print(f" データ数: {len(btc_data)} 件")
print(f" 最新データ: {btc_data['datetime'].iloc[-1]}")
print(f" 最新終値: ${btc_data['close'].iloc[-1]:,.2f}")
print()
print("直近5件のデータ:")
print(btc_data[['datetime', 'open', 'high', 'low', 'close']].tail())
> **スクリーンショットポイント④:** 実行结果、📊 BTC/USDT 過去30日のデータと表示され、表格形式で価格データが表示されます。
---
ステップ5:移動平均線を計算して可視化する
トレンド分析のためにグラフを描画
# binance_data.py の続き(グラフ描画を追加)
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
def calculate_moving_averages(df, short_period=7, long_period=25):
"""
単純移動平均(SMA)を計算
Parameters:
df: 価格データのDataFrame
short_period: 短期移動平均の期間(日数)
long_period: 長期移動平均の期間(日数)
"""
df = df.copy()
df['SMA_short'] = df['close'].rolling(window=short_period).mean()
df['SMA_long'] = df['close'].rolling(window=long_period).mean()
return df
def plot_price_chart(df, symbol="BTC/USDT"):
"""
価格チャートと移動平均線をプロット
"""
fig, ax = plt.subplots(figsize=(14, 7))
# 価格チャート
ax.plot(df['datetime'], df['close'],
label='終値', color='blue', linewidth=1.5)
# 移動平均線
ax.plot(df['datetime'], df['SMA_short'],
label='7日移動平均', color='orange', linewidth=1, linestyle='--')
ax.plot(df['datetime'], df['SMA_long'],
label='25日移動平均', color='red', linewidth=1, linestyle='--')
# タイトルとラベル
ax.set_title(f'{symbol} 価格チャート(過去30日)', fontsize=14, fontweight='bold')
ax.set_xlabel('日付', fontsize=11)
ax.set_ylabel('価格 (USDT)', fontsize=11)
# 凡例とグリッド
ax.legend(loc='upper left')
ax.grid(True, alpha=0.3)
# 日付軸のフォーマット
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('btc_price_chart.png', dpi=150)
print("📈 グラフを 'btc_price_chart.png' として保存しました")
plt.show()
移動平均を計算
btc_data = calculate_moving_averages(btc_data)
チャートを描画
plot_price_chart(btc_data, symbol="BTC/USDT")
基本的な統計情報を表示
print("\n📈 価格統計(過去30日):")
print(f" 平均終値: ${btc_data['close'].mean():,.2f}")
print(f" 最高値: ${btc_data['high'].max():,.2f}")
print(f" 最安値: ${btc_data['low'].min():,.2f}")
print(f" ボラティリティ: {((btc_data['close'].max() - btc_data['close'].min()) / btc_data['close'].mean() * 100):.2f}%")
---
ステップ6:CSVファイルにエクスポートする
# binance_data.py の続き(CSV保存功能)
def export_to_csv(df, filename="crypto_data.csv"):
"""
データをCSVファイルにエクスポート
"""
# 表示に必要な列だけを選択
export_df = df[['datetime', 'open', 'high', 'low', 'close', 'volume']].copy()
export_df['datetime'] = export_df['datetime'].dt.strftime('%Y-%m-%d %H:%M:%S')
# CSVファイルとして保存
export_df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"💾 データを '{filename}' に保存しました")
return filename
CSVファイルにエクスポート
export_to_csv(btc_data, "btc_30days.csv")
print("\n✅ すべての処理が完了しました!")
> **スクリーンショットポイント⑤:** btc_30days.csvというファイルが作成され、Excelで開くと日期ごとに整理された価格データが確認できます。
---
完成版:すべてを組み合わせたスクリプト
# ============================================
Binance API 歴史データ取得 完全スクリプト
============================================
ファイル名: binance_complete.py
用途: BTC/USDTの過去30日分のデータを取得・分析・保存
============================================
from binance.client import Client
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime, timedelta
============================================
設定(自分の情報に置き換えてください)
============================================
API_KEY = "YOUR_BINANCE_API_KEY"
API_SECRET = "YOUR_BINANCE_API_SECRET"
SYMBOL = "BTCUSDT" # 銘柄(BTC/USDT)
INTERVAL = "1d" # 時間足(1d = 1日足)
DAYS = 30 # 取得期間(日数)
============================================
Binanceクライアント初期化
============================================
client = Client(API_KEY, API_SECRET)
print("🔌 Binanceに接続中...")
============================================
データ取得関数
============================================
def get_historical_data(symbol, interval, days):
"""歴史的な価格データを取得"""
end_date = datetime.now()
start_date = end_date - timedelta(days=days)
klines = client.get_historical_klines(
symbol=symbol,
interval=interval,
start_str=start_date.strftime("%Y-%m-%d %H:%M:%S"),
end_str=end_date.strftime("%Y-%m-%d %H:%M:%S")
)
df = pd.DataFrame(klines, columns=[
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
])
for col in ['open', 'high', 'low', 'close', 'volume']:
df[col] = pd.to_numeric(df[col], errors='coerce')
df['datetime'] = pd.to_datetime(df['open_time'], unit='ms')
df['SMA_7'] = df['close'].rolling(window=7).mean()
df['SMA_25'] = df['close'].rolling(window=25).mean()
return df
============================================
メイン処理
============================================
if __name__ == "__main__":
print("📥 データを取得中...")
data = get_historical_data(SYMBOL, INTERVAL, DAYS)
print(f"✅ {len(data)}件のデータを取得しました")
print(f" 最新価格: ${data['close'].iloc[-1]:,.2f}")
print(f" 7日移動平均: ${data['SMA_7'].iloc[-1]:,.2f}")
print(f" 25日移動平均: ${data['SMA_25'].iloc[-1]:,.2f}")
# CSV保存
data[['datetime', 'open', 'high', 'low', 'close', 'SMA_7', 'SMA_25']].to_csv(
f'{SYMBOL.lower()}_analysis.csv',
index=False,
encoding='utf-8-sig'
)
print(f"💾 CSV保存完了: {SYMBOL.lower()}_analysis.csv")
# グラフ描画
fig, ax = plt.subplots(figsize=(14, 6))
ax.plot(data['datetime'], data['close'], label='終値', linewidth=2)
ax.plot(data['datetime'], data['SMA_7'], label='SMA 7日', linestyle='--')
ax.plot(data['datetime'], data['SMA_25'], label='SMA 25日', linestyle='--')
ax.set_title(f'{SYMBOL} 価格分析')
ax.legend()
ax.grid(True, alpha=0.3)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(f'{SYMBOL.lower()}_chart.png', dpi=150)
print(f"📈 グラフ保存完了: {SYMBOL.lower()}_chart.png")
---
他の銘柄 тоже試してみよう
# ============================================
対応している主な銘柄の例
============================================
SYMBOLS = {
"BTCUSDT": "ビットコイン (Bitcoin)",
"ETHUSDT": "イーサリアム (Ethereum)",
"BNBUSDT": "バイナンスコイン (BNB)",
"SOLUSDT": "ソラナ (Solana)",
"XRPUSDT": "リップル (XRP)",
"ADAUSDT": "カルダノ (ADA)",
"DOGEUSDT": "ドージコイン (DOGE)",
"DOTUSDT": "ポルカドット (DOT)"
}
print("📋 取引可能な主要銘柄:")
print("-" * 40)
for symbol, name in SYMBOLS.items():
print(f" {symbol:12} : {name}")
イーサリアムのデータを取得する場合
eth_data = get_historical_data("ETHUSDT", "1d", 30)
---
よくあるエラーと対処法
❌ エラー1:AttributeError: 'NoneType' object has no attribute '...'
原因:APIキーが無効、または期限切れの場合に発生します。 解決コード:# APIキーを再確認して、正しいものを設定
API_KEY = "自分の本当のAPIキー" # 余分なスペースや改行が入っていないか確認
API_SECRET = "自分の本当のSECRET" # 前後に空白があると認識されない
キーの前後の空白を削除(念のため)
API_KEY = API_KEY.strip()
API_SECRET = API_SECRET.strip()
接続テスト
print(f"API Key長さ: {len(API_KEY)} 文字") # 通常42文字程度
❌ エラー2:ReadTimeout: HTTPSConnectionPool(host='api.binance.com', port=443)
原因:ネットワーク接続の問題、またはAPIサーバーへの一時的な接続不良です。 解決コード:from binance.client import Client
import time
def safe_get_data(client, symbol, interval, days, max_retries=3):
"""再試行機能付きのデータ取得"""
for attempt in range(max_retries):
try:
end_date = datetime.now()
start_date = end_date - timedelta(days=days)
klines = client.get_historical_klines(
symbol=symbol,
interval=interval,
start_str=start_date.strftime("%Y-%m-%d %H:%M:%S"),
end_str=end_date.strftime("%Y-%m-%d %H:%M:%S")
)
return klines
except Exception as e:
print(f"⚠️ 試行 {attempt + 1}/{max_retries} 失敗: {e}")
if attempt < max_retries - 1:
wait_time = 2 ** attempt # 指数バックオフ
print(f"⏳ {wait_time}秒後に再試行...")
time.sleep(wait_time)
else:
print("❌ 最大試行回数に達しました")
raise
使用例
try:
data = safe_get_data(client, "BTCUSDT", "1d", 30)
except Exception as e:
print("ネットワークを確認してください")
❌ エラー3:APIError: -1021 Timestamp for this request is not valid
原因:パソコンの時間設定が正確でない場合に発生します(APIはサーバー时间来を確認します)。 解決コード:# パソコンの時間設定を確認・修正
Windowsの場合:
1. 設定 → 時刻と言語 → 日付と時刻
2. 「時刻を自動設定する」をオン
3. 「タイムゾーンを自動設定する」をオン
Macの場合:
1. システム設定 → 一般 → 日付と時刻
2. 「日付と時刻を自動設定」をオン
Pythonで現在のサーバー时间来との差を確認
from binance.client import Client
import time
client = Client()
サーバー时间を取得
server_time = client.get_server_time()
print(f"サーバー时间: {server_time}")
自分のパソコンの時間との差を表示
from datetime import datetime
local_time = datetime.now()
server_datetime = datetime.fromtimestamp(server_time['serverTime'] / 1000)
print(f"パソコン时间: {local_time}")
print(f"时间差: {(server_datetime - local_time).total_seconds():.2f}秒")
差が5秒以上ある場合は电脑の时刻設定を確認してください
❌ エラー4:ValueError: Could not deserialize key data
原因:SECRETキーに特殊文字が含まれている場合に暗号化ライブラリで問題が発生。 解決コード:# SECRETキーに特殊文字が含まれている場合の处理
API_KEY = "あなたのAPIキー"
API_SECRET = "あなたのSECRETキー"
改行コードを削除(コピペ時に付与されることがある)
API_KEY = API_KEY.replace('\n', '').replace('\r', '').strip()
API_SECRET = API_SECRET.replace('\n', '').replace('\r', '').strip()
特殊文字が含まれていても安心な初期化方法
client = Client(
api_key=API_KEY.encode('utf-8'), # 明示的にエンコード
api_secret=API_SECRET.encode('utf-8')
)
または古いバージョンのバイナンスライブラリを使う
pip install python-binance==0.13.9
対応している時間足の種類
| 間隔コード | 説明 | 主な用途 | |---|---|---| |1m | 1分足 | 超短期取引、スキャルピング |
| 5m | 5分足 | 短期取引当日にエントリー |
| 15m | 15分足 | 短期取引 |
| 1h | 1時間足 | 中期取引、日内の趋势把握 |
| 4h | 4時間足 | 中期取引、複数の日期を分析 |
| 1d | 1日足 | 長期投資判断、週次の趋势 |
| 1w | 1週間足 | 長期間投资、月次の趋势 |
| 1M | 1ヶ月足 | 长期間投资、年次の趋势 |
---
次のステップ:HolySheep AI で本格的な分析を
Binance APIで市場のデータを收集できたら、次はAIを使って高度な分析を体験してみましょう。私は実際に 여러 가지 AI API を試しましたが、HolySheep AI はその中でも特にコストパフォーマンスに忧れていると感じています。 **HolySheep AI の導入メリット:** | メリット | 详细内容 | |---|---| | 💰 コスト削減 | ¥1=$1の汇率(公式サイト比約85%お得) | | ⚡ 低レイテンシ | 応答時間 <50ms | | 💳 豊富な決済方法 | WeChat Pay / Alipay / クレジットカード | | 🎁 初回ボーナス | 登録で無料クレジット进呈 | **2026年 最新API価格比較($8〜/MTok):** | モデル | 価格 (/MTok) | 特徴 | |---|---|---| | GPT-4.1 | $8.00 | 综合的な高性能 | | Claude Sonnet 4.5 | $15.00 | 长文処理に忧れる | | Gemini 2.5 Flash | $2.50 | 高速・低コスト | | **DeepSeek V3.2** | **$0.42** | **最安値・高いコスト効率** |
💡 私の实践经验:過去の価格データとAI分析を組み合わせた自动取引ボットを作成する際、HolySheep AI のDeepSeek V3.2モデルを使用しています。$0.42/MTokの低コスト 덕분에 实验的交易も经济的に気軽におえます。
---
まとめ:まずは小さく始めてみよう
この튜토리얼の要点
- ✅ APIは「计算机同士の通信約束事」
- ✅ Binance APIで過去の価格データが取得できる
- ✅ Python + pandasでデータ分析ができる
- ✅ matplotlibでグラフ可视化ができる
- ✅ エラー対処は「検认→対応→再試行」の流れ
向いている人・向いていない人
| ✅ 向いている人 | ❌ 向いていない人 | |---|---| | |Programmingの基礎知識があり、自分で分析ツールを作りたい人 | 完全初心者でProgrammingも数据分析も始めての人 | | |automatic取引や投资分析に興味がある人 | APIの仕組みを深く理解したい人(別の资料が必要) | | |Python运行环境整っている人 | まだPythonをインストールしていない人 | | |de Zentrum的に数据収集・分析したい人 | 完成された取引シグナルを配布むほしい人 |価格とROI
| 項目 | 費用 | ROI効果 | |---|---|---| | Python | 免费 | 数据分析スキルの аутох得 | | Binance API | 免费( السوق取引は手数料あり) | リアルタイム市場データアクセス | | HolySheep AI | ¥1=$1(约85%お得) | AI分析による投资判断補助 |👉 HolySheep AI に登録して無料クレジットを獲得
始めるなら今がチャンス!- 🎁 登録だけで無料クレジット进呈
- 💳 WeChat Pay / Alipay対応で日本用户も気軽に充值
- ⚡ API応答 <50msの高速处理
- 🔄 既存のOpenAI/Anthropic APIとの互換性