前回と前々回の記事ではpythonでFX自動売買を行うために必要なAPI経由での価格データの取得と、予測モデルを評価するためのバックテストについて紹介させていただきました。今回はディープラーニングのLSTMモデルを使ってFXの時系列データを予測してみたいと思います。LSTMはPyTorchで実装します。実装にあたっては、PyTorchのチュートリアルを参考にしました。定数の定義と必要なパッケージのインポート先にこのモデルの学習とテストで利用する定数を定義しておきます。future_numでは、価格が上がるか下がるかを予測する未来の10分足数です。ここでは10分足データの144足分のため、1日先の価格が上がるか下がるか、の予測となります。Closeの5項目を利用します。batch_sizeはLSTMの学習時に一度に投入するデータポイント数です。time_stepsは、LSTMが予測で利用する過去のデータポイントの数です。今回は過去の50個分のデータを見て、144個先のClose値が現在に比べて上がるのか下がるのかを予測するモデルとしています。moving_average_numで500と指定しています。これは、LSTMに投入するデータは過去500足分の移動平均に対する現在の値の比率とするためです。n_epochsはLSTMのトレーニングで何epoch数分実施するかです。val_idx_from、test_idx_fromはそれぞれデータの何行目以降を評価用、テスト用として分割するかの位置です。target_dimはLSTMの隠れ層の出力サイズと最終出力サイズです。1LSTMのモデルに必要なパッケージをインポートしておきます。deviceはGPUの利用可否に応じでcudaまたはcpuがセットされます。足りないパッケージなどあればpip等でインストールしておいてください。"cpu")torch.manual_seed(1)データ準備LSTMで学習できるようにデータを準備していきます。APIで取得したCSVデータを読み込みます。教師データとして、144足先のClose値と現在のClose値を比較し、上がって入れば1、下がっていれば0をセットします。数量や価格はそのまま利用するのではなく、直近500足データの移動平均に対する率とします。約3.5日分の移動平均に対して何%上下しているかを予測のためのインプットとします。データを分割し、PyTorchで利用できるようにtorchのtensorに変換しておきます。1#最初の500足分は移動平均データがないため除く。時系列データを処理するためのLSTMのクラスを定義します。このクラスでは、(バッチ数、時系列データ数、特徴量数)のデータを受けて、LSTMを通し、LSTMの最終出力をLinear層に渡し、Linear層の出力をsigmoidでバイナリの予測として出力する、というモデルにしています。今回はLSTMで二値分類のため、LSTMの時系列の出力は利用せず、最終出力のみを利用します。各データポイント毎に50個分の時系列データをLSTMに渡して、LSTMは50個分の時系列の結果を返しますが、途中の結果は利用せずに最終出力結果のみを利用します。LSTMの最終出力のみを利用する。torch.sigmoid(linear_out)次に一つヘルパーファンクションを定義しておきます。このファンクションは重要で、データポイントのindexのバッチ数分の配列を受けたら、その各index毎に過去50個分の過去データを2つめの次元に追加してそれを一つの固まりとしてLSTMに投入できるようにします。この各データポイントに対して、過去50個分(time_steps数)のデータを合成してfeatsとして返します。2次元目に合成されたデータが過去50個分の時系列データとなります。stepのデータとして格納する。featsLSTM学習の実施ここまで準備が整ったら、実際に学習を実施してみましょう。LSTMのインスタンスを生成し、損失関数と最適化関数を設定します。loss(BCELoss)を利用、optmizerはAdamを利用します。lr=1e-4)学習を実行していきます。時系列処理とはいえ、全件を1件づつ回していくと時間がかかるので、ミニバッチを作るためにIndexをランダムに入れ替えます。ランダムに入れ替えたindexを、ミニバッチの対象数(128件)毎にまわしていきます。対象のミニバッチデータのそれぞれに、時系列データの50個分の過去データを付与します。PyTorchのモデルを使って学習させます。epoch毎に評価用データを使って予測、結果を確認します。各評価用データの結果を比較し、ベストのモデルを保存します。最後にベストのモデルでテスト用のデータを評価します。trainデータのindexをランダムに入れ替える。最初のtime_steps分は使わない。bestモデルで予測する。roc_score)実行結果は次のようになりました。0.5020565230922682LSTMのモデルでバックテスト実施LSTMのモデルを使ってバックテストを実施してみます。準備として必要なパッケージのインポート、csvデータの読み込み等を行います。pd.to_datetime(df.index)続いて、バックテストで利用するためのLSTMのStrategyクラスを定義します。initではLSTMの学習済みモデルを読み込んでおきます。PyTorchのLSTMに投入するためにデータを整えます。LSTMのPyTorchのモデルで予測します。予測結果が1であれば買い、0であれば売りの指示を出します。profit)も指定してみました。minuteが0の時のみ処理するようにする。500足の移動平均に対する割合とする。np.round(y_score.view(-1).to('cpu').numpy())[0]バックテストを実行します。commission=.00004)bt.run()実行結果はどうだったでしょうか。object228回の取引でReturnが3.01%、10万円が10万3,012円となっていました。最初のベースラインモデルとしては悪くなさそうです。チューニングを施していくことで、本番環境でも一定の利益があげられるモデルになるかもしれませんね。次回はBERTを使った経済ニュース解析にチャレンジしてみたいと思います。requestStockLike23THERE2@THERE2AIでマイクロビジネスを。マイクロビジネスでAIを。個人ビジネスこそAIの恩恵を受けてもらいたいと思って活動でしています。upLoginユーザーは見つかりませんでした。