【Pythonコード】Bybitで仮想通貨FXのアルゴリズムトレードを動かす

・仮想通貨 FX を Python プログラムから自動で行いたい

・寝ている間も自動で利益を狙いたい
こういった思いを持つ方に向けて記事を書いていきます。
この記事に書いてあること
・そもそも仮想通貨 FX とはどういうものか
・bybitの API操作用の 公式Pythonライブラリの使い方
・ゴールデンクロスを利用した自動売買コード(無料公開)

【仮想通貨FXとは】Bybitの特徴

まずはじめに今回のテーマである仮想通貨FXとその取引所であるBybitについて解説します。
(経験者は読み飛ばしても OK です)

仮想通貨 FX とは、一言で言えばドル・円などの法定通貨で行われていた為替取引(FX)をビットコイン、USDTなどの仮想通貨でも行えるようにしたものです。
通常の仮想通貨取引と異なり、以下のような特徴があります。
仮想通貨FXの特徴
・手軽にレバレッジがかけられる(bybitの場合、最大100倍)
・売り(ショート)から参入できる
・差金決済方式(利益or損失の分だけ最終的な資産の受け渡しが生じる)
これらを見て分かる通り、仮想通貨 FX は法定通貨のFXの経験がある人にとっては馴染みやすいものかもしれません。

総じて、仮想通貨FXは投機色が強いです。
長期的な資産運用よりも、リスク覚悟で短期から中期で大きな利益を狙いたい人に向いています。
しかも法定通貨のFXは国内業者の場合レバレッジが25倍に制限されていますが、今回紹介するBybitでは100倍ものレバレッジをかけることが可能です。
※リスク管理として、慣れないうちはレバレッジを小さめにするか、取引ロットを押さえておくことをお勧めします。
そんな仮想通貨 FX を Python プログラムから自動でやってみようというのがこの記事の主旨です。
特に、最近勢いのある業者Bybitを使えば初心者でも割と簡単に自動売買botを動かせます。

Bybitのメリット・デメリット

さてここで簡単に、今回使用するBybitの特徴を見ておきましょう。
Bybitは2018年にシンガポールで出来たばかりの新しいサービスですが、2021年現在で既に130国以上で展開しています。

競合大手のBitMexが日本人新規向けのサービスを終了したこともあり、現状では仮想通貨 FX を始めたい日本人には最有力の選択肢ではないでしょうか。
Bybitのメリット
・レバレッジが大きい(最大100倍)
・公式ライブラリが非常に使いやすい
・日本語で利用できる
・すぐに取引ができる
Bybitのデメリット
・日本円の入金が出来ない
・取引が基本的にドル基準で行われる
・ccxtからAPIが使いにくい
Python で自動売買をしたい人にとってはバイビットはかなりオススメです。
というのもAPI使用のための公式ライブラリがとても使いやすいんですね。
ドキュメントも充実していてGOODです。

また海外業者なので、取引を始めるまでに面倒くさい身分証明書の認証などがないのもいいです。
仮に今Bybit口座を持っていなくても、今から作業を始めれば2時間後にはコードを動かして売買することも可能です。

ついでに言うと、ゼロカットシステム(レバレッジをかけすぎて、万が一借金を負うほどの損失が出ても、借金分はBybitが負担してくれる)なのも嬉しいところです。

逆にデメリットは入金方法の複雑さです。
bybitでは日本円の入金ができません。
口座に入金するには、Bybit上でクレジットカードで仮想通貨を購入するか、すでに日本の取引所等で所有している仮想通貨をバイビットに送金する必要があります。
こうして入金した仮想通貨を証拠金として使っていくわけですね。

また、取引は基本的にドル基準で行います。
「XXドル分の仮想通貨ポジションを保有する」といった操作を行うので日本人の僕には少し不慣れな感じもあります笑。
例えば仮想通貨をロングしたい(購入するポジションを持ちたい)場合、
「1000ドル分のBTCをロングする」
という意味の注文を出します。
最後に、仮想通貨bot使いの間でよく使われているAPIラッパーであるccxtから操作しにくい点もデメリットとして挙げられると思います。
成行注文なのにccxtを使ったコードでは価格指定する必要があるような無いような、、といった感じでややこしいです。
そもそも引数のamountとqtyの違いがこんがらがってきたりと、結構ハマるかもしれません(というか僕はハマりました)。

