Nn

提供: PXDOG
2019年2月23日 (土) 09:32時点におけるMediawikiadmin2018 (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
Jump to navigation Jump to search

# 久しぶりにニューラルネットワーク

ニューラルネットワークで遊んだ。

久しぶりのPython、久しぶりのKeras(TensorFlow)。

昨日はパソコン開いても電源が押せずにぼーっとしてた。

身体的にじゃなくて精神的に押せなかった。

昨日だけじゃなくて、ここ1週間くらいそうだった。

で、久しぶりなことやってみようと思い立った。

# データ

データはずっと前から断片的に集めている。

自分のサーバに放置してあったJPY-BTCFXの、2週間半15万件のWebSocket加工データを使った。

データを取得するコードはNode.jsで適当に書いてあった。

また動かすことにした。

ニューラルネットワークのコードはPythonで書いた。

サンプルコードをまずコピペして動かし、

ずーっと前に書いた(書いた記憶がほぼ無い)Pythonのコードを断片的にコピペしながら、

それっぽいニューラルネットワークをKeras(TensorFlow)で作成。

ここまで2時間(半年ぶり3回目のPythonにしては思ったより早く読めたと思う)。

それからデータのラベル化方法やら学習率やら中間層やらドロップアウトやらのハイパーパラメータ?等をいじること4時間。

テストデータで5.5割超えてなんとか儲かりそうなんじゃない?っていうレベルになった。

次はこれまたずっと前に書いたbbot.pwのコードをまず解読して、改変して、

この学習済みモデルを使って売買するものにする。

機械学習・深層学習は完全に独学だからいじめないで欲しい。

# 結果

画像だけ適当に。

いろいろとだんだん良くなっていった。

勝率3割のbotて。

Bad Result

チャート君、落ち着いて。

OK Result

ほう、なんだかそれっぽくなってきた?

Good Result

まぁなんだかよさそうじゃん。

勝率低いけどね。

Better Result

夜中から朝までずっとやってた。

この辺でよしとして、次はこれをトレードに使う。

その前にやることやる。


2019/02/02 追記

混同行列も悪くないんじゃないの。

混同行列

でもモデルはもう過学習してる。

絶対この0.55〜0.60に何かある。

過学習してる

データの間違いかな、わからない。


2019/02/03 追記

外れ値があった。

MinMaxScalerで標準化してた。

プロットするまで気づかなかった。

半年前ここらへんでやめたような気がする。

プロットして直し方わからなかった、もしくは標準化してなかったかな。

外れ値

Scalerを変えて、外れ値が見えないようになった。

Quantileで一様にした。

Scaler変更

全部じゃなくて、外れ値があるようなデータのみQuantileで一様になるように変換して、それ以外はMinMaxでいいかもしれない。

bullシグナルは70%当たりっぽい。

だけどbullシグナル多すぎない?

70%超えた

逆にbearの54%が信頼できそう。

今ここで、0.XXX%という表記のおかしさに気づいた。


2019/02/06 追記

この学習に使っているのは2018年8月からの16万件のデータ。

それをsplitしてtrainとvalidationに使っている。

SGDで学習率を下げ、500epoch学習した結果こうなった。

Epoch 499/500
58938/58938 [==============================] - 76s 1ms/step - loss: 1.4799 - acc: 0.3480 - val_loss: 1.4832 - val_acc: 0.3471
Epoch 500/500
58938/58938 [==============================] - 76s 1ms/step - loss: 1.4819 - acc: 0.3483 - val_loss: 1.4831 - val_acc: 0.3473
Test loss: 1.4830847713925088
Test accuracy: 0.34733038121200055
Computation time:39006.827 sec
19647/19647 [==============================] - 5s 248us/step
cmx: 
[[1793  761  389  242  666]
 [1067  980  820  415  592]
 [ 677  740 1193  651  663]
 [ 594  481  828 1015 1060]
 [ 646  273  431  827 1843]]
Normalized confusion matrix: 
[[0.46559335 0.19761101 0.10101272 0.06284082 0.17294209]
 [0.27542592 0.25296851 0.21166753 0.10712442 0.15281363]
 [0.17252803 0.18858308 0.3040265  0.16590214 0.16896024]
 [0.14932127 0.12091503 0.2081448  0.25515334 0.26646556]
 [0.16069652 0.06791045 0.10721393 0.20572139 0.45845771]]

実行に10時間かかった。

Best8の混同行列

accuracyがクロスしたところでちょうど終わった。

いい結果

なぜいつもvalidationデータ(オレンジ線)のほうが上なのかわかっていない。。。

このモデルを使って、学習に全く使用していない2月の4万件のデータを検証してみた。

Unknownデータ

左上と右下は極端な価格の変化だから特徴が出やすいのか、正確性が高い。

ラベルを3から5に増やすことで、曖昧なStayはトレードしないように、

弱気(bear)/強気(bull)な部分は逆の建玉なら半分決済してしまうなどができる。

さて、売買するコードに埋め込むか。


2019/02/18 追記

実際にデータを取得し、Excelっぽい何かで結果を確かめた。

3479件のデータ(34790秒≒9時間半、時間、予測0〜4、過去120秒の予測平均、過去60秒の予測平均、価格)を貼り付け、

30秒毎の価格平均を計算し、それが40秒後の過去30秒間の価格平均(つまり予測から10秒経った後30秒の平均)と比べて

予測(0:下げ down、1:若干下げ bear、2:現状維持 stay、3:若干上げ bull、4:上げ up)とあっているか確かめた

実際にデータを取得して検証

上の方の数字をあれこれしたものを、Correctと書いてある表にまとめた。

正解率65%以上、本当か???

ま、少しだけだけどシミュレーションしたんだし、

ずーーーーーっと前に少し動かしたbotのコードを改良して(というかデータ取得部分は既にそうしている)、

実際に売買してみるしかないかな。

注文の仕方にも寄るだろうけど、10秒ごと上か下か出るなら毎10秒ごと注文してみるのがいいかな。

ただ指値だと約定しない注文の処理が面倒だし、成行だと損なのが悩みどころ。

# 20190218までのアーキテクチャ

現在はまだ売買しておらず、日時、予測、予測平均12、予測平均6、価格をログに出力しているのみ。

データ取得はNode.jsでWebSocketを繋いで、MySQLで10秒毎保存している。

DBからCSVファイルに変換するコードをNode.jsで書いて実行。

サーバからダウンロードして、ノートPCに保存。

PythonでCNNするコードを書いて、保存したCSVデータを使ってモデルをTrain。

上で保存したモデルを使ってPredictするコードをPythonで書く。

予測のパラメータを受け取るTCPサーバのコードを、Predictするプログラムに追記。

Node.jsでWebSocketを繋いでデータを取得し、上記TCPサーバにパラメータを渡すプログラムを作成。

PythonのTCPサーバからPredictした結果を受け取り、ログに出力。

なぜTCPサーバかというと、child_processのexecFileで実行するとモデルのロード等に時間がかかるから。

TCPサーバをいつかどこかに組み込みたいという小さな小さな夢がかなった。

Content-Lengthとか、HTTPの偉大さがわかった。

Pythonはエラーメッセージがわかりづらいしコードも見づらいし環境・バージョン管理煩雑だし楽しくない。

CNNとTCPサーバでもうお腹いっぱい。


2019/02/19 追記

上のExcelの実験結果はゴミだった。

CNNに時系列にデータを流し込むべきところを、逆時系列(現在に近い順)にしていたり、

10秒前から1分10秒前までのデータが入っていなかったりした。

なにやってんだろうね、あたまはたらけ。

# 自動バイバイ開始した

前の売買コードに組み込んで動かした。

前書いたものは未完成だったらしく、鬼のようにぼろぼろなコードだったので修正に時間がかかった。

それでも今までJavaやPHPで合わせて1.5万行くらいは自動売買関連のコードを書いてきたから、

Node.jsの書きやすさもあって構想は簡単だった。

で、実行してみた。

実行中の様子

風呂あがりにパッと見ていいじゃんて思ってスクショした。

6:42に買い注文いれて、それからしばらく予測値は2(Stay)のまま。

6:48に底売ったらすぐに3(Bull)が出て買い注文。

ふーん素敵じゃん、素敵。

朝6時に実行し、一時間後のBOTのみの損益は+2000円。

いいじゃん、時給2000円。

こうなるまでは、夜中ずっと購入方法を変更していた。

予測値が0でもすぐに売るのではなく、

前回も0で今回も0なら売るとか、直近1分の平均が2未満で予測値0なら買うとか試行錯誤した。

10秒毎に上げか下げかすぐに変わるから、予測出たらすぐに注文するようにした。

そうじゃないと約定せずダラダラ持ち続けて損する。

しばらく様子を見てみる。

今日の夕方までエラーで止まったりせず、損益も+5000円くらい行ってたら嬉しいなぁ。

時間外労働で実質時給500円の生活にバイバイしたい。


2019/02/23 追記

結局↑の日はマイナス12000円でした。

は?って感じ。

もう泣きたい。

いつもならこれから何度も改良していくけど、今はそんな気力ないなぁ.......