かーぶ(仮)

主に日本株やってます。長期ではなく短期取引メインです。TradeStation等株取引ツールも紹介します。

仮想通貨botterへの道。

f:id:kabuist:20211205204125p:plain

2021年12月4日 仮想通貨暴落

上記翌日、これまで動いていなかったbotterをめざすべく動き出します。暴落した翌日に始めるのもどうかと思いますが、ひとつのきっかけとしてよいのかと。

いつも、寄り道して途中で挫折する(諦めてしまう)ので、事前におおまかな道を描いて、勧めたいとおもう。

 

基本的には、以下方針。

  • 使う言語はpython(これしかしらん)
  • 機械学習は基本的にgoogle colabを使用。(myPCはスペック劣る)
  • 精度よりも継続・スピード!

皆さん有料級の情報共有ばかり。ありがたくシッカリいただきます。

ちなみに使う口座はbybit。

【有名所】Bybit (バイビット) |暗号資産取引所

 

 

1 まずは以下チュートリアルとされるリンクから流れを掴む。

qiita.com

  • 価格データ引っ張ってくる。
  • 機械学習で学習。
  • バックテスト結果。

 たくさんの指標突っ込んで、簡単にやっている(様に見える)チュートリアルなのにバックテストが恐ろしくきれいな結果。

 何か裏があると見ています(失礼)が、まずはすすめることを大事に。

 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

crypto-worldwide.xyz

参考サイトではサポートに連絡して入金してもらうみたいな手順があったけど

ログイン時からすでに約2.5btc所有していました。

f:id:kabuist:20211211124556p:plain

 

 

2.2 bybitのAPIを取得

f:id:kabuist:20211211122514p:plain

 APIの取得をしようとすると、google認証が必要とのことで、アプリと連携。

 スマホの標準カメラからQR読むとテキストしか出てこなくて少し戸惑い。(;´Д`)

 google認証のアプリでQRコードを読む必要があるのね。

 

 

f:id:kabuist:20211211123216p:plain

APIキーのIPアクセスとか制限できるのね。

colab上でやろうとすると固定じゃ無理なんだろうか?

大金運用するならサーバ建てないとだねー。

 

取得完了!

f:id:kabuist:20211211123537p:plain

 

3 bybitからデータ取得する。

 王道ccxtを利用してからのpybotterへの流れを体験。

 パブリックとプライベート(API要)は今後取引を考えているので、プライベートを中心に学ぶ。

3.1 ccxt

 カナヲさんのページであったのでお試し。

Bybit入門API編 ※2021年6月25日更新|カナヲ定量分析|note

 

 しかし、API_keyが違うと蹴られてる?

f:id:kabuist:20211211130250p:plain

 

 調べた感じだと、ccxtはbybitのtestnet環境は対応していないようで、本番環境で同じ様にAPIを取得すると、繋がりました。

前述の通り、とりあえずの接続確認だったし、本番環境でテストする勇気はないので、「はい、そうですか」と諦め。pybotterに移行しました。

3.2 pybotter

pybotterを使います。

note.com

 

1)インストール

”!pip install pybotters”

2) colabで使うために詰まった点を下記。

wikiに記載されている”低頻度bot”のサンプルをコピぺ。

github.com

ア ”asyncio.run() cannot be called from a running event loop”のエラー。

非同期とかも理解できていない状態でしたが、以下のようにioの待機時間にcpu回して早く実行しましょうということらしい。下図で赤色がcpu、紫がio待機?。

f:id:kabuist:20211212160451p:plain

解決策は以下を ”import asyncio”の前に記述。

import nest_asyncio
nest_asyncio.apply()

 

3)編集

 1分も待てないので、以下を5秒に短縮

            # 待機(60秒) 
            await asyncio.sleep(60)

 (60)を(5)に変更。

   加えて、実行された時に何かを表示したいので、以下を while文のどこかに貼り付け。

  ”print("resps :",resps)”

 テストネットへの接続が必要なので、以下2つを編集。

・base_URL を~api-testnet~に変更。

f:id:kabuist:20211212234221p:plain

apiの接続先を”bybit_testnet”に変更

f:id:kabuist:20211212234322p:plain

 

4)実行

 実行すると、5秒毎に表示が出てくる。(はず)

f:id:kabuist:20211212163427p:plain

 

 

5)内容の理解

 表示された内容を理解して、自分がほしい他のパラメータで表示させてみる。

  以下の記述で要求している様子。(赤文字部が自分で追加したところ)

 ちなみにbybitの公式API説明はここ。Bybit API Docs

 リンク先は queryKline 価格データの取得要領が掲載されている。

         # メインループ

        while True:
            # REST APIデータ並列リクエス
            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'}),
            )
            kline, order, position,balance = await asyncio.gather(*[r.json() for r in resps])
                        
            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秒)から取得)しているっぽい。

f:id:kabuist:20211212232549p:plain

イ order

 注文状況

ウ position

 現在のポジション

オ balance

 今回追加。現在の資産

 

<エラー中>

 当初イ、ウ、エはprivate情報っぽくてエラーが返ってきていた。

'ret_msg': 'empty param of timestamp'

タイムスタンプのパラメータが空?

 これはapiへ要求する際のBASE_URLを直してなかったことが原因でした。

f:id:kabuist:20211212232706p:plain

<修正後>balanceが正しく取れてなさそう。本来なら60000の数字が返ってくるはず。。>>できました。現物ではなく、デリバティブ側に振替すれば確認できた。ポジションはインバース無期限での確認。どこかで指定ができそうだけども。とりあえずok。

f:id:kabuist:20211212234000p:plain

<できたやつ>

f:id:kabuist:20211215000125p:plain

 

<寄り道>

kabuist.hatenablog.com

 

4 機械学習のモデルとbybitの注文をつなぐ。

さて、実際の注文につなげる必要があるが、構想

モデルから抽出条件に合致するタイミングで発注処理。

4.1 注文

 

 

5 テスト運用

 

 

/*コード内行数*/ /*コード内全選択*/