機械学習で株価予測やってみたが
今更かよってネタだけどTensorFlow使って株価予測をやってる。
やってみたけどうまくいかないって内容だけど、、、現時点での備忘録。
1)データセット
スクレイピングなどのデータ収集方法は置いといて、、、
学習データには日付、日経平均、JASDAQ指数、ドル、ユーロと予想の対象となる株価(今回はトヨタ 7203)を使ってる。売買の手数料については無視(俺の場合だと信用取引で100万円betしても税込388円だし)。
ユーロが1991年1月から導入されたとかなんとかで、自分が収集した方法ではこのユーロが一番データ数が少ない。1991年1月から2017年6月末までを学習データ、7月から12月末までをテストデータとしてデータセットを作成。
寄りで買うか売り、引けでその反対の売買をする。信用取引で売りからもあり。宵越しの株は持たない。
1つのデータは以下のようなデータを持つ。
横幅はn日分、縦は項目(上記の日付、日経平均など)、奥行きが4つで始値、高値、安値、終値の4つ。悩んだけど、出来高は考慮外。
正解は 終値/始値 の値をベースに9種類とした。ざっくり下のような感じ。5から8はマイナス側。
0 +6%超
1 +4%〜+6%
2 +2%〜+4%
3 0%〜+2%
4 変化なし

↑理想的には確率分布を求めるイメージ。
あと、学習には使わないけど実際にbetした場合の利率(一番知りたい値だよね)を計算するために 終値/始値 の値も入れてる。
2)NNの構成
上記のようなデータにしたのはCNN(畳み込み)で解いてみようとしたため。MNISTとかだと画像が白黒だったのでチャンネル(画像の奥行き)が1だったが、今回は4。Cifar10はカラー画像なので参考になるかも。
なお、今回のデータを4チャンネルの画像としてデータ化すると1つの値が8ビットしかないので無次元化すると高値も安値も同じ値になるかもしれないので注意(いや、俺が実際画像を作って気付いたんだけどね)。32bitの浮動小数点数で扱ってる。
畳み込みなのでCifar10みたいな畳み込み層2つにLRN層、ドロップアウト、全結合層、出力層ってよくある感じ。
3)損失関数、期待値
損失関数にはソフトマックス関数を使っているので各ラベルの確率を得ることができる。
画像認識なんかでは単に一番確率の高いのを選ぶのが一般的だけど、今回は確率分布を得ているつもりなので、期待値の高い方にbetすることにする。

↑極端な例だけどこういう場合、確率が一番高いのはマイナス側にあるので売りがよさそうに見えるけど、買いと売りだと買いの方が期待値(面積だよね)が高くなるので買いにbetする。この期待値うんぬんは学習時には関係なくて、テストデータの検証でのみ使う。
4)結果

↑学習するやん!と喜んだのだが、、、学習が進むめば進むほど損失関数の値が学習用のデータに対する値と、テスト用のデータに対する値でどんどん乖離していった。
的中率や肝心の利率も同様で、正解率はせいぜい43%程度、半年での利率は0から-3%という結果に(パラメータをいじってもたいしてよくならなかった)。
ちなみに学習データに対してはツイートもしたけど、、、
こういう値がテストデータで出るのを期待してたんだが。
データ数少ないよねえ、、、1991年からで5,400個程度だしなあ。
5)雑感
こういうわけのわからん株価データに対してもちゃんと学習が進むんだなあ、というのには感心した。NNの表現力というか。機械学習やTensorFlowの研究者、開発者にほんとリスペクトである。
それと相場ってのはやっぱり掴み所がないんだねえ。26年間のデータに対し90%正解率あるモデルでも、いざ新しいデータに対しては50%いかないんだもの。
動くようになったらNNの構成やパラーメータをいじったりしないと、と思ってたけどそれ以前に圧倒的にデータ数が足りないみたい。ここをなんとかしないとねえ、、、
やってみたけどうまくいかないって内容だけど、、、現時点での備忘録。
1)データセット
スクレイピングなどのデータ収集方法は置いといて、、、
学習データには日付、日経平均、JASDAQ指数、ドル、ユーロと予想の対象となる株価(今回はトヨタ 7203)を使ってる。売買の手数料については無視(俺の場合だと信用取引で100万円betしても税込388円だし)。
ユーロが1991年1月から導入されたとかなんとかで、自分が収集した方法ではこのユーロが一番データ数が少ない。1991年1月から2017年6月末までを学習データ、7月から12月末までをテストデータとしてデータセットを作成。
寄りで買うか売り、引けでその反対の売買をする。信用取引で売りからもあり。宵越しの株は持たない。
1つのデータは以下のようなデータを持つ。
横幅はn日分、縦は項目(上記の日付、日経平均など)、奥行きが4つで始値、高値、安値、終値の4つ。悩んだけど、出来高は考慮外。
正解は 終値/始値 の値をベースに9種類とした。ざっくり下のような感じ。5から8はマイナス側。
0 +6%超
1 +4%〜+6%
2 +2%〜+4%
3 0%〜+2%
4 変化なし

