PythonとAWSを使って仮想通貨自動トレード その2 ドルコスト平均法で購入する

AWS

以前の記事で、PythonとAWSで仮想通貨を自動トレードするシステムの構築方法を紹介しました。

そのときは、4時間に一回、0.0001ビットコインを購入するスクリプトだったのですが、これだと高くても安くても常に0.0001ビットコインを購入することになってしまします。価格が高い時は少しだけ、安い時はたくさん買いたいというのは直感的にもわかることだと思うのですが、これは一般にドルコスト平均法と呼ばれます(株とか投資信託とかに使われる用語なので、仮想通貨にも用語としてあっているかは分からないですが。。)。板の情報を用いてドルコスト平均法を実装します。またbitbankではテイカーよりもメイカーの方が手数料が安く済むことが多いため、メイカーで購入できるようにスクリプトを作成してみましょう。

ドルコスト平均法とは

定額購入法とも呼ばれ、決まった頻度で定額(例えば10000円)で変える量の株などを買う方法です。

タイミング定量購入(1株)定額購入(5000円)
1回目の購入・・・1株1000円1株(1000円)5株(5000円)
2回目の購入・・・1株9000円1株(9000円)0.56株(5000円)
結果・・・1株5000円2株:10000円5.56株:27800円

ご覧の通り、定額購入=ドルコスト平均法の方が、儲かっていることがわかると思います。とくに9000円のタイミングで購入することで、高値掴みしてしまっています。ずっと上がり続けたり、下がりつづける場合は定量の方が儲かる(損が小さい)のですが、株式も仮想通貨も上下しながら遷移していくので、ドルコスト平均法の方が有用な気がします。特にインデックス投資ではよく使われますね。

bitbankのメイカーとテイカー

bitbankの取引所で売買を実施する場合、メイカーとテイカーという概念が出てきます。メイカーは板を作る人という意味で、テイカーはその板を取る人(板に並んでいるものを購入する)という意味になります。bitbankの取引所では、成行注文と指値注文ができますが、成行注文は板に並んでいるものを売買するため、確実にテイカー注文になります。一方、指値注文の場合、板に並べることが可能なため、メイカー注文にすることができます。

bitbankではメイカーとテイカーで手数料が異なります。なんなら、メイカーの場合マイナス手数料(すなわち約定するとお金がもらえる)の場合があるので、常からメイカー注文した方が特できる可能性が高いのですが、指値注文する場合いちいち入力するのがめんどくさく、かつそのまま逃げてしまうこともあります(現在50円で取引されていて、49円で買い注文を入れたのにそこまで下がらずにそのまま100円になってしまうというケースですね)。

今回は現在の売買情報を用いて、ギリギリの額でメイカー注文するスクリプトを作成します。

ドルコスト平均法とメイカー注文の実装

AWSのLambda上で実現するのは非常に簡単です。以前のPythonのコードを少しだけの変更で実現できます。ドキュメントはこちら。

GitHub - bitbankinc/python-bitbankcc: Public & Private API をパイソンで扱うライブラリ
Public & Private API をパイソンで扱うライブラリ. Contribute to bitbankinc/python-bitbankcc development by creating an account on GitHub.
GitHub - bitbankinc/bitbank-api-docs: Official Documentation for the bitbank.cc APIs and Streams
Official Documentation for the bitbank.cc APIs and Streams - bitbankinc/bitbank-api-docs

まずは、もともとのコードを記載します。

def lambda_handler(event, context):

    # インスタンスの作成
    prv = python_bitbankcc.private(api_key, api_secret) 

    # 購入の実施
    order_result = prv.order( 
    pair = 'btc_jpy', # ペア
    amount = '0.0001', # 注文枚数
    side = 'buy', # 注文サイド
    type = 'market' # 注文タイプ
    )
    
    return json.dumps(order_result)

amountが0.0001で固定になっているので、ここを「積み立てる金額 / 購入価格」にする必要があります。購入価格は板の情報を利用して決めます。板の情報もpython_bitbankccモジュールで取得できます。

BUY_YEN = 10000 # 買い付ける日本円の価格ここでは10000円とした。
PAIR = 'btc_jpy'

if __name__ == '__main__':
    pub = python_bitbankcc.public()
    prv = python_bitbankcc.private(API_KEY, API_SECRET)

    value = pub.get_depth(
    pair = PAIR # ペア
    )
 
    price = float(value["bids"][0][0])*0.9999 #買い板の最高価格から少しだけ安くする。
    amount = BUY_YEN / price

    # 指値注文する
    order_result = prv.order( 
        pair = PAIR, # ペア
        price = str(price), # 価格
        amount = str(amount), # 注文枚数
        side = 'buy', # 注文サイド
        order_type = 'limit' # 注文タイプ
    )

    return json.dumps(order_result)

BUY_YENは毎回積み立てる額を指定します。ここでは10000円を指定しました。また、取引するペアをPAIRという変数に格納しています、修正し損ねてしまって間違った注文する可能性があったので、こうしました。

大きく変わったのは、pubというクラス、そのメゾットのget_depthですね。pubはパブリックのクラスオブジェクトです。pubでは板の情報や最新の取引価格など、公にできる情報を取得できるクラスです。そのため、APIキーなどは必要ないです。

ここでは、get_depthというメゾットで板の情報を取得します。板の情報は下記の形で返却されるため、その中から買い板の最高価格はvalue[“bids”][0][0]になります。

{'asks': [['6391090', '0.0001'], ['6392571', '0.4008'], ['6392740', '0.2100'], ['6393354', '0.0300'],・・・], 'bids': [['6388153', '0.0300'], ['6388152', '0.6000'], ['6388150', '0.0196'], ['6387970', '0.1000'], ・・・], 'timestamp': 1616174746801, 'sequenceId': '2242633745'}

あとは、念の為、この価格より少し安い額で注文を実施します。購入する枚数は「積み立てる額/注文金額」で計算しましょう。

まとめ

今回は、ドルコスト平均法で定期的に購入するシステムを開発しました。加えて、bitbankでメイカー注文をするようにスクリプトを作成しました。

コメント

タイトルとURLをコピーしました