機械学習で株トレードを目指す(実装とチューニング)

プログラム
スポンサーリンク

形になってきました。
今週の4連休で実装を完了して来週から運用試験を開始していきたいと考えています。
本来ならば、どこか遊びに出かけたいのですが、今のご時世と天気を考えるとマスクをしながら歩き回る気力がありませんでした。

今回は実装するにあたり、いくつかハマったポイントをまとめてみたいと思います。

データの標準化、正規化について

大抵はデータの標準化、正規化を行い値の範囲を「0~1」「-1~1」の範囲にしてから学習、予想を行うと思います。

サンプルにもよりますが、多くは「全データを正規化、標準化」→「学習データ、テストデータに分割」という順番になっていると思います。

ここで注意しなければならないのは正規化、標準化の方法です。
scikit-learnのMinMaxScalerやStandardScaler使うことが多いでしょうか。

毎回「全データを正規化、標準化」→「学習データ、テストデータに分割」という順番で予測していくのであれば問題は起きません。問題となるのは学習データを保存して新規データで予測する場合です。

例えば、学習時のデータが[1,2,3,4,5,6,7,8,9,10]という値だった場合、MinMaxScalerだと最小値「1」最大値「10」で「0-1」の範囲に変換します。この値を使用して学習していくことになるわけですね。
ここに新規データを使って予測使用とします。「5,6,7,8,9,10」という値だった場合最小値「5」最大値「10」でMinMaxScalerで変換することになります。そうすると5の値は学習時の「5」の値ではなく「1」の値として予測が行われることになります。
その為、予測結果が大きく異なることが多いです。

これを防ぐために、MinMaxScalerやStandardScalerを使用する場合は学習時の変換ルールと同じものを使用する必要があります。

scikit-learnだと「joblib.dump」「joblib.load」で保存/読み込みを行う形が多いです。また、scikit-learnの「fit」「transform」「fit_transform」の使い分けにも気を付けましょう。
「fit」はルールの作成、「transform」は「fitのルールを使用しての変換」「fit_transform」は両方を一度に実行します。保存/読み込みを行う場合は「fit」でルールを作成した後に「保存」、読み込みを行った後に「fransform」で変換を行う必要があります。

もう一つの懸念点として、ルールのレンジを超えた場合の扱いも考慮する必要があります。「1-10」の範囲でルールを作成したのに「20」という値を変換するとおかしくなります。その場合は再度変換ルールを作成し、そのデータを使用して「再度学習」を行う必要があります。

入力データについて

データによっては学習率が上がらなかったり、予測が上手くいかない場合があります。
そういう場合はモデルのパラメータや階層を操作しても劇的に上昇することはありませんでした。(私の知識不足もありますが)
無理やり学習率を上げても過学習になってしまいます。

機械学習といっても限界はあるのでそういう場合は「このデータは向いていない」とあきらめることも重要です。
今回は株式データですが、同じモデルを使用しても精度が高い銘柄と低い銘柄がありました。

入力データを「正規化」「標準化」する以外に加工すると精度が上がる場合があります。詳しくは書けませんが、「終値」「ローソク足」では精度が上がりませんが株価を他の形式に変換すると精度が上がりました。

機械学習は入力データの加工、整形が大半と言われますが実装してみるとその言葉が良く分かります。

コメント

タイトルとURLをコピーしました