【AI投資システム構築】5.学習モデルの作り方

# 為替レートを予測する学習モデルをつくります

前回の投稿で、時系列データの教師データを生成しました。

https://qiita.com/marcy_st_tech/items/99f328db201da6e126c9

この教師データを用いて学習するモデルをつくります。
時系列データの学習モデル構築方法について、私は下記書籍で学び実践しました。

https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-TensorFlow%E3%83%BBKeras%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0-%E6%82%A0%E8%BC%94/dp/4839962510

# 時系列データの学習モデル

先に、私が構築した学習モデルの例を図示します。下記のような構成です。

![model_len6_item7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992567/9c3c651b-05ee-4d87-b2e0-4592f60bce5f.png)

- 同じ特徴量毎、多種の通貨ペアをセットにして入力層とする
- それぞれの入力セットにLSTMの中間層を入れる
- LSTMの出力をレイヤー正規化(Layer Normalization)する
- 伝達関数でそれぞれの出力を変換する
- 結果を集約（Average）する

以上

ソースコードの例は下記のとおりです。**Keras** （機械学習やディープラーニングのモデル作成を容易にするオープンソースのライブラリ）を用いれば、簡単に実装できます。

~~~python:モデル生成サンプル
# 入力を定義
x_inputs = []
x_outputs = []
input = Input(shape=(INPUT_SHAPE1, INPUT_SHAPE2))
for index in range(len(X_train)):

    # 入力から結合前まで
    x = CuDNNLSTM(len(X_train[index][0][0]), return_sequences=False)(input)
    x = tf.keras.layers.LayerNormalization(axis=1)(x)
    x = Dense(OUTPUT_NUM, kernel_regularizer=regularizers.l2(0.01),
        activity_regularizer=regularizers.l1(0.01))(x)
    x = Activation('relu')(x)
    x = Model(inputs=input, outputs=x)

    x_inputs.append(x.input)
    x_outputs.append(x.output)

# 平均
z_outputs = Average()(x_outputs)

# 出力
z_output = Dense(1)(z_outputs)

# モデル定義とコンパイル
model = Model(inputs=x_inputs, outputs=z_output)
opt_adam=Adam(lr=0.01, beta_1=0.9, beta_2=0.999)
model.compile(loss="mse",
    optimizer=opt_adam,
    metrics=['mae','mse'])
~~~

上記モデルを人が為替レートを予測する手順のように記載すると、
- 通貨ペア毎、多種のテクニカルチャートを表示し目視確認する
- それぞれテクニカルチャート分析する
- 予測したい通貨ペアと相関のある通貨ペアの分析結果を統合し、最終的に判断する

となり、
なんとも人間的な分析手順を踏む、テクニカルチャート分析のノウハウ本に記載されているような学習モデルができあがりました。

当初は人間がやらないような分析にするために、複雑な多層構造にしましたが、過学習（学習期間は正答率90%、未学習は50%など）がなかなか解消されませんでした。
結局、個人投資家ができるテクニカルチャート分析は、最適化されているんだなと感じました。

::: note warn
DeepLearningが流行りだした10数年前から、学習モデルはどんどん複雑に、多階層になっていきましたが、ここ数年は逆にどんどん単純化していき、SmallLearning（少ないデータで高性能を）が主体となっているようです。私も個人でできる範囲でいろいろ検証しましたが、複雑化すると、過学習が克服しずらくなると実感しています。
検証するなら、単純なモデルから始めて、どんどん複雑にすることをお勧めします。
:::

ですが、構築した学習モデルによる予測の精度は、通貨ペアにもよりますが、数時間後に上昇するか下降するかの精度では、せいぜい55%～65%程度です。
また、昨今のアメリカを起因とした市場の急変動は、数年分の時系列データを学習した学習モデルでは予測精度が落ちるようです（去年の大統領選まではよかった…）

そのため、下記書籍に記載されているように、「テクニカルチャート分析」＋「ファンダメンタルズ分析」の必要性を大いに感じています。

https://www.amazon.co.jp/%E6%9C%AC%E6%B0%97%E3%81%A7%E7%A8%BC%E3%81%8E%E3%81%9F%E3%81%84%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEFX%E3%83%95%E3%82%A1%E3%83%B3%E3%83%80%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%BA%E5%88%86%E6%9E%90%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E6%B0%B8%E4%B9%85%E4%BF%9D%E5%AD%98%E7%89%88-%E3%83%95%E3%82%A1%E3%83%B3%E3%83%80%E3%81%AE%E5%8B%89%E5%BC%B7%E3%81%AF%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7OK%EF%BC%81%E5%85%83%E6%89%8B%E5%8F%96%E3%82%8A15%E4%B8%87%E5%86%86%E3%81%AE%E3%82%B5%E3%83%A9%E3%83%AA%E3%83%BC%E3%83%9E%E3%83%B3%E3%81%A7%E5%B9%B4%E5%8F%8E5000%E4%B8%87%E5%86%86%E9%81%94%E6%88%90%E3%81%AE%E7%8F%BE%E5%BD%B9FX%E3%83%88%E3%83%AC%E3%83%BC%E3%83%80%E3%83%BC%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/dp/B09VG2NW3Y/ref=asc_df_B09VG2NW3Y?mcid=a0ae6c2dde983da9aa0fa20c985fee41&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707453333232&hvpos=&hvnetw=g&hvrand=17710771799055447141&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9217100&hvtargid=pla-1642050746096&psc=1&gad_source=1


