バイナンスの Futures(先物)API と Spot(現物)API の根本的な違いは、ベースドメインとパラメータセットにあります。現物(Spot)は api.binance.com/api/v3/* を使用し、先物(Futures)のU本位(USDT/USDC-M)は fapi.binance.com/fapi/v1/*、币本位(Coin-M)は dapi.binance.com/dapi/v1/* を使用します。署名アルゴリズムはどちらも HMAC-SHA256 ですが、先物では reduceOnly(リデュースオンリー)、positionSide(ポジションサイド)、leverage(レバレッジ)などの追加パラメータが必要となり、ウェイト(負荷)ルールも異なります。本記事では、10の観点から比較表と実戦コードを提示し、现物向けの量化戦略をスムーズに先物へ移行する方法を解説します。バイナンスアカウントをお持ちでない方は、まずバイナンス公式サイトで登録を完了してください。新規ユーザーの方は 無料登録 から口座を開設できます。
一、基礎比較一覧表
| 項目 | Spot(現物) | Futures(U本位) | Futures(币本位) |
|---|---|---|---|
| ベース URL | api.binance.com | fapi.binance.com | dapi.binance.com |
| パス接頭辞 | /api/v3/ | /fapi/v1/ および /fapi/v2/ | /dapi/v1/ |
| 証拠金通貨 | — | USDT, USDC | BTC, ETH, BNB 等 |
| 最大レバレッジ | 非対応(マージン取引のみ) | 125x | 125x |
| ヘッジモード | 非対応 | 対応(HEDGE モード) | 対応 |
| WebSocket URL | stream.binance.com:9443 | fstream.binance.com | dstream.binance.com |
| 最小注文額 | 5 USDT (MIN_NOTIONAL) | 5 USDT | 名目価値ベース |
| 資金調達率 | なし | 8時間ごと | 8時間ごと |
| 1分間ウェイト | 6000 | 2400 | 2400 |
| listenKey 有効期限 | 60分 | 60分 | 60分 |
重要なポイント:U本位のエンドポイントは常に fapi で始まり、币本位は dapi で始まります。現物のコードのURLを書き換えるだけでは動作しません。
二、署名メカニズムの細かな違い
署名アルゴリズム自体は同一(HMAC-SHA256)ですが、以下の2点に注意が必要です。
1. recvWindow のデフォルト値
- Spot:デフォルト 5000ms、最大 60000ms
- Futures:デフォルト 5000ms、最大 60000ms(ただし公式は 5000ms 以内を強く推奨)
2. 数値パラメータは文字列を推奨
Futures API は数値の精度に非常に敏感です。注文時の price や quantity は、浮動小数点の精度エラー(-1111 Precision)を避けるため、文字列形式で渡すことが推奨されます。
# 非推奨
{"price": 60000.123456789, "quantity": 0.001}
# 推奨
{"price": "60000.12", "quantity": "0.001"}
三、残高・ポジション照会のインターフェースの違い
Spot(現物)残高
# Spot: GET /api/v3/account
# balances 配列が返されます
{
"balances": [{"asset": "USDT", "free": "1000", "locked": "0"}]
}
Futures(U本位)ポジション照会
import hmac, hashlib, time, requests
from urllib.parse import urlencode
API_KEY = "YOUR_KEY"
SECRET_KEY = "YOUR_SECRET"
FAPI = "https://fapi.binance.com"
def _sign(params):
params["timestamp"] = int(time.time() * 1000)
query = urlencode(params)
params["signature"] = hmac.new(SECRET_KEY.encode(), query.encode(), hashlib.sha256).hexdigest()
return params
def get_positions():
"""V2 ポジション照会:保有中のポジションのみを返す"""
params = _sign({})
r = requests.get(f"{FAPI}/fapi/v2/positionRisk", params=params,
headers={"X-MBX-APIKEY": API_KEY})
return [p for p in r.json() if float(p["positionAmt"]) != 0]
def get_futures_balance():
"""V2 先物アカウント残高"""
params = _sign({})
r = requests.get(f"{FAPI}/fapi/v2/balance", params=params,
headers={"X-MBX-APIKEY": API_KEY})
return r.json()
positions = get_positions()
for p in positions:
print(f"{p['symbol']}: 数量 {p['positionAmt']}, 参入価格 {p['entryPrice']}, 未実現損益 {p['unRealizedProfit']}")
四、注文パラメータの比較
现物注文には4〜5個のパラメータで済みますが、先物注文にはポジションの方向、リデュースオンリー(減倉のみ)、セルフトレード防止などのフィールドが追加されます。
| パラメータ | Spot | Futures |
|---|---|---|
| symbol | 必須 | 必須 |
| side | BUY / SELL | BUY / SELL |
| type | LIMIT/MARKET/... | LIMIT/MARKET/STOP/TAKE_PROFIT/TRAILING_STOP_MARKET |
| quantity | 必須 | 必須(または closePosition を使用) |
| positionSide | — | BOTH(ワンウェイ)/ LONG / SHORT(ヘッジモード) |
| reduceOnly | — | true の場合、ポジション減少のみ許可 |
| closePosition | — | true で一括決済 |
| workingType | — | MARK_PRICE(マーク価格) / CONTRACT_PRICE(最新価格) |
| newOrderRespType | ACK/RESULT/FULL | ACK/RESULT |
Futures 限価注文の例
def place_futures_limit(symbol, side, quantity, price, position_side="BOTH"):
params = _sign({
"symbol": symbol,
"side": side,
"type": "LIMIT",
"timeInForce": "GTC",
"quantity": str(quantity),
"price": str(price),
"positionSide": position_side,
})
r = requests.post(f"{FAPI}/fapi/v1/order", params=params,
headers={"X-MBX-APIKEY": API_KEY})
return r.json()
# ロング 0.01 BTC、指値 60000
order = place_futures_limit("BTCUSDT", "BUY", 0.01, 60000)
print(order["orderId"])
五、レバレッジと証拠金モードの設定
Futures 固有の設定インターフェースです。
# レバレッジ倍率の設定
def set_leverage(symbol: str, leverage: int):
params = _sign({"symbol": symbol, "leverage": leverage})
r = requests.post(f"{FAPI}/fapi/v1/leverage", params=params,
headers={"X-MBX-APIKEY": API_KEY})
return r.json()
set_leverage("BTCUSDT", 10) # 10倍レバレッジに設定
# 証拠金モードの設定:ISOLATED(隔離)または CROSSED(交差)
def set_margin_type(symbol: str, margin_type: str):
params = _sign({"symbol": symbol, "marginType": margin_type})
r = requests.post(f"{FAPI}/fapi/v1/marginType", params=params,
headers={"X-MBX-APIKEY": API_KEY})
return r.json()
set_margin_type("BTCUSDT", "ISOLATED")
注意:該当ペアにポジションがある場合は証拠金モードを変更できません。決済後に変更する必要があります。
六、資金調達率(Funding Rate)
Funding Rate は先物特有の概念で、8時間ごとに決済されます。
# 最新の資金調達率を取得
def get_funding_rate(symbol="BTCUSDT"):
r = requests.get(f"{FAPI}/fapi/v1/premiumIndex",
params={"symbol": symbol})
data = r.json()
return {
"markPrice": data["markPrice"],
"fundingRate": data["lastFundingRate"],
"nextFundingTime": data["nextFundingTime"]
}
# 履歴の取得
def funding_history(symbol, limit=100):
r = requests.get(f"{FAPI}/fapi/v1/fundingRate",
params={"symbol": symbol, "limit": limit})
return r.json()
アービトラージのヒント:fundingRate がプラスならロングがショートに支払い、マイナスならその逆です。高いプラス金利が続く際の「U本位ショート + 現物ロング」は定番の金利アービトラージ戦略です。
七、ウェイトとリミットの違い
# Spot レスポンスヘッダー
X-MBX-USED-WEIGHT-1m: 45
X-MBX-ORDER-COUNT-10s: 3
# Futures レスポンスヘッダー
X-MBX-USED-WEIGHT-1m: 12
X-MBX-ORDER-COUNT-1m: 5
X-MBX-ORDER-COUNT-10s: 3
先物 API には、現物にはない**「1分間あたりの注文数上限」**(デフォルト 1200回/分)があります。高頻度取引(HFT)戦略では、この監視が重要になります。
八、WebSocket の違い
# Spot 市場データの購読
import websocket, json
def on_message(ws, msg):
data = json.loads(msg)
print(data["s"], data["c"]) # symbol, close price
# Spot
ws_spot = websocket.WebSocketApp(
"wss://stream.binance.com:9443/ws/btcusdt@ticker",
on_message=on_message)
# Futures U本位
ws_fut = websocket.WebSocketApp(
"wss://fstream.binance.com/ws/btcusdt@markPrice", # マーク価格の配信
on_message=on_message)
先物固有の購読トピックとして、@markPrice(マーク価格)、@forceOrder(強制決済通知)、@liquidation があります。
九、Spot + Futures 並列操作のコード例
ヘッジ戦略など、現物の買い + 先物の売りを同時に行う場合の実装例です。
import asyncio, aiohttp
async def spot_buy(session, symbol, qty):
# 簡略化:実際には署名が必要
async with session.post("https://api.binance.com/api/v3/order",
params={"symbol": symbol, "side": "BUY",
"type": "MARKET", "quantity": qty}) as r:
return await r.json()
async def futures_short(session, symbol, qty):
async with session.post("https://fapi.binance.com/fapi/v1/order",
params={"symbol": symbol, "side": "SELL",
"type": "MARKET", "quantity": qty}) as r:
return await r.json()
async def hedge():
async with aiohttp.ClientSession() as s:
results = await asyncio.gather(
spot_buy(s, "BTCUSDT", 0.01),
futures_short(s, "BTCUSDT", 0.01)
)
print(results)
asyncio.run(hedge())
十、よくある質問 FAQ
Q1: 1つの API Key で Spot と Futures の両方を操作できますか?
A: はい。API Key 設定で Enable Spot & Margin Trading と Enable Futures の両方にチェックを入れれば可能です。ただし、先物アカウントは Web 上で別途開設(クイズに回答)しておく必要があります。そうでないと API 呼び出しで -2015 Invalid API-key, IP, or permissions エラーが発生します。
Q2: fapi.binance.com と dapi.binance.com は残高が分かれていますか?
A: はい。U本位先物は USDT/USDC ウォレット、币本位先物は BTC/ETH 等の個別ウォレットを使用し、現物ウォレットとは完全に独立しています。資金を移動させるには、/sapi/v1/futures/transfer エンドポイントを使用して振替を行う必要があります。
Q3: 先物の v1 と v2 の違いは何ですか?
A: v2 は強化版で、主に精度とフィールド命名が最適化されています。残高やポジション照会には v2(/fapi/v2/positionRisk, /fapi/v2/balance)を使用し、注文系は v1(/fapi/v1/order)を使用するのが現在の標準です。
Q4: 統合アカウント(Portfolio Margin)の場合はコードを変える必要がありますか?
A: 統合アカウントは papi.binance.com/papi/v1/* という独立したドメインを使用し、エンドポイントは fapi に似ていますがパラメータが若干異なります。VIP または超大口アカウント専用の機能です。
Q5: 先物 API の最小注文額は?
A: U本位では原則として 5 USDT 相当の名目価値 です。具体的なフィルター値は GET /fapi/v1/exchangeInfo の MIN_NOTIONAL フィルターで確認できます。
API 連携に関するより詳細なガイドは、カテゴリナビに戻り、「API連携」カテゴリをご覧ください。