システムトレード構築編

DeepLearningシストレの特徴量についての考察

機械学習システムトレーダーの皆様、こんにちは。

機械学習でシステムトレード(以下、シストレ)を構築する時、いろいろ悩みどころがありますよね。特徴量の選択もその一つです。

ディープラーニングのシストレのアイデア要素

 

  • ストラテジーのアイデア
  • 分類/回帰の定義
  • 特徴量の選択

通常、シストレのアイデアは、ストラテジーのアイデアと同義です。

しかしDeepLearning(ディープラーニング)のシストレの場合、アイデアは従来のストラテジーのアイデアに加えて、分類や回帰の定義方法と特徴量の選択やサイズの要素もあります。

今回は「DeepLearningシストレには、どれぐらいの特徴量が適しているのか?」について考えていきたいと思います。

シストレの特徴量、DeepLearningの場合

特徴量、次元数やフィーチャー数と呼ぶこともあります。

この次元数をいくつにするかは、特徴にどのようなデータを使うのか、どのような分類にするのか、機械学習の手法はどうするのか等で、全然違ってきます。次元数に最適値という考えはなく、トライ&エラーを繰り返すのが普通です。

とはいえ、目安はほしいところです。

私はDeepLearningの場合は、次元数は200~1200ぐらいでモデルを組んでいます。理論はよくわかっていません。ただの経験則です。

試しているのは1200ぐらいまでですが、だいたい300~500次元ぐらいで上手くいくことが多い印象です。通常の画像解析と大差ないですね。

特徴量を考えるときに考慮しないといけない項目

システムトレードの場合、特徴数に困ることはありません。やろうと思えば過去データをいくらでも特徴にできます。しかし当然、単純に増やせばいいというわけではありません。

特徴量の規模感を決めるときに考慮しないといけないのは、

  • 精度
  • 学習時間
  • データサイズ

の3つです。

必要以上に特徴を増やしすぎると精度が落ちます。いわゆる「次元の呪い」というやつです。また次元数が増えれば計算量も増えるので、学習により多くの時間がかかるようになります。

「特徴量が増える = データファイルのサイズが大きくなる」ということなので、メモリやGPUメモリに影響します。

メモリのサイズに注意

次元数を増やせば増やすほど、訓練やテストに使用するテキストデータの容量が大きくなります。

このテキストデータはモデル構築時にオンメモリにロードするので、訓練データとテストデータの合計サイズを学習に使用するPCの物理メモリのサイズ以下に抑える必要があります。(※)

特徴データ1つ1つの桁数にもよりますが、私の場合は1分足の1年分が1000次元で3~4GBぐらいです。デスクトップPCにはメモリ64GB積んでいますので、バッファを考慮して50GBぐらいに抑えるすると、訓練、テスト合わせてだいたい12年分ぐらいのでデータを使用できる計算になります。

(※) プログラムをどう組むかによります。毎回、必要なデータだけを読み込むようにすればメモリ以上のファイルを扱うことはできます。ただ、学習の数をこなすことを考えたら、毎回Readするのは時間がかかりすぎて非効率なので、最初にだけReadしてオンメモリにロードしておくようにする作りが一般的かと思います。

GPUメモリのサイズにも注意

次元数が増えるということは、中間層の素子数も増える傾向にあります。この値が大きすぎると、GPUの OOM(Out Of Memory)が発生してしまいます。

中間層の素子数を減らせば OOM は避けられますが、次元数に対して少なすぎると学習精度は出なくなります。

裁量トレードからの視点

裁量トレードの場合、様々な時間軸のローソク足を何本も見るかと思います。これを特徴データに換算すると次元数は1000どころじゃありません。

それを鑑みると、次元数はたくさん設定したくなります。

しかし、次元数を増やしたからといって、精度がよくなるわけじゃないのが機械学習の難しいところです。次元数500のストラテジーが次元数1000のストラテジーよりパフォーマンスがいいなんてことはザラにあります。

ランダムフォレストのときは次元数50個ぐらいで作っていました。それでもパフォーマンスはちゃんと出ていて、今でも本番で稼働中です。

特徴にはどんなデータを使えばいいの?

DeepLearningが流行る前、ランダムフォレストやサポートベクターマシーンでシストレを作っていた頃は、特徴に移動平均千やMACDなどのテクニカルの値を入れていました。

でも、DeepLearningを使うようになってからは、テクニカルの値は使わず、価格差のデータだけいれるようになりました。

単純にめんどくさくなったのと、DeepLearningがいい具合に必要なデータを取り出していい感じにやってくれるでしょという甘えです。

今のところ違いは体感できていないので、これでいいんじゃないかと思っています。結局テクニカルも価格データから特定の値を算出しているだけなので、機械学習的にはやっていることはそんなに変わらないんじゃないでしょうか。

機械学習に大事なのは結局のところゴリ押し思考!

上記の通り、どんな特徴がいいのかは、実際に学習を走らせてみないとわかりません。

人間には意味があるように見える特徴で組んでもパフォーマンスが悪いことも多々あります。どんな特徴がいいかを考えるの時間をかけるより、人間には理解できなくても適当な組み合わせでもガンガンと数をこなす仕組みを作る必要があります。

結局、大事なのはゴリ押し思考です。機械学習で成果を出すために、ゴリ押しは避けて通れません(笑)

COMMENT

メールアドレスが公開されることはありません。