【BOT】Binance APIを使って遊んでみた【備忘録】

自分の自分による自分のためのメモ。本記事で何か起こっても責任は取れません。単なるメモです備忘録です(※予防線)

 

最近冬相場で取引所に仮想通貨を預けるなんてナンセンス!な話題が飛び交っております。飛び交っておりますが、私はBNBを少し保有しており、BinanceがやられたらそのBNBなんて自分のウォレットに保管してても無駄だよねって思ったので、いっそのこと全部Binanceに入れておけって感じでやってます。

 

本来であれば日本取引所に来たFTX JPを使ってキャッキャやっていた所ですが、破綻してしまったので仕方ありません。

 

で、FTX JPでクオンツゾーンによる簡易BOTを作成して遊んでいたのですが、それができなくなりました。凄くガッカリしたのでBinance APIを使ってBOTを作っている日々です。ということで、自分が躓いた所とかメモを残しておく。(2022/11/24現在)

 

備忘録メモ一覧

最初にやること

  • Python3入れる
  • APIキーを発行する(※許可IPした方がいい)
  • 必要であればpython-binanceを入れる(非公式ラッパー)

 

まず環境整備ですが、Python3が入ってる環境ならどこでも動くと思います。後はAPIキーも必要。必要だがそこは割愛。単にBinanceでAPIキーを作成するだけなので。

 

一応、APIキーで受発注ができてしまうことになるため、自分のIPアドレスだけ許可する形でキーを発行しました。私の環境だとIPはアクセス元IPは都度変更されちゃうのですが、その都度APIキーの許可IPを変えればいいかなっていうスタンスで進める。

 

自分のIPは「IP 確認」でググれば普通に分かる。

 

で、最後の「python-binance」についてですが、ググってみると「公式ラッパー」みたいなことがたくさん書いてあるが、あくまで非公式なので注意。というか日本語化した説明サイトに非公式って書いてあるし。以下サイト。使っていいか正直良く分かってないので分からなければ使わないの方が良い。私は少額レベルなのでまぁ、良いかって感じで使ってる。

 

ttps://python-binance-jp.readthedocs.io/ja/latest/

 

但し注意点として、COIN-Mに対する機能が無いので、現物もしくはUSDS-Mしか使えないので注意。(※USDS-Mも使えないかも?未検証)

 

まず見るべき場所

以下Binance APIサイト。ここにマニュアルがあるのでここをまず見ることになる。

ttps://www.binance.com/ja/binance-api

 

とはいえ、たくさん英語で書いてあって良く分からないですよね!!!(※私は分からなかった)

 

なので、とりあえず分かった部分を備忘録でこれから記載していきます。ここでは「現物」と「COIN-M」に対して話を進めていく。

 

また、python-binanceのサイトもチェックしておくと捗るが、使わなくても別にBOTは作れる。便利な関数が使えると覚えておけばいい。(※COIN-Mが無いのでそこは自分で作る必要があるが・・・)

ttps://python-binance-jp.readthedocs.io/ja/latest/index.html

 

python-binanceインストール(※任意)

現物取引で便利なので入れる。入れなくても公式API使えば全然いける。COIN-Mは公式APIを使うので、分からなければCOIN-Mの備忘録を参考に現物取引側も作れば全然いける。

 

インストールは環境に依存するので一概には言えないが、python-binanceインストールで失敗した場合は以下コマンドを実行したりする。

 

pip3 install --upgrade setuptools

pip3 install python-binance

 

自分の環境の場合、上記だけだとエラーがでたので、Linux上でgccとかも別途入れてみました。

 

yum install gcc-devel

yum install python3-devel

yum install gcc-c++

 

自分の環境の場合、更にこれだけじゃ動かなかったので以下も適当に実行してます。

pip3 install wheel

 

多分この辺ぐちゃぐちゃ入れて最後にpython-binanceインストールすれば通った。あくまで私の環境なのでその辺は割愛。

 

これで大体準備は整った。ということで、次へ。

 

簡単に確認できるサンプル(※板情報チェック)

とりあえず、いきなりBOT作るのはちょっと怖いので、まずはAPIはどういう風に動くのか簡単に見てみましょう。実はAPIWebブラウザでアクセス可能だったりします。

 

たとえば、以下のURLへアクセスすると、BNB/BUSDの板情報を取得できる。

 

ttps://api.binance.com/api/v3/ticker/bookTicker?symbol=BNBBUSD

 

これで現在の現物の板情報が見れる。末尾のsynbol=BNBBUSDを外せば全部見れる。

 

イメージとしては結構これでつかめたんじゃないかなと思う。

 

