<株進捗>8/7やったこと・・・プログラムの検証

東京で仕事帰りに泊まりがけで遊んで帰って、プログラムの進捗が遅れてました。
一度習慣が崩れるとダメですね…。

今日やったことのサマリ

プログラムが悪いのか、株価予想はそもそも無理なのか検証!

  • (ここまでくるのにもグダグダ…)
  • いくつかのベンチマークを設定し性能テスト

    • y=√x
      f:id:kurupical:20170807205636p:plain:w400
      →データを標準化(平均0,標準偏差1)に変換して戻しの処理がバグっていました。とりあえず、データ標準化モードを外して学習させました。
      f:id:kurupical:20170807205355p:plain:w400
      →1000回、隠れ層=1で学習完了。
      他サイトでは4000回で学習完了とか書いてあったので、優秀な成績。

    • 2次関数(定数a,b,cはランダム)
      f:id:kurupical:20170807210052p:plain:w400
      →学習のスピードがかなり遅いです。

    • 3次関数(定数a,b,c,dはランダム)
      f:id:kurupical:20170807210316p:plain:w400
      →2次関数と同じ。

    • 4次関数(定数a,b,c,d,eはランダム)
      →2次関数、3次関数と同じになるだろうと思ったのでやっていません。

  • 株価予想をする前にクリアすべき課題

    • 2次関数〜4次関数を予想できるようプログラム修正
    • テストプログラムの作成 上記4つの関数の予想テストがすぐできるプログラムを作っておく

そもそも

…株価予想なんか難しいことする前に、自分が作った学習モデルが正しく学習するのかという検証をちゃんと行わないとダメでした。
y=sin(x)とy=√xが予想できたからOKかと思っていましたが、まさか2次関数がアウトとは…。
2次関数すら予想できないようでは、そりゃ当然株価も予想できません。。
実務でAI作る時もこういう形での性能テストが必要なんだろうなと思いました。
例えば、わざとわかりやすいデータを作って(株でいえば、終値出来高も単調増加・終値は単調増加だが出来高は単調減少など…)、予想できるかテストするというような。
生データを食わせるのはその先ですね。。

<株進捗>8/3やったこと・・・チューニング

8/3やったこと

  • tensorboardの導入
    ネットワークが可視化できる。
    実装自体は簡単。ただ、見てもさっぱり分からない…
    f:id:kurupical:20170803220143p:plain 勉強で作ったsin波予測プログラムと今回の株予測プログラムを比較して、変なところがないか確認してちょこちょこ修正しました。

  • ハイパーパラメータの調整
    テストデータのサイズを変えてみました。
    f:id:kurupical:20170803223417p:plain
    →点線が実績値、実線が予想値です。
    うまくいかず。
    どうパラメータを調整しても、予測の最初にバイーンってなるのはなぜなんでしょう…。

  • データ加工
    株価ではなく、株価の前日比増減を学習させてみる


    • 1000→1100→900→990→…という値動きは
      0→(1100/1000)→(900/1100)→(990/900)…
      = 0→1.1→0.82→0.9…
      とやってみました。
      f:id:kurupical:20170803223542p:plain
      →これもダメっぽい…?
      今夜またいろんなパラメータ与えてぶん回ししてみます。

若干(かなり?)行き詰まっています。
こーしてみたら?的なアドバイスがあれば欲しいです。
データさえ食わせたらそれなりの予想してくれるっしょ!っていう考えは甘かった…!

そういえば、新しいPC、処理速度が落ちてきた気が…
やっぱりSSD上でディープラーニングはまずかったんでしょうか笑。

<株進捗>8/2やったこと・・・BidirectionalRNN

8/2やったこと

  • やっぱり株価データをちゃんと学習しない!!
    いくら学習させても、予想がちゃんとできない…(500kepochしてもだめでした) ということで今日は以下を試してみました。

    • y = √xの予測
      そもそもプログラムがバグっていないか??という確認のため、 終値をy = √x(0 < x < 1000)にして、学習させてみた。
      →学習し、予想もちゃんとできた。

    • BidirectionalRNNの実装
      →効果なし。

手詰まり感がでてきました。
学習経過を見ることができるものがある(TensorBoard)ようなので、変に学習していないか確認してみるなど、粘ってみようと思います。

<株進捗>8/1やったこと・・・BatchNormalization、リファクタリング

