【サンプルコードつき】Binance FuturesのAPIの使い方(Python3)【自動売買】

Binance Futures API

※当サイトはアフィリエイト広告を利用しています

本記事の内容

Binance(USD-M Futures)のAPIの使い方を解説します。
価格の取得と注文機能をサンプルコードつきで載せています。

APIを使った自動売買を行いたい方向けの記事です。

Binance(Futures)のAPIを使いたい方向けに基本的な機能の「価格の取得」と「注文」を実装する方法を解説します。

注文はAPI認証が必要なため、APIドキュメントを見てもわかりづらいと感じる方も多いと思います。

Pythonでのソースコードを載せているので、APIドキュメントを見てもわからなかった方は参考にしてみてください。

APIでシステムトレードを実装するならさくらのVPS などの外部VPSが便利です。

Binanceの口座開設方法はバイナンス(Binance)口座開設の手順を参照ください。

Binance FuturesのAPIについて

BinanceのAPIの種類

Binance API ドキュメントを見ると、BinanceのAPIは4種類に分かれています。

Binance API
  • Spot/Margin/Saving/Mining
  • USD-M Futures ※この記事はこちら
  • COIN-M Futures
  • Vanilla Options

各サービスによってendpointが異なるので利用するサービスのドキュメントを参照しましょう。

USD-MとCOIN-Mの違い

USD-M FuturesはUSDTを担保にしてレバレッジトレードができます。

USD-M Futuresの特徴
  • ドルステーブルコインが担保なので計算がわかりやすい
  • 担保がUSDTだけでよい
  • 商品数が多い

COIN-M Futuresは後発機能で原資産を担保にレバレッジトレードができます。
例えばBTCUSDではBTCの担保が必要です。

COIN-M Futuresの特徴
  • contract単位なので計算がわかりづらい
  • 商品数ごとに担保の仮想通貨が必要
  • 資金管理は仮想通貨単位なので楽

USD-M Futuresが元々ある機能で商品数も多いので、よくわからない方はUSD-Mから始めればOKです。

価格情報を取得する(Market Data Endpoint)

Market Data Endpoint』を使用して価格情報を取得します。
API認証はいらないのでBinanceのアカウントがなくても使えます。

価格情報取得のコードの書き方

Binance Futuresでは「現在価格(last price)」と「板の売り、買い気配(bid、ask)」で取得先が変わりますが、基本的な書き方は同じです。

ライブラリのimport

HTTP通信でrequests、受信データを処理するためにjsonをimportします。

import requests
import json

リクエストのURLを作成

APIドキュメントに従ってまずはリクエストのURLを作成します。
USDT-M Futuresのendpointは「https://fapi.binance.com」です。

endpointに取得したい値のパスを設定します。

Price Ticker

この場合は「/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 management

API restrictionsは使う機能に絞りましょう。
Enable ReadingとEnable FuturesだけあればOKです。

注文機能のコードの書き方

基本的な書き方は上述の価格取得と同じですので、認証に絞って解説していきます。

認証に使うタイムスタンプを作成します。datetimeライブラリでミリ秒(13桁)まで作成します。

timestamp = round(datetime.now().timestamp()) * 1000

注文情報を設定します。クエリパラメータに設定して、URLを作るのが簡単です。
パラメータでMandatoryになっている項目は必須です。

new order
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の動かし方も参照ください。

9 件のコメント

    • コメントありがとうございます!以下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)

  • kenne へ返信する コメントをキャンセル

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です