見出し画像

richmanbtcさんのチュートリアルの収益機会と改善方法について

こんにちは。バジル(@kkngo_crypto)です。

今回は、richmanbtcさんのチュートリアルをもとにしたbotについて、私がどういうアプローチで改善して勝てるようになってきたのかという記事になります。

直近一年くらいで参入したbotterはほぼ全員「日給300万円のSS級トレーダーが明かすbotterのリアル」を読んでチュートリアルを始めて機械学習botを運用していますよね。

私もbotter歴は二年ほどなのですが、去年書籍を読んでチュートリアルを始めてからは、機械学習メインに鞍替えしています。

チュートリアルの影響は非常に大きく、技術的な解説記事も既にたくさん存在します。そのため、この記事ではチュートリアルの解説はしていません。チュートリアルの内容は前提として、私の改善のアプローチをまとめたものであることをご理解ください。

チュートリアルを実運用してみたけど全然勝てないな~~くらいの方には、もしかすると参考になる点もあるかもしれません。

それでは行ってみましょう!

チュートリアルの収益機会は何なのか

改善のアプローチの前に、いきなりですがrichmanbtcさんのチュートリアルにおいて最大の収益機会は何でしょうか?

機械学習

・・・・・・ではありません。

2018/10~2021/04のGMOコインでビットコインの15分足に対して毎回ATR×0.5の位置に指値を置くことです。

チュートリアルで最初に出てくる累積リターンのグラフが下記なのですが、

https://github.com/richmanbtc/mlbot_tutorial/blob/master/work/tutorial.ipynb より

毎回ATR×0.5の位置に指値を置くだけで2年半で1700%くらい勝っています。この時点では機械学習は全く使っていません。

その後、この期間を対象に機械学習モデルを作成し、同じ期間に対して機械学習を適用してエントリーの判断をした累積リターンとして、下記のグラフがプロットされています。

https://github.com/richmanbtc/mlbot_tutorial/blob/master/work/tutorial.ipynb より

こちらのグラフだけ「買い+売り」があるのでわかりにくいですが、収益はほとんど変わっていません。

毎時刻エントリーに比べるとトレード回数が減っているはずなので、トレードごとの収益は改善していますし、保持するポジションも小さく済んでいると思います。実運用するにあたって効率的にはなっていますが、収益の合計値としては機械学習の適用前後でほとんど違いがありません。

あくまで2018/10~2021/04のGMOコインでビットコインの15分足に対して毎回ATR×0.5の位置に指値を置くことという聖杯が収益を生み出していて、それをもとにして機械学習の使い方を教えてくれている、というのがチュートリアルの内容です。

そして、2023年現在チュートリアルと同じ方法でbotを実運用しても勝つことはできません。毎回ATR×0.5の位置に指値を置くだけで勝てるわけがないというのは、今クリプトを触っている人なら感覚でわかると思います。実運用してみた人は経験則としても知っているのではないでしょうか。

念のため言っておきますが、richmanさんの本や記事が不誠実だとかそういうことを言いたいのではありません。

「日給300万円のSS級トレーダーが明かすbotterのリアル」は本当に素晴らしい本で、機械学習botやってみよう!!!と思わせる魅力があります。

チュートリアルも本当に素晴らしい記事で、機械学習の知識が皆無の人間が機械学習botを作成するための足掛かりとなる内容です。景気のいいグラフがモチベーションを与えてもくれます。

ただ事実として、チュートリアルままのbotを実運用しても勝てません、ということです。

機械学習によって収益を生み出すには、各自ががんばる必要があります。

mmbotにおけるmagitoさんの記事みたいなものと言えばわかりやすい方もいるかもしれません(Python3 MarketMaker(MM)BOTのサンプルロジックとソースコード)。

richman型botの改善アプローチ

と、偉そうなことを書いている私も最初はチュートリアルのままのbotを実運用していて、全然勝てませんでした。

勝てはしなかったのですが、チュートリアルのおかげで

  • ローソク足から機械学習モデルの作成

  • 機械学習モデルを使ったテスト

が簡単にできるようになったので、あとはルールベースのbotとやることは一緒ですよね。日々テストを繰り返しながらbotを改善するだけです。

そして実運用開始から半年以上のマイナス期間を経て、ここ数か月はギリギリB級程度の収益ですがやっと勝てるようになってきました(嬉しい。。。)。

以下に私の今までに取ったアプローチを紹介します。効果のあったものもあればなかったものもあります。順不同です。

1. 特徴量を変更する

チュートリアルのソースコードでは、TA-Libを使ってローソク足から作成されたテクニカル指標が特徴量として利用されています。