今日やったこと

  • 昨日の処理ぶん回しの結果確認
    指定した銘柄と相関がある240銘柄の3年分の値動きを学習させて、指定した銘柄の株価を予想させる。
    →学習はうまくいっていませんでした…。過学習でもなく、単純に学習ができていない感じです。
    学習回数(epoch)が足りない?それとも根本的におかしいところがある?
    ひとまず、学習を効率的にできる方法を探しました。→Batch Normalization

  • Batch Normalization

  • リファクタリング
    ソースを整理しました。

    • グラフ描写をすべてローカル関数化
      学習1000回ごとに、株価予測をさせるように変更。
      また、学習の経過もグラフ描写するように。
  • 再処理
    ひとまず1銘柄の値動きを学習させて1銘柄の株価の値動きを予想させてみます。
    過学習となっても構わないので。。

  • ソースコード
    github.com
    learn.pyを修正しました。

<株進捗>今日やったこと

今日やったこと

  • RNN、LSTMをもう一度勉強しなおし
    学習の制度が全然あがらず詰まったので…

  • 学習データの絞り込み
    これまでは、4000銘柄全部のデータを学習→1銘柄の株価変動を予測としていましたが、以下の通り変更しました。

    • ターゲット株と、対象期間N(現在からN日分の値動き)を指定。
    • 全銘柄のN*2〜N日分のデータをすべて調べ、上記と正または負の相関があるデータ(ひとまず|cor| > 0.5)を学習データとする。
  • ハイパーパラメータ調整
    今まではいちいちパラメータ変数を変えてその都度処理していましたが、いろんなパラメータを与えて繰り返し処理できるようにしました。

  • 多層モデルの対応
    1層にしていたのですが、多層にできるよう対応しました。
    (英語のドキュメントばっかりで苦労しました…)

  • ぶん回し

    unit = [50]
    learning_rate = [0.001]
    n_hidden = [50, 100]
    classifier = ["LSTM", "GRU"]
    layer = [2,3]

これで処理をぶん回します。(epoch=5000)多分丸1日はかかるかと…。
SSDを酷使しまくっています。大丈夫かな…

今後やりたいこと

  • 学習データの絞り込み2
    ターゲット株の現在からN日分の期間の値動きについて、相関がある値動きデータを沢山抽出できるようにしたいです。

ソースコード

learn.pyが学習プログラムです。
github.com

<株分析>今日やったことと成果

今日やったこと

  • スケールダウン
    最初は、始値、高値、安値、終値出来高…など、たくさんの変数から次の日の終値を予想しようとしていましたが、ちょっと難易度が高すぎました。。
    ということで、過去100日の終値→次の日の終値を予想する、という単純なロジックから実装することにしました。

  • リファクタリング
    predict.pyをリファクタリング
    変数の数を増やしたり減らしたりするときに、定数を変えたらいいだけの設計にしました。
    あと、オブジェクト指向で書き直しました。

  • データの標準化
    各値を標準正規分布に合わせて標準化した値を投入するよう変更しました。

  • 成果
    1銘柄の1日目〜100日目の株価をデータにして、それ以降のデータを予測させてみました。
    (点線:実際の値 実線:予想値)

    f:id:kurupical:20170730181031p:plain
    見ての通り、全然ダメでした。

  • 次やってみること ・前日比の変動率で計算させてみる?(ネットではうまく行った報告が結構あるので) ・(ある程度形になってきたら)銘柄のグルーピング→学習?(時価総額でグルーピング、DeepLearningで概念抽出させる、など)

  • ソースコード github.comGitHubの使い方はわかってきた、ような・・・?

<メモ>新PCと旧PCで株学習の性能比較とか

GPU環境、CPU環境で株のデータを学習させてみました。

  • 検証内容
    ・ネットワーク:GRU
    ・入力層:7(日付、始値、高値、安値、終値出来高証券コード)
    ・出力層:5(始値、安値、高値、終値出来高)
    ・隠れ層:2000
    ・データ数:280(1銘柄、約1.5年分) ・1データ単位あたりのデータ数:100
    →インプットデータ:181
    (no1〜no100、no2〜no101…no181〜no280)
    ※データは明らかに不足していますが、テストということで…

  • 環境
    ・CPU環境 : Corei7/8MB/ノートPC
    GPU環境 : Corei7/16MB/GeForce1070/デスクトップPC

  • 検証結果
    ・CPU環境 → 187秒/epoch
    GPU環境 → 7秒/epoch
    早くなりすぎて感動しました。。PCに投資した甲斐がありました。

  • いざ本番!(データ量1/3)
    ・CPU環境 → メモリ不足でフリーズ
    GPU環境 → 1200秒/epoch
    epoch=5000なので、2.5ヶ月ぶん回しっぱなしでようやく終わる計算です。
    これじゃダメですね。

  • 今後やりたいこと
    ・入力層、出力層を減らしたり増やしたり
    →・入力層の「始値、高値、安値、終値」は「終値」にまとめる
    (短期売買ではないので、始値・高値・安値・終値のどれかがわかるくらいで十分。)
    ・総資産、時価総額、売上、純利益くらいは入力層に入れたい