Binance(USD-M Futures)のAPIの使い方を解説します。 価格の取得と注文機能をサンプルコードつきで載せています。
APIを使った自動売買を行いたい方向けの記事です。
Binance(Futures)のAPIを使いたい方向けに基本的な機能の「価格の取得」と「注文」を実装する方法を解説します。
注文はAPI認証が必要なため、APIドキュメントを見てもわかりづらいと感じる方も多いと思います。
Pythonでのソースコードを載せているので、APIドキュメントを見てもわからなかった方は参考にしてみてください。
APIでシステムトレードを実装するならさくらのVPS
などの外部VPSが便利です。
Binanceの口座開設方法はバイナンス(Binance)口座開設の手順を参照ください。
Contents
Binance FuturesのAPIについて
BinanceのAPIの種類
Binance API ドキュメントを見ると、BinanceのAPIは4種類に分かれています。

- Spot/Margin/Saving/Mining
- USD-M Futures ※この記事はこちら
- COIN-M Futures
- Vanilla Options
各サービスによってendpointが異なるので利用するサービスのドキュメントを参照しましょう。
USD-MとCOIN-Mの違い
USD-M FuturesはUSDTを担保にしてレバレッジトレードができます。
- ドルステーブルコインが担保なので計算がわかりやすい
- 担保がUSDTだけでよい
- 商品数が多い
COIN-M Futuresは後発機能で原資産を担保にレバレッジトレードができます。 例えばBTCUSDではBTCの担保が必要です。
- contract単位なので計算がわかりづらい
- 商品数ごとに担保の仮想通貨が必要
- 資金管理は仮想通貨単位なので楽
USD-M Futuresが元々ある機能で商品数も多いので、よくわからない方はUSD-Mから始めればOKです。
価格情報を取得する(Market Data Endpoint)
『Market Data Endpoint』を使用して価格情報を取得します。 API認証はいらないのでBinanceのアカウントがなくても使えます。
価格情報取得のコードの書き方
Binance Futuresでは「現在価格(last price)」と「板の売り、買い気配(bid、ask)」で取得先が変わりますが、基本的な書き方は同じです。
- 現在価格:Symbol Price Ticker
- 板の売り、買い気配:Symbol Order Book Ticker
ライブラリのimport
HTTP通信でrequests、受信データを処理するためにjsonをimportします。
import requests import json
リクエストのURLを作成
APIドキュメントに従ってまずはリクエストのURLを作成します。 USDT-M Futuresのendpointは「https://fapi.binance.com」です。
endpointに取得したい値のパスを設定します。

この場合は「/fapi/v1/ticker/price」です。 また、パラメータとして、symbolを指定されているため、URLのクエリパラメータも作成します。

「?symbol=BTCUSDT」のように設定します。
endpoint = 'https://fapi.binance.com' func = '/fapi/v1/ticker/price' query = '?symbol=' symbol = 'BTCUSDT' url = endpoint + func + query + symbol;
このようなリクエストが出来上がります。
# https://fapi.binance.com/fapi/v1/ticker/price?symbol=BTCUSDT
リクエストを送信
出来上がったリクエストをrequestsライブラリを使って送信します。 APIドキュメントよりGET指定なので、getメソッドを利用します。
res = requests.get(url)
受信データをjson形式で読み込みます。
data = json.loads(res.text)
以下のようにjson形式でデータを処理できるようになるので、必要なデータを取得します。
# {'symbol': 'BTCUSDT', 'price': '52550.00', 'time': 1613597892090}
価格情報取得のコードのサンプル
現在価格(last price)を取得するサンプル
import requests import json endpoint = 'https://fapi.binance.com' func = '/fapi/v1/ticker/price' query = '?symbol=' symbol = 'BTCUSDT' url = endpoint + func + query + symbol; res = requests.get(url) data = json.loads(res.text) last_price = data['price'] print(last_price)
板の売り、買い気配(ask、bid)を取得するサンプル
import requests import json endpoint = 'https://fapi.binance.com' func = '/fapi/v1/ticker/bookTicker' query = '?symbol=' symbol = 'BTCUSDT' url = endpoint + func + query + symbol; res = requests.get(url) data = json.loads(res.text) bid_price = data['bidPrice'] ask_price = data['askPrice'] print(bid_price,ask_price)
注文を発注する(Account Trade Endpoint)
注文を発注するにはBinanceアカウントにログインしてAPIトークンとシークレットコードの発行が必要です。
認証処理も実装します。
バイナンス(Binance)口座開設の手順APIキーを発行する
Binanceの『API management』からAPIキーを発行できます。

API restrictionsは使う機能に絞りましょう。 Enable ReadingとEnable FuturesだけあればOKです。
注文機能のコードの書き方
基本的な書き方は上述の価格取得と同じですので、認証に絞って解説していきます。
認証に使うタイムスタンプを作成します。datetimeライブラリでミリ秒(13桁)まで作成します。
timestamp = round(datetime.now().timestamp()) * 1000
注文情報を設定します。クエリパラメータに設定して、URLを作るのが簡単です。 パラメータでMandatoryになっている項目は必須です。