まずはテクニカル指標を調整するところから始めて、下記のようにチュートリアルに記載されている改良ポイントも参考にします。

https://github.com/richmanbtc/mlbot_tutorial/blob/master/work/tutorial.ipynb より

機械学習と言えば特徴量というイメージもあり、一番初めに取り掛かりがちなポイントですが、一番深い沼でもあります。時刻や株価や天候などあらゆる情報を特徴量に利用可能ですし、改善に終わりがありません。

ついつい時間をかけてしまいがちなので、行き詰った場合は特徴量以外のアプローチもとってみることをオススメします。

2. データを変更する

チュートリアルでは2018/10~2021/04のGMOコインのBTCの15分足が利用されています。

これを下記のような観点で変更します。

  • ローソク足を変更する

    • 15分足以外の時間足

    • ティックバー、ドルバー、ボリュームバーなど(約定履歴から自作)

  • 取引所を変更する

  • ペアを変更する

  • データ取得期間を変更する

3. 指値位置を変更する

チュートリアルでは

df['ATR'] = talib.ATR(high, low, close, timeperiod=14)

として算出したATRを使って、終値からATR*0.5の位置に指値を置いています。

これを下記のような観点で変更します。

  • ATRを改善する

    • timeperiod=14以外で算出したATRを利用する

    • 指値位置計算時にATRにかける係数を0.5以外にする

  • ATR以外を使う

    • ボリンジャーバンドで指値位置を算出する

    • 終値のn%上下に指値を置く

    • 直近高値のn%下と直近安値のn%上に指値を置く

    • 板の厚い価格の直前に指値を置く

    • その他なんでも各自ご自慢の指値位置を利用する

4. 単純な指値を止める

チュートリアルのバックテスト関数では最大ポジション=1ロットという制約で、ポジションがない場合だけエントリーするようになっています。

これを下記のような観点で変更します。

5. y_pred>0 というエントリー条件を変更する

チュートリアルではy_pred(エントリーした場合の収益予測値)>0という条件でエントリーしています。

これを下記のような観点で変更します。

  • 閾値を変更する

    • y_pred>0.001など

  • ルールベースのエントリー条件と組み合わせる

    • y_pred>0 かつ RSI>50 の場合エントリー

    • y_pred>0 かつ ボラが大きい場合のみエントリー

    • y_pred>0 かつ m時~n時の場合のみエントリー

  • y_predに対していろいろなルールを適用する

    • y_predがボリンジャーバンド(2σ)を超えたらエントリー

    • y_predが直近n本の足で最大だったらエントリー

    • 直近n本連続でy_pred>0だったらエントリー

6. モデルの作成方法の変更

チュートリアルでは

# モデル (コメントアウトで他モデルも試してみてください)
# model = RidgeCV(alphas=np.logspace(-7, 7, num=20))
model = lgb.LGBMRegressor(n_jobs=-1, random_state=1)

# アンサンブル (コメントアウトを外して性能を比較してみてください)
# model = BaggingRegressor(model, random_state=1, n_jobs=1)

として LightGBM の LGBMRegressor を使っています。パラメータはほぼデフォルト値です。

これを下記のような観点で変更します。

  • LGBMRegressorのパラメータを変更する

    • 「lightgbm パラメータ」などで検索してみましょう。結構深い沼です。参考リンクもたくさん挙げられますが今回は割愛します。

  • 他のモデルを使う

    • コメントアウトを外せばRidgeCVになります

  • アンサンブル学習をする

    • コメントアウトを外せばBaggingRegressorを利用可能です

      • バギング以外にもブースティングやスタッキングといったアプローチもある

    • 複数モデルを組み合わせたメタモデルを作るイメージです

7. 合議制にする

今までに挙げたアプローチを駆使して複数のモデルを用意して、下記のように組み合わせてエントリーを判断します。

  • 過半数のモデルがy_pred>0の場合にエントリーする

  • y_predの平均>0だったらエントリーする

合議制にするのもアンサンブル学習の一種ですが、最終的に一つのモデルを作るのではなく、複数モデルのまま、多数決などのルールで判断するアプローチです。

ルールベースのロジックと機械学習の合議制にすることも可能です。

その他のアプローチ

ある程度機械学習のスキルがついてきたら、下記のようなアプローチを試してみるのもありです。richman型の枠から飛び出してみましょう。

  • 収益を予測するのではなく価格など別のものを予測する

  • ローソク足ではなく板や約定履歴を使う

  • 深層学習をする

参考文献

書籍

Webサイト

その他

この記事を書くにあたっての直接の参考にはしていませんが、日々Web上の記事(無料)やtwitterなどから情報を得ています。KaggleやNumeraiには参加していません。


この記事が気に入ったらサポートをしてみませんか?