仮想通貨botterへの道。
2021年12月4日 仮想通貨暴落
上記翌日、これまで動いていなかったbotterをめざすべく動き出します。暴落した翌日に始めるのもどうかと思いますが、ひとつのきっかけとしてよいのかと。
いつも、寄り道して途中で挫折する(諦めてしまう)ので、事前におおまかな道を描いて、勧めたいとおもう。
基本的には、以下方針。
皆さん有料級の情報共有ばかり。ありがたくシッカリいただきます。
ちなみに使う口座はbybit。
1 まずは以下チュートリアルとされるリンクから流れを掴む。
- 価格データ引っ張ってくる。
- 機械学習で学習。
- バックテスト結果。
たくさんの指標突っ込んで、簡単にやっている(様に見える)チュートリアルなのにバックテストが恐ろしくきれいな結果。
何か裏があると見ています(失礼)が、まずはすすめることを大事に。
colabで実行するにあたっての追加コードは以下。
---
!pip install ccxt
!pip install crypto_data_fetcher
!pip install cached_property
!curl -L http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O && tar xzvf ta-lib-0.4.0-src.tar.gz
!cd ta-lib && ./configure --prefix=/usr && make && make install && cd -
!pip install ta-lib
!pip install "git+https://github.com/richmanbtc/crypto_data_fetcher.git@v0.0.15#egg=crypto_data_fetcher"
!pip install japanize-matplotlib
import japanize_matplotlib
sns.set(font="IPAGothic")
---
2 bybitのデモトレード環境(テストネット)に登録
2.1 登録
本口座も持っているけど、まずはテスト環境でと。
登録を完了!2021/12/11
参考サイトではサポートに連絡して入金してもらうみたいな手順があったけど
ログイン時からすでに約2.5btc所有していました。
2.2 bybitのAPIを取得
APIの取得をしようとすると、google認証が必要とのことで、アプリと連携。
スマホの標準カメラからQR読むとテキストしか出てこなくて少し戸惑い。(;´Д`)
APIキーのIPアクセスとか制限できるのね。
colab上でやろうとすると固定じゃ無理なんだろうか?
大金運用するならサーバ建てないとだねー。
取得完了!
3 bybitからデータ取得する。
王道ccxtを利用してからのpybotterへの流れを体験。
パブリックとプライベート(API要)は今後取引を考えているので、プライベートを中心に学ぶ。
3.1 ccxt
カナヲさんのページであったのでお試し。
Bybit入門API編 ※2021年6月25日更新|カナヲ定量分析|note
しかし、API_keyが違うと蹴られてる?
調べた感じだと、ccxtはbybitのtestnet環境は対応していないようで、本番環境で同じ様にAPIを取得すると、繋がりました。
前述の通り、とりあえずの接続確認だったし、本番環境でテストする勇気はないので、「はい、そうですか」と諦め。pybotterに移行しました。
3.2 pybotter
pybotterを使います。
1)インストール
”!pip install pybotters”
2) colabで使うために詰まった点を下記。
wikiに記載されている”低頻度bot”のサンプルをコピぺ。
ア ”asyncio.run() cannot be called from a running event loop”のエラー。
非同期とかも理解できていない状態でしたが、以下のようにioの待機時間にcpu回して早く実行しましょうということらしい。下図で赤色がcpu、紫がio待機?。
解決策は以下を ”import asyncio”の前に記述。
3)編集
1分も待てないので、以下を5秒に短縮
# 待機(60秒)
await asyncio.sleep(60)
(60)を(5)に変更。
加えて、実行された時に何かを表示したいので、以下を while文のどこかに貼り付け。
”print("resps :",resps)”
テストネットへの接続が必要なので、以下2つを編集。
・base_URL を~api-testnet~に変更。
・apiの接続先を”bybit_testnet”に変更
4)実行
実行すると、5秒毎に表示が出てくる。(はず)
5)内容の理解
表示された内容を理解して、自分がほしい他のパラメータで表示させてみる。
以下の記述で要求している様子。(赤文字部が自分で追加したところ)
ちなみにbybitの公式API説明はここ。Bybit API Docs
リンク先は queryKline 価格データの取得要領が掲載されている。
# メインループ
while True:resps = await asyncio.gather(client.get('/v2/public/kline/list', params={'symbol': 'BTCUSD', 'interval': 1, 'from': int(time.time()) - 3600}),client.get('/v2/private/order', params={'symbol': 'BTCUSD'}),client.get('/v2/private/position/list', params={'symbol': 'BTCUSD'}),client.get("/v2/private/wallet/balance",params={"coin": 'BTCUSD'}),)print(datetime.datetime.now())print("resps :",resps)print("<<kline>>",kline)print("<<order>>",order)print("<<position>>",position)print("<<balance>>",balance)
respsで要求する内容を記述して、返答されてきたものを真ん中あたりの「kline, order・・・」のところで各変数に代入。
赤文字が追加したところで、代入して取得した内容をprint文で記述。
ア kline
価格の時系列データのようで、1分毎のBTCUSDの価格情報(1時間前(3600秒)から取得)しているっぽい。
イ order
注文状況
ウ position
現在のポジション
オ balance
今回追加。現在の資産
<エラー中>
当初イ、ウ、エはprivate情報っぽくてエラーが返ってきていた。
'ret_msg': 'empty param of timestamp'
タイムスタンプのパラメータが空?
これはapiへ要求する際のBASE_URLを直してなかったことが原因でした。
<修正後>balanceが正しく取れてなさそう。本来なら60000の数字が返ってくるはず。。>>できました。現物ではなく、デリバティブ側に振替すれば確認できた。ポジションはインバース無期限での確認。どこかで指定ができそうだけども。とりあえずok。
<できたやつ>
<寄り道>
4 機械学習のモデルとbybitの注文をつなぐ。
さて、実際の注文につなげる必要があるが、構想
モデルから抽出条件に合致するタイミングで発注処理。
4.1 注文
5 テスト運用