またバイビットに関してはサードパーティライブラリも正直微妙だなぁというのが僕の感想です。
公式のライブラリ(当然無料)を使うのが一番安心かつ効率的だと思います。
ちなみに今回の記事で取り扱うインバース無期限型の取引では、Bybitの手数料は以下のようになっています。
公式サイトより
テイカー注文(成行注文を初めとする、板から流動性を奪う注文)の手数料は0.075%で、メイカー注文(逆に流動性を増やす注文)の手数料は-0.025%(つまりお金もらえる)となっています。

自動売買の為の下準備

さて、ここから実際にバイビットで自動売買botを作るための準備をしていきましょう。

Bybitで口座開設する

まずはBybitで口座開設する必要があります。
日本の取引所と違い、開設は10分もかからず終わります。
下のバナーをクリックした先にある、 「アカウント登録」のところから登録してください。
ちなみに僕は先日Bybitの中の人とちょっとしたご縁をいただいたのですが、このバナーはこのブログのために特別に作っていただきました。
クリックした先の登録フォームで登録し、10万円相当以上のBTCを入金することで登録者様にボーナスが付与されます。

なお、登録に必要な情報はメールアドレスとパスワードのみです(2021年現在、証明書類などは不要)。

APIキーを発行する

登録が完了したらPython botを動かすのに必要なAPIキーを発行しましょう。

やり方は簡単です。
まず二段階認証を設定していないと API キーは発行できないので、 Google 認証アプリで2段階認証を設定しましょう。
ログイン後、右上のメアドのところから アカウント&セキュリティタブの「2段階認証」のところにある「google認証」を選択します。
右部分の黄色い「認証コードを送信する」を押します。
送られてきたQRを使ってgoogle認証アプリをインストール&Bybitを登録すればOKです。
Bybitにログインしてトレードの画面に行ったら、
右上のメールアドレスが表示されている所
⇒アカウント&セキュリティ
⇒API管理のタブ
⇒「新しいキーの作成」
と進むことで自分の API キーを作成できます。
ちなみに僕は次のような感じで API キーを発行してみました。
僕のように API キーと自分の IP アドレスを紐付けていない場合は3ヶ月で有効期間が切れてしまうようです。
これが嫌な人は、自分の IP アドレスを入力しておきましょう。
(ちなみに自分のIP アドレスはこのサイトにアクセスすれば一瞬で分かります。 )

以上の手順を行うことで自分の API キーと API Secret Key が確認できました。
シークレットの方は一度しか表示できないので、安全なところにメモしておきましょう。
(忘れた場合はまた新たな API キーを発行すれば OK です)

なお入金は、
トレード画面の右上のメールアドレスが表示されているところクリック
⇒個人資産をクリック
⇒「入金」ボタン
と進めばOKです。

公式APIラッパーライブラリをインストール

さて、 APIキーを発行したら次はBybitの公式の Python ライブラリをインストールしましょう。
pipで入るので簡単です。
ターミナルに次のように入力してください。
pip3 install bybit
なおAPIのドキュメントは以下のリンクから参照できます。

https://bybit-exchange.github.io/docs/inverse/

bybit公式Pythonライブラリの使い方

仮想通貨 botを作る時に、特によく使いそうな機能を解説しておきます。

まずはライブラリをimportして、 APIラッパークラスのインスタンスを生成します。
インスタンス生成時に先ほど発行しておいた API キーを引数として渡せば、自分の口座情報を使って売買の注文などが出せるようになります。
下の例ではセキュリティー上 API キーはコードに直接書かずにinput()で実行時に入力する仕様にしてあります。
import bybit

#発行しておいたAPIキー
api_key=input("APIキーを入力")
api_secret=input("APIシークレットを入力")