但し、APIキーが必要なもの(自分の残高とか注文とか)な場合はWebブラウザ経由ではやらないでPython3のスクリプト経由でやるのが良いでしょう。暗号化してPOSTで送ったりするのでWebブラウザ上でやるのは中々やる必要はないかなと。

 

ただ、参照するだけであれば、まずWebブラウザで検証するのは割と個人的にオススメです。

 

とりあえず使いそうなのをimportしとく

ここからはPython3のソースの中身の話になります。

自分が使う関数を入れておきます。とりあえず先頭に入れておく。動作速度とか全然考慮してません。動けばいいですで入れる。

 

import requests
import json
from datetime import datetime
import hmac
import hashlib
import sys
import time
from decimal import *
from binance.client import Client

 

エンドポイントを変数に入れとく

ここからはPython3のソースの中身の話になります。

 

エンドポイントについて、「現物」、「USDS-M」、「COIN-M」でURLが分かれているので、ここを抑えておく。変数化しておくと便利。

 

# 現物のエンドポイント
endpointg='https://api.binance.com/'

# USDS-Mのエンドポイント
endpointu = 'https://fapi.binance.com'

# COIN-Mのエンドポイント
endpointc = 'https://dapi.binance.com'

 

例えば現物取引したいとか、現物のウォレット見たい場合は"api.binance.com"を見て、COIN-Mに預けた証拠金とか取引したかったら"dapi.binance.com"に対してアクセスすることになります。

 

APIキーを設定しておく

BinanceでAPIキーを作成すると二つのランダムな文字列が出てくるので、それを変数に入れてしまいます。セキュリティ考慮するなら、ソースに直接書くのはご法度ですが、私は少額しか入れていないのと、グローバルIP制御もしてるので、まぁいいか、って感じで入れてしまってます。

 

api_key = "APIキー"

secret_key = "秘密鍵"

 

# Client作成(binanceAPIのやつ。非公式)
client = Client(api_key, secret_key)

 

clientについては、python-binanceで使う変数になる。インストールしている場合はここでAPIキーを含んだclientを作成できるので、そこでわちゃわちゃできる。必要であれば作っておく。

 

APIキーが必要な情報を送信するコマンドテンプレート

以下はサンプル。ここの「path」と「query」をいじるだけで今後はAPIキーを使った機能(注文とかステーキング枚数チェックとか)ができるので、とにかくこのテンプレート抑えておけば何とかなる。

 

サンプルとして2つ載せておく。基本赤字部分を修正すれば以降も使いまわせるので便利。pathとquery部分は関数化しておくと楽だと思います。

 

■USDTにてFlexibleステーキングに預けている枚数を確認する

# タイムスタンプ。必須になることが多いので用意。
timestamp = round(datetime.now().timestamp()) * 1000


path = '/sapi/v1/lending/daily/userRedemptionQuota?';
query = 'productId=USDT001&type=FAST' + '&timestamp=' + str(timestamp);


