見出し画像

勉強メモ#2(python機械学習で仮想通貨bot作成)

前回(勉強メモ(python機械学習で仮想通貨bot作成))の続き。やっとbotを稼働することができたので、稼働までにインプットした知識を一旦まとめる。

特徴量分布の定常性

定常性https://tjo.hatenablog.com/entry/2013/07/04/190139
→「時間が経っても全体で見ればその時系列は変わらない」という性質。何を不変とするかによって弱定常性と強定常性の2つに分かれる。

弱定常性は過程の期待値と自己共分散が時間を通じて一定
強定常性は同時分布が不変である

共分散とは「国語の点数」と「数学の点数」のような「二組の対応するデータ」の間の関係を表す数値です。共分散を計算することで,「国語の点数」が高いほど「数学の点数」が高い傾向にあるのか?あるいは「国語の点数」と「数学の点数」は関係ないのか?などが分析できます。

経済・ファイナンスデータの定常性https://index-atama.com/research/time-series/stationarity/
一般的に、GDPや株価は経済成長の帰結として長期的には上昇していく傾向があり、経済・ファイナンスデータがもつトレンドは時点によって期待値が変化することを意味します。
つまり、経済・ファイナンスデータの多くは非定常過程であると考えられる訳ですが、一方で、その差分や対数差分を取ると定常過程として振る舞っていることが多いです。

Adversarial Validation(Kaggle)
https://www.sairablog.com/article/adversarial-validation-sklearn-kaggle-lightgbm.html
https://www.acceluniverse.com/blog/developers/2020/01/kaggleadversarial-validation.html

学習用データとテスト用データの分布が、異なっているか否かを判定する方法。

TrainデータとTestデータの分布が異なる際に、Testデータに似たValidationデータを作成する

予測に寄与した特徴量の重要度の一覧が見れる

重要度が高い特徴量=TrainデータとTestデータの間の乖離に大きく寄与している

特徴量を省いたり、両データ内で特徴量の性質をそろえる処理をしたりすることで、より汎用力のある機械学習モデルの作成が可能になる。

richman non-stationarity score (上級チュートリアル)

https://github.com/richmanbtc/mlbot_tutorial/blob/master/work/non_stationarity_score.ipynb
https://note.com/btcml/n/na4376bc5c336

特徴量の非定常性を測る。
非定常性が高い=汎化性能が悪い
非定常性が低い=汎化性能が良い

特徴量から時刻を予測するモデルの評価(決定係数r2)が小さければ、予測値と実測値の誤差が大きい=特徴量分布が時刻に依存しない
決定係数r2は0.3以下が目安

決定係数(R2)
回帰モデルの評価に用いる指標。0〜1の間の値をとり、値が大きくなるほど予測値と実測値の誤差が少ない計算式であることを意味する。一般的に、0.8以上であれば予測性能が高い。
R2の値が小さい=予測値と実測値の誤差が大きい

ハイパーパラメータチューニング

https://www.codexa.net/hyperparameter-tuning-python/

モデルのパラメータ(ハイパーパラメータ)のチューニング。
チューニングによってモデルの正解率を上げるのが目的。

主なチューニング方法3つ。
1つ目:グリッドサーチ(Grid Search):与えられたハイパーパラメータの候補の値の全パターンのモデル構築を行う手法。MT4だと、全パラメータのstart,stp,stepを設定してチェック入れて最適化するイメージかな?

2つ目:ランダムサーチ(Random Search):候補の値をランダムに組み合わせたモデル訓練を行いハイパーパラメータを検証。MT4だと、1つ目のグリッドサーチは時間がかかりすぎるから、start~stop全範囲で最適化せずに、ランダムで何個かパラメータの組み合わせを作って最適化するイメージかな?

3つ目:ベイズ最適化(Bayesian Optimization):不確かさを利用して次に探索を行うべき値を探していく最適化アルゴリズムの一種。前回の結果を基に次に調べる値を決めていく」手法。MT4だと、最適化1組目のパラメータでのバックテスト結果を見て、その結果を基に、2組目のパラメータを決めてバックテストしていくイメージかな?

optunaによるハイパーパラメータチューニング
optunaとは、ベイズ最適化の一種であるTPE(Tree-structured Parzen Estimator)をデフォルトの最適化アルゴリズムとして持つハイパーパラメータのチューニングライブラリ。

hyperoptによるハイパーパラメータチューニング
hyperoptは、optunaと同じで、最適化してくれるライブラリ。精度はOptunaの方が良いっぽい(https://qiita.com/pontyo4/items/6ac690c5114a619f9da0)。

交差検証nested cvとBBC-CV

https://blog.amedama.jp/entry/2018/07/23/084500
モデルの性能を正確に評価するために、元データを学習用やパラメータ調整用、検証用などに分割して検証する方法。ハイパーパラメータの選択も同時にできたりする。ここは実運用の結果が悪ければ調べることにした方が良さそう。

ロット数の決め方

不明。FXのMT4だと、10年間とか比較的長い期間でバックテストした結果の最大(相対)DDから決めていた。

Dockerの理解

https://qiita.com/etaroid/items/b1024c7d200a75b992fc

Docker:
Docker社が提供する「コンテナ型仮想化技術」 を実現するプロダクト

Docker Engine:
Dockerを利用するための常駐プログラム。Docker for macをPCにInstallすることで、常駐プログラムとしてDocker Engineが動作し、Dockerを利用することができる。

Dockerfile:
RUN:イメージ作成時(=docker build時)に指定したコマンドが実行される
CMD/ENTRYPOINT:コンテナ開始時(=docker start時)/作成時(=docker run時)に実行されます。

Dockerイメージ(Image):
コンテナ(=アプリケーションの実行環境)を起動するのに必要な設定ファイルをまとめたもの。「Imageはコンテナの元であり、Imageからコンテナを起動する」と理解すると良い。DockerではこのImageを共有することで、様々なマシンで同じコンテナ(実行環境)を動作させることができるのです。buildコマンド実行すると、Dockerfileが読み込まれて、Dockerイメージを作成

Dockerコンテナ:
imageを用意したら、そのイメージからコンテナ(=アプリケーションの実行環境)が起動できます。

画像3

Bot運用までの大まかな流れ

1. トレード損益の未来予測が右肩上がりのモデルを作成
・手法を実装
・特徴量の選択
・学習モデルの選択
・検証など
コード最後に、未来予測がプラスなら「BUY(もしくはSELL)」を出力(print)する

2. Botの実装
・モデルの出力(BUYもしくはSELL)を読み込むコード
・出力どおりに注文するコード
上記でbotはほぼ完成で、以降はbotを稼働させるための作業

・環境変数ファイル(.envファイル。environmentの略)やDockerfileを作成
・DockerビルドしてDockerイメージ作成
・Dockerイメージからコンテナを作成・起動(run)して自動売買スタート

スクリーンショット 2022-02-17 6.40.51

無事にトレードしてた。bybitのデモ口座。

3. デプロイ
4. 運用

これ以降はまだよくわからない。デプロイとは、作成したbotを実際に稼働する環境に配置して使える状態にする、という意味らしい。が、botはすでに稼働できてるので使える状態ではある。なので、たぶん、AWSとかAzureのような24時間稼働してるクラウド(FXだとVPSみたいなもの?)にDockerイメージを移行させてそこでDockerコンテナ作成・起動(=bot稼働)させることなのかな?

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