path = '/fapi/v1/order?'; side = "BUY" price = 30000 quantity =0.01 query = 'symbol=' + "BTCUSDT" + '&side=' + side + '&price=' + str(price) +'&type=LIMIT&timeInForce=GTC' +'&quantity=' + str(quantity) +'×tamp=' + str(timestamp);
APIドキュメントより、HMAC-SHA256でハッシュ化した署名を作成します。hmacとhashlibというライブラリを使って上記のように記載します。
signature = hmac.new(bytearray(secret_key.encode('utf-8')), query.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()
ハッシュ化するのはクエリパラメータの「?」より後の部分(サンプルのqueryのところ)です。 うまく署名できていないと「Signature for this request is not valid.」やtimestamp系のエラーが出続けます。
APIドキュメントより、URLのクエリに署名を追加します。
url = endpoint + path + query + '&signature=' + signature
apiキーをrequestのheadersに設定してリクエストします。
headers = { 'X-MBX-APIKEY': aki_key } res = requests.post(url, headers=headers) datas = json.loads(res.text)
上記が成功すると以下のようなメッセージが返ってきます。
# {'orderId': 14543141835, 'symbol': 'BTCUSDT', 'status': 'NEW', 'clientOrderId': 'SmpOtlzGamK7R2bEE9bC4u', 'price': '30000', 'avgPrice': '0.00000', 'origQty': '0.010', 'executedQty': '0', 'cumQty': '0', 'cumQuote': '0', 'timeInForce': 'GTC', 'type': 'LIMIT', 'reduceOnly': False, 'closePosition': False, 'side': 'BUY', 'positionSide': 'BOTH', 'stopPrice': '0', 'workingType': 'CONTRACT_PRICE', 'priceProtect': False, 'origType': 'LIMIT', 'updateTime': 1613747043962}
注文機能のコードのサンプル
import requests import json from datetime import datetime import hmac import hashlib timestamp = round(datetime.now().timestamp()) * 1000 endpoint = 'https://fapi.binance.com' api_key = "xxxxxx" secret_key = "yyyyyy" path = '/fapi/v1/order?'; side = "BUY" price = 20000 quantity = 0.01 query = 'symbol=' + "BTCUSDT" + '&side=' + side + '&price=' + str(price) +'&type=LIMIT&timeInForce=GTC' +'&quantity=' + str(quantity) +'&' + 'timestamp=' + str(timestamp); signature = hmac.new(bytearray(secret_key.encode('utf-8')), query.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest() url = endpoint + path + query + '&signature=' + signature headers = { 'X-MBX-APIKEY': api_key } res = requests.post(url, headers=headers) datas = json.loads(res.text) print(datas)
Binance FuturesのAPIの使い方まとめ
Binance FuturesのAPIの使い方を解説しました。
認証はやや難しいですが、APIドキュメントを読み込めば実装できます。 上記のサンプルも参考に作って見てくださいね。
APIでシステムトレードを実装するならさくらのVPS
などの外部VPSを利用すると24時間稼働できて便利です。
価格で選ぶならさくらのVPS
、使いやすさ、安定性で選ぶならConoHa VPS
がいいですよ。
自作アービトラージbotの動かし方も参照ください。
有益な情報ありがとうございます!
とても参考になりました!
注文機能のコードのサンプルがうまくいかないんですが、ところどころ間違ってませんかね?
コメントありがとうございます!以下2箇所に不備がありましたので修正しました。
注文は通ることを確認できました。
query = 'symbol=' + "BTCUSDT" + '&side=' + side + '&price=' + str(price) +'&type=LIMIT&timeInForce=GTC' +'&quantity=' + str(quantity) +'&' + 'timestamp=' + str(timestamp);
headers = {
'X-MBX-APIKEY': api_key
}
早速のご返答ありがとうございます。注文もうまく通るようです。ありがとうございます。
何回も質問すみません。現在のUSD-Mの保有ポジションを通貨を指定して確認するコードを知りたいのですがご教授いただけないでしょうか。注文と価格取得はできたのですが、保有ポジション量で注文数量を決めたいのに現在の保有ポジション量の取得ができなくて困っております。
Position Information V2 (USER_DATA)(/fapi/v2/positionRisk)が使えそうなので試してみてください。
この記事の「注文機能のコードのサンプル」の以下を変更すればポジション量を取得できます。
PathをPosition Information V2 (USER_DATA)に変更
path = '/fapi/v2/positionRisk?';
QueryをPosition Information V2 (USER_DATA)の引数に変更(symbolとtimestamp)
query = 'symbol=' + "BTCUSDT" +'&' + 'timestamp=' + str(timestamp);
RequestsのPostをGetに変更
res = requests.get(url, headers=headers)
返答ありがとうございます。試してみます。
これは売りから入ると時はside = “BUY”をside = “SELL”にすれば良いだけでしょうか?
はい、side = “BUY”に変更すれば大丈夫です。お試しください。