🐈

richmanbtcさんチュートリアルの学習モデルの作成

2022/03/08に公開

注意 学習モデルの作成だけ扱います。

データの前処理やバックテストについては扱いません。

botter必読書

  • 日給300万円のSS級トレーダーが明かすbotterのリアル

https://amzn.to/3hUFlfm
いわずと知れたリッチマンさんの著書です。
ぼんやりと仮想通貨のトレードで儲けたいと考えていた僕を、
botterの道へ明確に導くキッカケになった本。

botterになろうと考えている人は、botterのメリット、
狙い目などの概略的な部分が知れて良いと思います。

  • Kaggleで勝つ技術

https://amzn.to/3MD6iCf
リッチマンさん推奨の本。分からなくなったら読めと書いてあった。
僕はデータの前処理や学習モデルを作っているとき、「???」となることがあった。
そのとき読んでクリアできた。

過去の僕の記事

文系で機械学習未経験の僕が、richmanBTCさんのチュートリアルをやってbotterになるまでの流れ

https://zenn.dev/flutternyumon/articles/4fa5f97b0c4ba3

richmanbtcさんのForce Entry Priceがよく分からなかったので、自分なりにまとめてみた

https://zenn.dev/flutternyumon/articles/17fffff306fd79

richmanbtcさんチュートリアル 正解データ作成までの流れ

https://zenn.dev/flutternyumon/articles/14c4888a3d4ea4

運用のイメージ

「y_buy, y_sellを予測し、 予測値がプラスのときのみトレードすれば勝てるだろう」というもの。
y_buy, y_sellそれぞれの予測モデルが必要。

ちなみに、y_buy, y_sellの作成は以下の記事に詳しく書きました。
https://zenn.dev/flutternyumon/articles/14c4888a3d4ea4

本番に使うモデルとの違い

本番用モデルはデータ全体で学習させる。
一方、このチュートリアルではテストデータとの兼ね合いで全てのデータを学習させた本番用モデルは使えない。
そのため、ある期間だけを除いて学習させたチュートリアル用のモデルを作り、それを使う。

OOS(Out-of-sample)予測値について

OOSはテストデータのこと。このチュートリアルでは学習データとテストデータは期間で分けられている。
OOS予測値はテストデータの予測値のこと。

OOSで計算する理由は、条件をなるべく本番と同じにするため。
本番稼働時は、学習に使っていないデータ(未来のデータ)に対処しないといけません。

Cross Validation(交差検証)を使う。
交差検証は、学習データとテストデータを分割し、学習データで作ったモデルをテストデータで評価すること。

分割のやり方はいろいろあり、使い分けが必要になる。
リッチマンさんはK-分割交差検証(KFold)を使っている。

cv_indicies = list(KFold().split(df))
#dfの数だけ分割している。 

そして、OOS予測値を計算する
リッチマンさんは、my_cross_val_predictを自作して使っている。

sklearnのcross_val_predictとほぼ同じ処理だが、入力と出力のサイズが同じでないと使えないので、 入力と出力のサイズが異なっていても使えるように、自作している。

# OOS予測値を計算
def my_cross_val_predict(estimator, X, y=None, cv=None):
    y_pred = y.copy()
    y_pred[:] = np.nan
    for train_idx, val_idx in cv:
        estimator.fit(X[train_idx], y[train_idx])
        y_pred[val_idx] = estimator.predict(X[val_idx])
    return y_pred

ここから呼び出す

df['y_pred_buy'] = my_cross_val_predict(model, df[features].values, df['y_buy'].values, cv=cv_indicies)

df['y_pred_sell'] = my_cross_val_predict(model, df[features].values, df['y_sell'].values, cv=cv_indicies)

cv = cv_indiciesを使って、KFoldの値を入れている。

出典

richmanbtcさんのgithub「https://github.com/richmanbtc/mlbot_tutorial」

Discussion