client = bybit.bybit(test=True, api_key=api_key, api_secret=api_secret)
BTC(ドル建て)の最新価格を表示します。
print(client.Market.Market_symbolInfo().result()[0]["result"][0]["last_price"])
次にBybitで注文を出す方法です。
指値でロングポジションを取得(ドルでBTCを買った状態にする = BTC価格が上がれば利益、下がれば損失になる)してみましょう。
引数のqtyはドルの量を示します(仮想通貨の量ではないので注意)。
下の例では、1ビットコイン41000ドルで、100ドル分購入する注文を出していることになります。
print(client.Order.Order_new(side="Buy",symbol="BTCUSD",order_type="Limit",qty=100,price=41000,time_in_force="GoodTillCancel").result())
ショートする場合はside = “Sell”にします。
print(client.Order.Order_new(side="Sell",symbol="BTCUSD",order_type="Limit",qty=100,price=71000,time_in_force="GoodTillCancel").result())
成行き注文(値段を指定せず、市場価格ですぐに購入する注文)を出す例です。
(12ドル相当のBTCのロングポジションを取る場合)
成行き注文では値段を指定しないので引数priceは無くても良いです(あっても無視されるっぽい)。
print(client.Order.Order_new(side="Buy",symbol="BTCUSD",order_type="Market",qty=12,price=41000,time_in_force="GoodTillCancel").result())
#下と同じ
print(client.Order.Order_new(side="Buy",symbol="BTCUSD",order_type="Market",qty=12,time_in_force="GoodTillCancel").result())
成行き売りはside=”Sell”,order_type=”Market”とします。
print(client.Order.Order_new(side="Sell",symbol="BTCUSD",order_type="Market",qty=5,time_in_force="GoodTillCancel").result())
もし、ロングポジションを持っている状態で、ショートを行った場合は、ロングポジションが減ることになります。
つまり、上記2つの注文を順番に行うと、最終的に7ドル分のロングポジションを保有している状態になります。
bybitでは基本的にポジションの両建て(ロング・ショートを別々に同時に持つこと)ができないということです。

自分が持っているポジション情報を取得するには、こう書きます。
print(client.Positions.Positions_myPosition(symbol="BTCUSD").result()) 
ただしこれだと不要な情報までいろいろくっついてくるので、より的を絞ってみましょう。
例えば自分のBTCUSDのポジションがロングなのかショートなのか判別したい場合は、下のようにするとよいでしょう。
#ロングなら"Buy"ショートなら"Sell"が返ってくる
print(client.Positions.Positions_myPosition(symbol="BTCUSD").result()[0]["result"]["side"]) 
こっちはポジショサイズが何ドル分なのかを表示します(これまででいうqty)。
print(client.Positions.Positions_myPosition(symbol="BTCUSD").result()[0]["result"]["size"])
次はレバレッジ関係のコードです。
大前提として”クロス”モードだとレバレッジは100倍(最大レバレッジ)、分離モードなら自分で設定したレバになっています。
クロスモードは資産の残高全てが証拠金として使われる状態です。
逆に分離モードは資産の一部のみが証拠金として使われ、残りは取引で損が出ようが影響を受けないというモードです(その分、投資額は減ります)。
GUI(bybitのサイトのトレード画面から手動で)でもレバレッジが変更できます。

pythonでやる方法はこれから説明します。
レバレッジ情報を取得するコードです。
 print(client.Positions.Positions_myPosition(symbol="BTCUSD").result()[0]["result"]["leverage"]) 
レバレッジを変更(この例では14倍に変更)する方法です。
#レバレッジを変更すると自動的に分離モードになる
client.Positions.Positions_saveLeverage(symbol="BTCUSD", leverage="14").result()
次に取引履歴を取得してみます。
下は、口座の取引履歴に残っている一番初めに行なった取引です。
print(client.Execution.Execution_getTrades(symbol="BTCUSD").result()[0]["result"]["trade_list"][0])
これもまた色々と不要な情報がくっついています。
参考として一番最新の取引の取引価格を取得しましょう。
print(client.Execution.Execution_getTrades(symbol="BTCUSD").result()[0]["result"]["trade_list"][-1]["exec_price"])
こちらは自分の総資産を取得(単位はBTC)する方法です。
print(client.Positions.Positions_myPosition(symbol="BTCUSD").result()[0]["result"]["wallet_balance"])
ポジションの未実現損益を表示します。
print(client.Positions.Positions_myPosition(symbol="BTCUSD").result()[0]["result"]["unrealised_pnl"])
最後にアクティブな注文(まだ全部は約定していない注文)を全てキャンセルする方法です。
何かイレギュラーが起きた時の備えとして使うと良いでしょう。
client.Order.Order_cancelAll(symbol="BTCUSD").result()
以上、Python3 botを 作る時に取り分けよく使いそうな物の紹介でした。

ここからは、以上を使って実際に自動売買プログラムを作ってみましょう。

ゴールデンクロスに従って自動売買するPythonコード

