見出し画像

勉強メモ#4 (損益予測モデルの正解率を計算)

前回note「勉強メモ#3」の結論どおり、今回は、richmanさんチュートリアルの損益予測モデルの正解率について調べたことまとめ。

今の損益予測モデルの正解率

ここでいう正解率は、「損益がプラスになると予測して実際に取引した結果、損益がプラスになる確率」とした。

チュートリアルのbacktest関数を定義しているところ(具体的には損益y[i]を計算したあと)に下記コードを入れて正解率を計算してみた。

#損益がプラスと予測した回数
if (pos * (cl[i + 1] / cl[i] - 1))!=0:
   cnt_pred+=1

#損益がプラスになった回数
if (pos * (cl[i + 1] / cl[i] - 1))>0:
   cnt_y_plus+=1

#正解率=(損益がプラスになった回数) / (損益がプラスと予測した回数) * 100
if cnt_pred!=0:
   accuracy_rate=cnt_y_plus/cnt_pred * 100

結果↓

スクリーンショット 2022-03-12 14.36.49

正解率は約24%。結構低いと思った。richmanさんがこのままでは儲からないと仰る理由かもしれない。ちなみにこの結果はrichmanさん独自のトレードルール↓でトレードした結果。

1. 現在ポジションがプラスの場合、エグジット用の売り指値を出す
2. 現在ポジションがマイナスの場合、エグジット用の買い指値を出す
3. 最大ポジションまで余裕があり、y_pred_buyがプラスのとき、エントリー用の買い指値を出す
4. 最大ポジションまで余裕があり、y_pred_sellがプラスのとき、エントリー用の売り指値を出す

このトレードルールがなかった場合の正解率も計算してみた。結果はほぼ同じく約24%。下記計算コードはOOS予測値を計算している項に追加した。

スクリーンショット 2022-03-04 19.56.31

#損益がプラスと予測した回数
y_pred_buy_bool = df['y_pred_buy'] > 0
y_pred_buy_plus_cnt = y_pred_buy_bool.sum()

y_pred_sell_bool = df['y_pred_sell'] > 0
y_pred_sell_plus_cnt = y_pred_sell_bool.sum()

#損益がプラスになった回数
y_buy_bool = df[df['y_pred_buy'] > 0]['y_buy'] > 0
y_buy_plus_cnt = y_buy_bool.sum()

y_sell_bool = df[df['y_pred_sell'] > 0]['y_sell'] > 0
y_sell_plus_cnt = y_sell_bool.sum()

#正解率(買いと売り)=(損益がプラスになった回数) / (損益がプラスと予測した回数) * 100
if (y_pred_buy_plus_cnt+y_pred_sell_plus_cnt)!=0:
  accuracy_rate_sum=(y_buy_plus_cnt+y_sell_plus_cnt)/(y_pred_buy_plus_cnt+y_pred_sell_plus_cnt) * 100

また、上記の方法とは別で、上級チュートリアルにモデルを評価する計算式が記載されてたので使ってみた(https://github.com/richmanbtc/mlbot_tutorial/blob/master/work/non_stationarity_score.ipynb)。合ってるか不安。

結果↓

スクリーンショット 2022-03-12 14.59.27

コード↓(OOS予測値を計算した後に追加)

cv = KFold(n_splits=2, shuffle=True, random_state=0)
scores = cross_val_score(model, df[features], np.arange(df.shape[0]), scoring='r2', cv=cv)
print('scores', scores)
print('score mean, std', np.mean(scores), np.std(scores))

結果はスコア約0.45。「0.8以上であれば予測性能が高い」と前回の勉強メモ#2で学んだので、約0.45は予測性能が高くはない。

正解率とスコアがいくつになれば実運用で使い物になるかは不明。たとえ100%でも実際は外れたりするだろうから、高ければ高いほど良いと思うけど、自分の中での許容値は実運用までに決めておきたい。

正解率を上げるために色々いじってみる(次回note)

richmanさんnoteの教えどおり、特徴量エンジニアリング、パージ、アンサンブル学習、ハイパーパラメータチューニングを触って正解率を上げてみる。

①特徴量エンジニアリング
→特徴量追加。未来の情報が入っていないか確認。ハイパーパラメータチューニングで特徴量選択(??!)

- 板情報 (Order Book)
- 価格帯別出来高 (Volume Profile Visible Range, VPVR)
- オープンインタレスト (Open Interest, OI)
- 清算 (Liquidation)
- オンチェーンデータ
- SNSデータ (単語を含むツイート数や、自然言語処理など)

②パージ
→richmanさんチュートリアルで紹介されてた

③アンサンブル学習
→精度が劇的に上がったという声をネットで何度か見た。下記読む。

④ハイパーパラメータチューニング
→モデルのパラメータを変化させる?

正解率があがったときにロットを上げる(次回note)



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