<株進捗>今日やったこと
今日やったこと
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日目の株価をデータにして、それ以降のデータを予測させてみました。
(点線:実際の値 実線:予想値)
見ての通り、全然ダメでした。次やってみること ・前日比の変動率で計算させてみる?(ネットではうまく行った報告が結構あるので) ・(ある程度形になってきたら)銘柄のグルーピング→学習?(時価総額でグルーピング、DeepLearningで概念抽出させる、など)
ソースコード github.com ・GitHubの使い方はわかってきた、ような・・・?
<メモ>新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活用まで
PC購入
- ゲーミングPCを購入。 GALLERIA XF(ガレリア XF)|ドスパラ通販【公式】 Corei7 7700/GeForce1070/メモリ16GB/SSD500GB+HDD2TB 税込17.8万円 ※OSいじると1年保証の対象外になりますと念を押されました。 しかし、保証書にはその旨全く書いてないという…。
UbuntuとWindowsのデュアルブート デュアルブートは以下を参照。手順通りにやって、すんなりいきました。 (ノートPCはこれ+BIOSでセキュアブートをいじる設定が必要でしたが…。) www.iandprogram.net
Ubuntuセットアップ
- デュアルディスプレイにならない 調査中
- GPUドライバのインストール 公式サイトでドライバの名前しらべて、 NVIDIAドライバダウンロード
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
綺麗にプログラムを書くのって難しいです。。
<進捗>株分析の進捗と課題
分析の進捗
分析ログ epoch(学習させる回数)=5 ※普通は5000回くらい
1株だけ学習させる ※実際は4000銘柄
lossが減るほど学習が進んでいるということです。
totalは時間(単位:秒)です。結果がこれ 点線は、実際の株の値動き
実線は、予測した株価→全然ダメ・・・\(^o^)/
課題
<つまづきメモ>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)