アービトラージは取引所の価格を取得して比較して安いほうで買い、高い方で売る。
勝利が約束されているのだ。
とりあえず取引所の価格を取得してprintしてみよう。
Table of Contents
GitHub新規リポジトリ作成
GitHubにコードを保存していきます。
Privateで非公開リポジトリです。
これ使う。
1 2 3 4 5 6 7 |
echo "# mlbot-hosono-style" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin https://github.com/harukihosono/mlbot-hosono-style.git git push -u origin main |
ここにコードを順次アップロードします。
Visual Studio Codeをインストール
VSCodeをインストールします。インストールしてある人は飛ばしてね。
使い方はしまぶーさんに動画がわかりやすい。
VSCodeでGitHubに接続します。
コードの保存→GitHubのリポジトリにプッシュでコード管理できます。
ファルダ一覧
今回はプログラムの量が大きくなるのでファイルをわけました。
取引所ごとにプログラムを作ってあります。
今回はBinanceとBybitでやっていきます。
手法としては、BinanceとBybitの価格差が開いたタイミングで安い方でロングエントリー、高い方でショートエントリーします。
bot/
├ binance_.py
├ bybit_.py
├ main.py
├ requirements.txt
使うライブラリ
- binance-futures-connector
- pybit
- matplotlib
binance_.py
1 2 3 4 5 |
from binance.um_futures import UMFutures um_futures_client = UMFutures() def price(symbol): res = um_futures_client.ticker_price(symbol) return res["price"] |
バイナンスの価格を取得する機能です。
bybit_.py
1 2 3 4 5 6 7 8 9 10 |
from pybit import usdt_perpetual session_unauth = usdt_perpetual.HTTP( endpoint="https://api.bybit.com" ) def price(symbol): res = session_unauth.latest_information_for_symbol( symbol=symbol, ) price = res["result"][0]["last_price"] return price |
バイビットの価格を取得する機能です。
main.py
1 2 3 4 5 6 7 |
import bybit_ import binance_ symbol= "BTCUSDT" bybit_price = bybit_.price(symbol) binance_price =binance_.price(symbol) print(bybit_price) print(binance_price) |
メインプログラム。
今回は取引所のビットコインの価格を取得してログ画面に出力させてます。
requirements.txt
1 2 3 |
binance-futures-connector pybit matplotlib |
インストール方法
pip install -r requirements.txt
main.pyの実行結果
プログラムの起動に成功しました。
BinanceとBybitの価格を拾えたので、これを比較して一定の差が発生したらトレードをします。
価格取得時間を計測してみる
本編とは関係ないですが、ちょっと寄り道して価格取得の時間を計測してみましょう。
Python 実行時間とネットで調べるとやり方がでてきました。
おそらくアビトラは速度が命と思っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import time # 開始 start_time = time.perf_counter() import bybit_ import binance_ symbol= "BTCUSDT" bybit_price = bybit_.price(symbol) binance_price =binance_.price(symbol) print(bybit_price) print(binance_price) # ダミー処理 time.sleep(1) # 修了 end_time = time.perf_counter() # 経過時間を出力(秒) elapsed_time = end_time - start_time print(elapsed_time) |
1秒はダミーの数字なので価格の下に表示されているのが実行時間の計測結果です。
0.5秒はなんか遅いような気もしますが、まあとりあえずヨシです。
main.pyを改造してチャートを描画する
以下のサイトのコードが参考になりました。
感謝しつつコピペしてきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import datetime import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import bybit_ import binance_ # symbol名を入力 SYMBOL = "BTCUSDT" # しきい値を入力 SIKIITI = 0.02 symbol = SYMBOL sikiiti = SIKIITI num = [] x = [] bybit_price_y = [] binance_price_y = [] def animate(i): bybit_price = bybit_.price(symbol) binance_price =binance_.price(symbol) # X軸 x.append(len(num)) num.append(1) # Y軸 bybit_price_y.append(float(bybit_price)) binance_price_y.append(float(binance_price)) # 最大・最小を計算して、割合を計算する price = [bybit_price_y[-1],binance_price_y[-1]] price_min = min(bybit_price_y[-1],binance_price_y[-1]) price_max = max(bybit_price_y[-1],binance_price_y[-1]) kakakusa = round(price_max / price_min - 1,5) * 100 # BUY if price_min == price[0]: buy_name = "bybit" buy_num=0 elif price_min == price[1]: buy_name = "binance" buy_num=1 # SELL if price_max == price[0]: sell_name = "bybit" sell_num=0 elif price_max == price[1]: sell_name = "binance" sell_num=1 if sikiiti <= kakakusa: message = str(datetime.datetime.now().strftime('%H:%M:%S')) +"\n"+symbol +"\n"+ f'{kakakusa:.3f}' + "%" +"\n"+ "BUY:" + buy_name + str(price[buy_num]) +"\n"+ "SELL:" + sell_name + str(price[sell_num])+"\n" print(message) plt.cla() main_text = "Price_Gap: " + f'{kakakusa:.3f}' +"%" plt.title(main_text,color="green") plt.xlabel("Time") plt.ylabel(symbol) plt.plot(x,bybit_price_y ,label="bybit") plt.plot(x,binance_price_y ,label="binance") plt.legend(loc="upper left") plt.tight_layout() if len(x) >= 100: num.clear() x.clear() bybit_price_y.clear() binance_price_y.clear() ani = FuncAnimation(plt.gcf(),animate,interval=1000) plt.tight_layout() plt.show() |
コピペだけど、ちょっとつけたしました。
- 見た目変更
ログ画面に
- 時刻表示
- 通貨名表示
- 価格差をパーセント表示
- Binance価格表示
- Bybit価格表示
最後に描画部分をちょろっと解説して今回はおわりです。
価格差のチャートはあってもなくても稼働に支障はないのでそこまでコストをかけて覚える必要はないと思います。
以下のコードでシンボルとしきい値を入力できます。
1 2 3 4 |
# symbol名を入力 SYMBOL = "BTCUSDT" # しきい値を入力 SIKIITI = 0.02 |
- 縦は取引所の価格です。
- 横は時間なのでインデックス数です。
なので価格とインデックスを保存するリストを先につくります。
1 2 3 4 |
num = [] x = [] bybit_price_y = [] binance_price_y = [] |
あとはmatplotlibのYoutube動画をみると理解が深まると思います。
サプーさんの動画が分かりやすい。
今回はここまでです。
価格取得と描画まで出来ました。
次回はトレードするとこまで予定しています。
わからないことはコメントまでお願いします。
続きは以下のページです。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…