技術(tech)

積立用に毎日仮想通貨を自動で購入する【Binance API】

この記事では、Binance APIを使って毎日定額で仮想通貨を購入する という手続きを自動化する方法を紹介します。

背景

 

どこかのタイミングから、ちょっとずつビットコインを買おうかな〜とか、頭をよぎりました。

仮想通貨を積み立てたい となった際に、毎日手動で取引画面から購入するのは面倒ですよね。

定期的に購入してくれる仕組みがあったらいいのにな… と思い、作りました。

Binanceの自動投資の設定をしたほうが楽です。
この記事は、APIを使って取引してみたい人向けの記事です。
https://www.binance.com/ja/auto-invest/

 

想定する読者

 

  • 定期的に仮想通貨を積み立てたい人
  • ○○BUSD分のBTCを毎日購入する みたいな仕組みを実現したい人
  • 指値ではなく、成り行き注文で買いたい人

 

前提

 

  • AWSアカウントを保有していること
    ※本仕組みはAWS上のlambdaに構築する前提
    lambda上に組まないで、自分のPC上でcronを設定するでもイケると思います
  • Binanceの口座を持っていること

なお、本記事を参考に設定して、不正アクセスを受けた、口座のトークンが抜かれた等の被害があっても責任は負えないです。

セキュリティ面については、十二分に配慮してください。

 

設定手順

 

大きな流れとしては、以下の通りです。

  • BinanceのAPIキーを発行する
  • スクリプトを作成する
  • lambdaの設定をする
  • 毎日スクリプトが動くように、イベントの設定をする

それぞれ1つずつ解説していきます。

 

BinanceのAPIキーを発行する

 

プログラムから取引の指示が出せるように、Binanceのアカウントに紐づくAPIキーを発行します。
※ このキーとともに、パスワードが発行されます。これらの情報は第三者に知られてしまうと、第三者が取引の指示等が出せるようになってしまいます。絶対に知られないようにしてください。

詳細の手順は公式ドキュメントを参考にどうぞ。

さらっと記載すると、

  1. Binanceにログインし、トップ画面を表示します
  2. 画面右上のユーザーセンターアイコンから [API管理] をクリックします。
  3. APIキーのラベル/名前を入力し、[APIを作成] をクリックします。
    名前はなんでもいいです。
  4. 登録した2段階認証デバイスでセキュリティ認証を完了させます。
  5. これでAPIが作成されます。APIキーとシークレットキーは後で使うので忘れないようにしておきます。シークレットキーは二度と表示されませんので、大切に保管してください。シークレットキーを忘れてしまった場合は、APIを削除して新たに作成する必要があります。

APIを作成したら、権限を編集します。

以下にチェックをつけておきます。

  • 読み込みを有効にする
  • 現物取引及びマージン取引を有効にします

 

 

 

 

 

IPアドレス制限は安全面を考慮するとかけたほうがいいです。
本記事では、lambdaを実行する際にIPアドレスを固定する設定は省いているため、無制限にしています。

心配な人は、lambdaのIPアドレスを固定する方法を調べた上で、信頼されたIPからのアクセスのみ制限する。にチェックを入れましょう。または、lambdaを使わず、自宅のIPアドレスを調べた上で、PCからのみスクリプトを実行するようにしましょう。

 

スクリプトを作成する

今回は、BUSDを使ってBTCを積み立てる前提で記載しています。
別のペアで取引したい場合は、ASSETやSYMBOLを変更してください。

積み立てたい額から逆算して、どの程度の量のBTCを購入できるのか算出しています。

指値ではなく、成り行き注文を出しています。

import os
from binance import Client, ThreadedWebsocketManager, ThreadedDepthCacheManager

# ref: https://github.com/sammchardy/python-binance
# 大事な情報を平で入れておくわけにはいかないので、環境変数として読み込ませます
client = Client(os.environ['API_KEY'], os.environ['API_SECRET'])

# BUSDを使ってBTCを積み立てる前提で記載しています
# 別の通貨を購入する場合は、ASSETとSYMBOLを変更してください
ASSET = 'BUSD'
SYMBOL = 'BTCBUSD'
AMOUNT_BUSD = float(10.5) # 積み立てたい額。単位は$

def lambda_handler(event, context):
  print('--- Start Buy BTC ...')

  # 余力取得
  basis = client.get_asset_balance(asset=ASSET)
  basis_free = float(basis['free'])
  print('--- Your free cash is %f BUSD.' % (basis_free))

  if basis_free < AMOUNT_BUSD:
    print('--- Account has insufficient balance for requested action.')
    return

  # BTC現在値取得
  ticker = client.get_ticker(symbol=SYMBOL)
  last_price = float(ticker['lastPrice'])
  print('--- 1 BTC Price is %f BUSD.' % (last_price))

  # 購入数量の計算
  quantity_btc = round((AMOUNT_BUSD / last_price), 5) # 購入できるBTCの数量
  print('--- Buying %f BTC...' % (quantity_btc))

  # 成り行き買
  order = client.order_market_buy(
      symbol=SYMBOL,
      quantity=quantity_btc)

  print('--- Buy %f BTC.' % (order['qty']))

  print('---')
  print(order)
  print('---')

  print('--- Finished Buy BTC')

 