↑理想的には確率分布を求めるイメージ。
あと、学習には使わないけど実際にbetした場合の利率(一番知りたい値だよね)を計算するために 終値/始値 の値も入れてる。
2)NNの構成
上記のようなデータにしたのはCNN(畳み込み)で解いてみようとしたため。MNISTとかだと画像が白黒だったのでチャンネル(画像の奥行き)が1だったが、今回は4。Cifar10はカラー画像なので参考になるかも。
なお、今回のデータを4チャンネルの画像としてデータ化すると1つの値が8ビットしかないので無次元化すると高値も安値も同じ値になるかもしれないので注意(いや、俺が実際画像を作って気付いたんだけどね)。32bitの浮動小数点数で扱ってる。
畳み込みなのでCifar10みたいな畳み込み層2つにLRN層、ドロップアウト、全結合層、出力層ってよくある感じ。
3)損失関数、期待値
損失関数にはソフトマックス関数を使っているので各ラベルの確率を得ることができる。
画像認識なんかでは単に一番確率の高いのを選ぶのが一般的だけど、今回は確率分布を得ているつもりなので、期待値の高い方にbetすることにする。

↑極端な例だけどこういう場合、確率が一番高いのはマイナス側にあるので売りがよさそうに見えるけど、買いと売りだと買いの方が期待値(面積だよね)が高くなるので買いにbetする。この期待値うんぬんは学習時には関係なくて、テストデータの検証でのみ使う。
4)結果

↑学習するやん!と喜んだのだが、、、学習が進むめば進むほど損失関数の値が学習用のデータに対する値と、テスト用のデータに対する値でどんどん乖離していった。
的中率や肝心の利率も同様で、正解率はせいぜい43%程度、半年での利率は0から-3%という結果に(パラメータをいじってもたいしてよくならなかった)。
ちなみに学習データに対してはツイートもしたけど、、、
機械学習で株価予測、的中率90.7%、約半年で利率が+34.2%!、、、と言いたいけどこれ学習データに対しての結果。テストデータに対してはさっぱり。絵に描いたような過学習、、、orz pic.twitter.com/cZvo1ke2Ht
— Tatsuya (@yt) 2018年1月22日
こういう値がテストデータで出るのを期待してたんだが。
データ数少ないよねえ、、、1991年からで5,400個程度だしなあ。
5)雑感
こういうわけのわからん株価データに対してもちゃんと学習が進むんだなあ、というのには感心した。NNの表現力というか。機械学習やTensorFlowの研究者、開発者にほんとリスペクトである。
それと相場ってのはやっぱり掴み所がないんだねえ。26年間のデータに対し90%正解率あるモデルでも、いざ新しいデータに対しては50%いかないんだもの。
動くようになったらNNの構成やパラーメータをいじったりしないと、と思ってたけどそれ以前に圧倒的にデータ数が足りないみたい。ここをなんとかしないとねえ、、、
スポンサーサイト
<< MacのPythonからIFTTTを使ってiPhoneに通知 TopPage SceneKitで子ボーンの回転 >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1114-d0eadcd3
https://ringsbell.blog.fc2.com/tb.php/1114-d0eadcd3