signature = hmac.new(bytearray(secret_key.encode('utf-8')), query.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()

url = endpointg + path + query + '&signature=' + signature

headers = {
    'X-MBX-APIKEY': api_key
}
res = requests.get(url, headers=headers)
res1 = res.json()
# 償還できる全枚数をredeem変数に入れておく。
redeem = str(res1["leftQuota"])

print (redeem)

 

最後のres = requests.get部分の"get"部分を"post"にしたりすることもあります。ここはマニュアルで POSTかGETかどっちが必要か書いてあるのでそこで修正する感じです。

 

次はPOSTの場合のサンプル。

 

■USDTにてFlexibleステーキングで預けている枚数すべて取り出す(※上記サンプルの続き)

# タイムスタンプ。必須になることが多いので用意。
timestamp = round(datetime.now().timestamp()) * 1000

 

path = '/sapi/v1/lending/daily/redeem?';
query = 'productId=USDT001&amount=' + str(redeem) + '&type=FAST' + '&timestamp=' + str(timestamp);

signature = hmac.new(bytearray(secret_key.encode('utf-8')), query.encode('utf-8') , digestmod = hashlib.sha256 ).hexdigest()

url = endpointg + path + query + '&signature=' + signature

headers = {
    'X-MBX-APIKEY': api_key
}
res = requests.post(url, headers=headers)
datas = json.loads(res.text)
print (datas)

 

 

たいてい、POSTが必要なものは実際に物を動かしたり注文したりする場合に使いますので、そういう時はrequests.postを使う形となります。後は本当に「path」「query」と「エンドポイント」の指定先を修正するだけなので、上記サンプルを覚えておけばなんにでも流用できる。

 

ということで、個人的に使いたい機能部分だけ備忘録で残しておく。

 

逆引き備忘録

 

自分の現物(例ではBNB)の仮想通貨枚数知りたい

free = client.get_asset_balance(asset="BNB")["free"]

python-binanceを使ってます

 

COIN-Mでポジション枚数を知りたい

path = '/dapi/v1/account?';

query = 'timestamp=' + str(timestamp);

→後は先ほどのテンプレ通りやればとれる。ただし、出力方法としてfor文で自分が欲しい銘柄のpositionAmtを取得する工夫は必要。

 

胃かはBNBUSD_230331のポジション枚数の確認だ。

 

res = requests.get(url, headers=headers)
res1 = res.json()
for item in res1["positions"]:
    if (item["symbol"] == "BNBUSD_230331"):
        position = Decimal(item["positionAmt"])

print (position)

→positionで出た数値 * 10倍することで、何ドル投資したか分かる。COIN-Mでのポジション枚数は基本"ドル"だということを覚えておく。結果が 1 = 10ドルなのでほんと、そこだけ注意。

 

板情報取得したい

■現物

/api/v3/ticker/bookTicker

■COIN-M

/dapi/v1/ticker/bookTicker

 

?symbol=BNBUSDTとか入れれば、知りたい銘柄だけ知ることが可能。

 

注文したい

■現物(BNBBUSDに対して0.1枚取引)を成行注文

order = client.order_market_buy(symbol="BNBBUSD", quantity=0.1)

order = client.order_market_sell(symbol="BNBBUSD", quantity=0.1)

python-binanceを使ってます

 

symbolとquantityに商品名、枚数を入れればOK。通常は変数化して対応する。

 

■COIN-M(BNBUSD_230331に対して0.1枚取引)を成行注文

path = '/dapi/v1/order?';

tick2 = "BNBUSD_230331"
side = "BUY"
quantity = 0.1
query = 'symbol=' + tick2 + '&side=' + side + '&type=MARKET'  +'&quantity=' + str(quantity) +'&' + 'timestamp=' + str(timestamp);

→後は先ほど説明したテンプレに当てはめればいい。query部分が注文する場合は長くなる感じだ。売りたい場合はside = "SELL"にすればいい。

 

COIN-Mの清算価格(強制ロスカット価格)を知りたい(BNBUSD_230331ポジ)

path = '/dapi/v1/positionRisk?';
query = 'timestamp=' + str(timestamp);

~~~

res = requests.get(url, headers=headers)
res2 = res.json()
for item in res2:
    if (item["symbol"] == "BNBUSD_230331"):
        seisan = Decimal(item["liquidationPrice"])

 

→liquidationPriceを指定することで強制ロスカットの価格が分かる。その水準までくる前にクロスを辞めたりとか、その分現物側で買い支えをするとか色々役に立つと思う。多分。

 

 

これ使って主は何やってんの?

私はこれ使って過去の小銭稼ぎマシンを復活させました。

 

okometsubulog.hatenablog.com

 

当時FTX JPでやってたのですが、御覧の通りFTX破綻により結果は散々。ある程度解消しつつも、結局ポジションは幽閉されてしまっています。悲しい。

 

Binanceの場合、FTX JPと違って大変なのは、証拠金が取引通貨しか使えないこと。今回、BNBUSDをロングしているのですが、証拠金はBNBしか使えません。現物売りして得たBUSDは証拠金として使えないため、ロスカットが非常に怖い状況にあります。

 

そのため、この辺も上記の機能を使ってBOT化しておいて、例えば強制ロスカット水準まで現在価格が到達したらクロスを解消するBOTを作っておくとかすればいいわけです。

 

で、現物のBUSDはもったいないので途中までステーキングして放置。今現在1000ドルまでは年利6%つくので。注文が発生する条件が整ったら、全部のステーキングを解除して、それを元手に現物買い、先物ロング解消(売り)を行う感じで進めます。

 

改めて思いますが、完全に取引所を信頼しないとできない方法なのでBinance破綻がかなり怖いです。その他リスクはあると思うので、興味がある場合は自身が耐えられる許容範囲で楽しむ程度にとどめた方が良いかなと思います。

 

https://www.binance.com/ja/futures/ref/107522713

アフィリンク張り

ということで、Binanceのアフィリンクを張っておきます。取引手数料10%割引になるそうです。ただ、海外取引所なのでリスクを踏まえた上で興味があればで。

日本上場しそうな雰囲気の中日本からの新規受け入れが無くなったので削除しました

 

【参考文献】

Binance API

ttps://www.binance.com/ja/binance-api

 

Welcome to python-binance v0.6.2

ttps://python-binance-jp.readthedocs.io/ja/latest/index.html

 

【サンプルコードつき】Binance FuturesのAPIの使い方(Python3)【自動売買】 | アビトラライフ

ttps://abitolife.com/binance-futures-api