今回サンプルで使うのは、移動平均線のクロスで自動取引するアルゴリズムです。
ゴールデンクロスでロングポジションを取り、デッドクロスでショートポジションを取る という行動を無限に繰り返します。
ゴールデンクロス
・短期の移動平均線が長期の移動平均線を下から突き抜けること。
短期的に相場が勢いづいているシグナル(=買いポイント)と言われる。
デッドクロス
・ゴールデンクロスの逆で短期の移動平均線が長期の移動平均線を上から突き抜けること。
相場が下げに向かっているシグナル(=売りポイント)と言われる。
今回作成したコードの動き
①まず、プログラム起動後しばらくは淡々と価格データを収集する。
②ある程度データが溜まったら、pandasのデータフレームに格納し、短期と長期2種類の移動平均線を計算する
③ゴールデンクロスやデッドクロスが生じていれば注文を出す
④永遠に②と③をループする
ということで結論としてコード本体を掲載しておきます。 (実運用で使うにはエラー処理などが必要になります)
import pandas as pd
import bybit
import time

#何秒ごとに価格を収集するか
interval = 5

#何ドル分取引するか
quantity = 100

#25個で計算した短期移動平均と75個で計算した長期移動平均のクロスを判定に使う
short_sma_duration = 25
long_sma_duration = 75

api_key=input("bybitのapiキーを入力してください")
api_secret=input("bybitのapi_secretキーを入力してください")


client = bybit.bybit(test=True, api_key=api_key, api_secret=api_secret)

#初めの100期間は何もせず価格収集する
def price_data_collecting(samples=100):
    prices = []
    for _ in range(samples):
        last_price = client.Market.Market_symbolInfo(symbol="BTCUSD").result()[0]["result"][0]["last_price"]
        prices.append(last_price)
        time.sleep(interval)
        return prices

print("今からしばらくの間(デフォルトで100*5=500秒間)、BTCUSDの価格データを収集します(しばらく何も表示されません)。")
BTCUSD_initial_data = price_data_collecting()

#週したデータをpandasの出たフレームに格納。
#今後の計算もデータフレームを使って行う

df = pd.DataFrame()
df["BTCUSD"] = BTCUSD_initial_data

while True:
    #最新価格を取得
    last_price = client.Market.Market_symbolInfo().result()[0]["result"][0]["last_price"]
    df=df.append({'BTCUSD': last_price,}, ignore_index=True)

    #移動平均を計算する
    df["short_sma"]=df["BTCUSD"].rolling(short_sma_duration).mean()
    df["long_sma"]=df["BTCUSD"].rolling(long_sma_duration).mean()

    #ゴールデンクロス(短期移動平均が長期移動平均を下からつきぬける)
    if df["short_sma"].iloc[-1]>df["long_sma"].iloc[-1] and df["short_sma"].iloc[-2]<df["long_sma"].iloc[-2]:
        print("ロングポジションを取ります。")
        print(client.Order.Order_new(side="Buy",symbol="BTCUSD",order_type="Market",qty=quantity,time_in_force="GoodTillCancel").result())

    #デッドクロス(ゴールデンクロスの逆)
    elif df["short_sma"].iloc[-1]<df["long_sma"].iloc[-1] and df["short_sma"].iloc[-2]>df["long_sma"].iloc[-2]:
        print("ショートポジションを取ります。")
        print(client.Order.Order_new(side="Sell",symbol="BTCUSD",order_type="Market",qty=quantity,time_in_force="GoodTillCancel").result())

    else:
        print("2つの移動平均線はクロスしていません。")

    #先頭行を削除してdfの長さを一定に保つ(長時間の運用時のメモリ対策)
    df=df.drop(df.index[0])

    time.sleep(interval)
ということで今回はbybitを使って Python bot を作る方法を解説してきました。
余剰資金を使って投機を楽しんでみたい人には、bybit自動売買は結構オススメです。
Pythonの勉強にもなりますしね。

Bybitは日本の取引所と違って、開設手続きが楽なので軽い気持ちで試してみるのもいいでしょう。
(デモ口座で自動売買を試すこともできます)

無料でbybitの口座を開設する

ビットコインのデルタニュートラル戦略のやり方!初心者向けにデメリットも解説

2021年4月5日
スポンサーリンク

SNSシェアお願いします!

コメントを残す

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

CAPTCHA