::: note info
:coffee:**Coffee Break**
現在、テクニカルチャート分析と自動売買をAIに実行させ、ファンダメンタルズ分析は人が行う運用にしていますが、ゆくゆくはファンダメンタルズ分析もAIに実行させようとしています。
ですが、個人が使用できる生成AIや対話側AIは、ファンダメンタルズ分析の専用AIではないため、質問するたびに回答が変わったりします。正確性に欠けます。
**あくまでもAIはCoPilotとして、情報収集（スクレイピング）や要約（ブロードリスニング）を実行し、判断は人間が行うのが妥当と考えています。**
:::

# 学習モデルの構成検討（失敗談／成功談）

## 【失敗談】CNNを使う
私が検討を始めた当初、CNN（畳み込みニューラルネットワーク）が流行っていたので、
為替レートの時系列データをわざわざ画像のように2次元的に配置して学習させてみたりしました。
CNNについては、下記記事が詳しく分かりやすく記載していますので、参照させて頂きます。

https://qiita.com/DeepTama/items/379cac9a73c2aed7a082

結果、それなりの予測精度（52%程度だったかな）はでましたが、LSTMなど、時系列データ向けの学習モデルの方が精度が高いことを実感しました。やはり記憶セルは意味があるようです。

## 【失敗談（成功談？）】パーセプトロンを使う
失敗談というより、RNN（リカレントニューラルネットワーク）の有効性を確認するため、基礎となる単純パーセプトロンや多層パーセプトロンを構築し、伝達関数を少しずつ変えて検証したりしました。
単純な構成だと予測精度は50％～51％程度が限界でした。

ただし、基礎を学ぶ意味では有意義であったと感じています。
下記の書籍が分かりやすく記載されていたので、オススメです。

https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=sr_1_1?adgrpid=52707338829&dib=eyJ2IjoiMSJ9.BSJwVIIOHE6YoQRMnC_Atr3guHh3CZHN5o796dAWFCGXHennOFOA9HtC0IZoe1CJqNBW0c4qSDUtRrVEDLOFGy3NJW9X9WeA_VwRg0kI-S5EGQMzdUYabeUhUr2BcyZ29qpWgIYsSifq7tdAFiUcCYCM0N89DELyGbE-oBY0VAcmhplUoDIYLN5SQUsoruFH2CjfA4yswAG95q8zZi7jDnu_sa6SbnJiBmEeOo-Q08qKL3Ps78X-uk7lX1TkepGLyXXfLVhIGDzerZzlsOqfqJsvQjsHFcF2mpHo6AleoJQ_PtFebKGnMqFkBXmEBjn8XmcZGF5vXhAPR0qZUzLXwDWlpmyW6Qboc1ohYrTFHC8AjdKovDxYRQpjDAPG4E334ARr4s4fBQG780vqFFY6rc_Zn_zd7bI7jy54oJOjJV6bhjXTgShOJDnA6vRDsDxn.uCancTVYm-x44jKjeTQ4iEu3lmqrWdcK5tJP3KAn_H0&dib_tag=se&hvadid=678984843978&hvdev=c&hvlocphy=9158090&hvnetw=g&hvqmt=e&hvrand=6141889078710831674&hvtargid=kwd-335457286238&hydadcr=27294_14738600&jp-ad-ap=0&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B+deep+learning&mcid=11b461c8c3993d039baed87637ccff4b&qid=1742549925&sr=8-1

## 【成功談】レイヤー正規化（Layer Normalization）を使う
私がDeepLearningの学習を始めた当初は、
レイヤー正規化という概念は普及されておらず（たぶん…私が無知だっただけかも…）、
バッチ正規化（Batch Normalization）しか知りませんでした。

正規化層を入れると、学習の安定性が増し、発散することが少なくなる一方、
精度が上がらないなと（55%ぐらい）思い悩んでいたところ、
レイヤー正規化という概念を知りました。

https://cvml-expertguide.net/terms/dl/layers/batch-normalization-layer/layer-normalization/

為替レートの時系列データ予測はこれだ！と思い、組み込んだのを覚えています。
結果、予測精度も上がりました（通貨ペアによっては60%ぐらいまで）

ちなみに、**Keras** を用いれば、Layer Normalizationは簡単に実装できます。

https://keras.io/api/layers/normalization_layers/layer_normalization/

# まとめ

前回の投稿より内容がずいぶん薄いですが、
為替レートを予測する学習モデルの作り方について、簡単に記載しました。

もっといろいろ検証したと思いますが、
過去にやったことが、PCや部屋中にとっ散らかって整理できていないので、
もし整理ができたら、追記します。

また、ここで私が記載した内容はすべて正解ではありません。
学習モデルの作り方について、少しでも参考にしていただけますと幸いです。

次は、「学習方法」について、投稿する予定です。
どんなに良い学習モデルでも学習方法が悪ければ、すぐに過学習が起きてしまいます。
重要な内容です。

よろしくお願いいたします。