buybtc.pyとか適当な名前をつけて保存しておきます。

取引によって、最低注文額があるのでご注意ください。
BUSDとBTCの取引は、10BUSD以上からの受付となってます。
AMOUNT_BUSDの部分をうまく調整してください。ギリギリだと購入するBTCの量が10BUSDを下回って、注文が通らなくなる可能性もあります。

API_KEYとSECRET_KEYが正しく設定してスクリプトを動かしてしまうと、意図せず注文が通ってしまうので、気をつけてください。

 

lambdaの設定をする

 

AWSのコンソールからぽちぽち設定していきます。

lambdaの作成

AWSのlambdaのコンソールを開いて、「create function」を選択します。

「Function name」は何でもいいので、分かりやすい名前をつけておきます。
入力が終わったら、「create function」ボタンを押します。
ランタイムはPython3.9に設定します。

さっき作成したスクリプトを貼り付けます。

これだけだと動かないので、あと二手間加えます。

環境変数から読み込ませる

ソースコードに鍵情報がベタ書きされるのは嫌なので、環境変数から読み込ませます。

Configuration > Environment variablesを選択します。

Editボタンを押して、Binanceの画面から発行したAPI_KEYとAPI_SECRETを貼り付けます。

layerの設定を行う

スクリプトの中では、「python-binance」という外部モジュールを使用しています。

lambdaでなければ、pip install等で入れられますが、lambdaの場合は別途入れてあげる必要があります。

外部モジュールをzipで固めたものを、lambdaのlayerにアップロードして、今回作成したlambda関数で読み込ませるようにします。

zipファイルの作成手順はこちらの記事の解決策の項が参考になります。

AWS Lambda python: Unable to import module 'lambda_function': No moduleの対処AWS LambdaでPython処理を実行し、外部モジュールをLambda Layerで読み込もうとした際、「AWS Lambda python: Unable to import module 'lambda_function': No module named 'regex._regex'」が発生。mac OSとLambda環境の差異が原因。Linux OSのDockerコンテナ内でモジュールをインストールし、Layerに登録する方法で解決。記事に詳細な手順と参考情報を提供し、同じ問題を抱える人々への助けとなる情報を共有。...

 

zipファイルを作成したら、layerに登録して読み込ませます。

画面左側からlayerを選択し、「Create Layer」ボタンを押します。

適当なlayer名をつけます。
先程の作成したzipファイルをアップロードします。

ランタイムの指定時には、Python3.9にチェックをつけておいてください。

先程のlambda関数作成画面に戻り、画面下部の「Add Layer」を選択します。

Custom Layersを選び、先程作成したLayer名を設定します。
バージョンは一番新しいものを選択するで大丈夫です。
入力した「add」ボタンを選択します。

これでlambdaの設定は完了です。

動作確認をしたい場合は、以下の部分をコメントアウトしておきます。

  #order = client.order_market_buy(
  #    symbol=SYMBOL,
  #    quantity=quantity_btc)

 

その後、「Test」ボタンを押すと、スクリプトが動かせます。
(テスト名を入力しろって言われたら、適当に入れておきましょう)

「Deploy」ボタンを押してDeployしておきましょう。

 

毎日スクリプトが動くように、イベントの設定をする

 

これまでの設定でスクリプトがlambdaで動くようになりました。

あとは、定期的にlambdaのスクリプトが実行されるように設定します。

AWSのEvent Bridgeを使います。

「Add trigger」を選択します。

Event Bridgeを選択し、「create new rule」を選びます。
Schedule expression」にチェックを入れ、「rate(1 day)」にすると毎日lambdaが実行されるようになります。

rate(2 days)にすると、2日おきにlambdaを実行することも可能です。
※ 1以上の場合には複数形になるのでご注意ください。

参考:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-cloudwatchevents-expressions.html

「Add」ボタンを押して設定完了です。

 

あとは、設定項目を自分好みにカスタマイズして使ってください。

 

おわりに

 

今回は、BUSDでBTCを定額で定期購入する手順を紹介しました。

作ってみたものの、いつから運用開始しようか… 悩みどころです。

何度もお伝えしますが、自己責任で設定をお願いします。セキュリティを厳しくしたい場合は、IPを固定して絞ったり、環境変数をAWS Secret Managerから読み込ませる形式にしたり等、やりようがあるので、各々設定してみてください。
あと、仮想通貨の売買も自己責任でお願いいたします。

lambdaとSecret Mangerの連携はこちらの記事が参考になると思います。

ここまでみていただき、ありがとうございました。