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

今日やったこと

  • 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ヶ月ぶん回しっぱなしでようやく終わる計算です。
    これじゃダメですね。

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

<メモ>PC購入→Ubuntu導入、GPU認識まで・・・

PC購入〜GPU活用まで

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
   でインストールして、

$ apt-cache search 'nvidia-[0-9]+$'

   で一覧を出して、公式サイトのドライバの名前と一致するものをインストール

$ sudo apt-get install nvidia-384

ひとまず今日はここまで。 連続でソース書くときに間のコメントまでソースっぽくなってしまうのはどうしたらよいのでしょうか…。 書き方が間違っているんでしょうか。

<その他>GitHubでソース公開

GitHubでソース公開

便利さとか使い方があまり良くわかっていないので、今回公開して終わりになるかもしれませんが…

  • kaggleのデータサイエンスコンペのプログラム
    ちょっと前に取り組んでいたやつです。
    公開している2本は完成。 SBS.pyがプログラムとしては綺麗にかけたなーと思っています。
    ニューラルネットワークで学習させるプログラムを、時間があるときに作りたいと思っています。 github.com

  • 今やっている株分析のプログラム
    トライアンドエラーでゴリゴリ進めてしまっているので、全体的にプログラムがとても汚いです。。
    まだ製作途中で、全然学習してくれません…。 学習してくれるようになれば、リファクタリング+機能追加するつもりです。 github.com

綺麗にプログラムを書くのって難しいです。。

<進捗>株分析の進捗と課題

分析の進捗

  • 分析ログ f:id:kurupical:20170725205443p:plain epoch(学習させる回数)=5 ※普通は5000回くらい
    1株だけ学習させる ※実際は4000銘柄
    lossが減るほど学習が進んでいるということです。
    totalは時間(単位:秒)です。

    結果がこれ f:id:kurupical:20170725205534p:plain 点線は、実際の株の値動き
    実線は、予測した株価

    →全然ダメ・・・\(^o^)/

  • 課題

    • GPU(NVIDIA GeForce 1070↑)がいる
      CPU/GPU/AWSでのTensorflow実行速度比較 - Qiita
      CPUとGPUでは速度が10倍近く違うため、GPU搭載PCは必須です。
      今までは遊びでできるデータ量でしたが、さすがに今回は無理ですね…
      ただ、日本橋のパソコン屋さん回って聞きましたが、GPUは結構すぐ性能あがるみたいです。
      AWSで間借りするほうがいいんですかね。(AWSだと$3.0/h)
    • 株価予想のグラフが一直線。
      原因不明です…。

<つまづきメモ>loss関数がNaN値になる

評価関数(loss関数)がNaN値になる。

  • 原因

    • inputデータに,float32の最大値(232=2147483647)を超えるデータが存在した。 (売上高とかあるんだから当たり前ですよね…)
  • 対策

    • float64を使う
a = np.array([])
a.astype(float)
a = pd.read_csv(path).values
   2行目を差し込んだ。(a.astype(float))
   配列ににnanは存在しなくなりましたが…
       TypeError: Tensors in list passed to 'values' of 'ConcatV2' Op have types [float64, int32] that don't all match.
   調査不足かもしれないが、どうやらtensorflowはfloat32しか対応していないみたい。なので別対応が必要?

 * 常用対数を使う
        if "証券コード" in df_marge.columns:
            df_code = df_marge["証券コード"]
            df_marge = pd.np.log10(df_marge)
            df_marge = df_marge.replace([np.inf, -np.inf], np.nan).fillna(0)
            df_marge["証券コード"] = df_code
    これでうまくいきそうです。

    夢中になってたらこんな時間になってしまった。(am3:00)