機械学習ボットにおける問題設定について
こんにちは、yseekerと申します。
機械学習でなんとかなる実問題は基本的にモデルを構築する前の段階、つまり適切な問題設定と十分な量の前処理されたデータで99%の勝負が決まっているという過激派の思想に染まっている今日このごろです。
(※もちろん、ニッチな問題によってはそれに応じた適切なモデルを選ぶことやハイパラ調整で精度を極限まであげることが重要な場合もあるかと思います。)
最近「施策デザインのための機械学習入門」を読んで、いくつかの点に関して機械学習(ML)ボットを考える上でも非常に重要だなと思ったので、これらの本で学んだ一部をどのようにボットに応用できるかについて少し書いてみたいと思います。
MLボットを長くやられている方にはおそらく目新しい話はないのでここでそっ閉じしてもらえればと思います。
「施策デザインのための機械学習入門」では、イントロで、Eコマースプラットフォームでの売上最大化するためのクーポン配布戦略を機械学習で解く際に、意思決定の問題を予測(回帰)の問題として解いてしまう、といったNG例が紹介されています。詳しくは本を読んでみて下さい。
本記事では、MLボットでリターンの値の予測精度がなかなか上がらない、Optunaを回してパイパラ調整してもRMSEがうまく改善できない、そもそもチュートリアルの次に何をしたらよいか分からないという方がいらっしゃればそういう方向けに、「本当に予測したいのはリターンの値なのか、本当に最小にすべきロスはRMSEなのか」という点について再考する1つのきっかけになる考え方を紹介できればと思います。(※ 再考した結果リターンが改善するとは限りません。)
さて本題ですが、この記事では題材として、有名なrichmanbtcさんの機械学習ボットのチュートリアルを取り上げてみたいと思います。
richmanbtcさんチュートリアルモデル
MLボッターのバイブルとも言えるチュートリアルモデルですが、下記のような要素に分解できます。
取引所・対象ペア・時間足
GMOコイン・BTC/JPY・15分足
問題設定
ベースの執行方針
毎回終値から0.5*ATRの距離で指値エントリー、約定した場合はその次の足以降で終値から0.5*ATRの距離で指値エグジットすることで利益を積み上げていく
機械学習の役割
チュートリアルのベースとなる仮説
機械学習を指値エントリーのフィルタリングに使えばエントリーの確度が上昇し、リターンを最大化できるのではないか
MLフィルタリング:毎回の執行のリターン(連続値)を回帰モデルで学習して予測値が正の場合のみエントリー
ソリューション
目的変数
毎回終値から0.5*ATRの距離で指値エントリー注文、約定した場合はその次の足以降で終値から0.5*ATRの距離で指値エグジットをし、その際のリターンの値(連続値)
機械学習モデル
目的変数が連続値なので回帰問題を解くモデル
LGBMRegressor(n_jobs=-1, random_state=1)
機械学習込みの執行
モデルの予測リターンの値が正の場合のみに指値エントリー注文
エグジットではモデルの予測結果は使わず、次の時間足以降で自動的に指値エグジット注文をする
問題設定の再考
チュートリアルは仮想通貨自動売買のML部分を作る流れを一通り理解するという点では、とても良い素材ですが、機械学習を前提とした問題設定を考える上で1点気になる所があります。
それは、
「指値エントリーをするかしないかの意思決定を予測したいのに、機械学習部分で回帰の問題を解いている」
という点です。
これは上で紹介した「施策デザインのための機械学習入門」の冒頭で出てくるNG例と同じ状況です。つまり、本来ここで機械学習が学習すべきは、回帰問題というよりはむしろ、エントリーするかしないかの2値問題なのではないかと個人的には考えています。
そして2値分類を使う上では、もう1点大事な所があるような気がしていて、それは単純にリターンの正負で2値に分けると、+0.000001%のリターンと+0.01%のリターンは、リターンが正の同じクラスとみなしてよいのかという点です。
このあたりに関しては現在も試行錯誤中ですが、その途中経過としてとりあえず本家チュートリアルと同じ設定(0.5*ATRなど)で回帰問題として解いた場合と分類問題として解いた場合のバックテストの結果を貼ってみます。(※特徴量だけはチュートリアルから変えていますが、回帰と分類で統一しています。)
回帰問題で解くと、2021年11月以降はリターンが減り続けますが、分類問題として解くと2021年11月以降もヨコヨコか微増くらいの成績になります。特徴量の選び方やその他パラメーターで多少結果は変わると思います。
他にもATRの係数やhorizon、あるいはATRではなく別の指標を指値に使うなどによっても結果は変わりますし、KPIとしてトータルリターンではなく、Sharpe ratioなどを考えて問題設定するのも有りかもしれないです。
こんなにいろいろ書きましたが、ボットの場合は問題設定の前にそもそも取引所選びや執行方針などのほうがもっと重要だと思います。
最後に
今回の記事はボットの話でしたが、MLを実問題に応用する上で、本当に解きたい問題は何か、何を解決するとインパクトが最大になるのか、なぜそうなるのか、どのような問題に落とし込むか、それらの問題を解決するためにMLをどう活用すればよいのか、という視点がボットに限らず実問題にMLを応用する上でとても重要だなと思います。
MLボットに関して議論してくださる方、ポロリしてくださる方は随時募集中です。
では良いBotter Lifeを!