[TensorFlowで株価予想] 7 - 株価が何%上昇すると予測したら買えばいいのか？

# TensorFlowで株価予想シリーズ

+ [0 - Google のサンプルコードを動かしてみる](http://qiita.com/akiraak/items/b27a5616a94cd64a8653)
+ [1 - 終値が始値よりも高くなるかで判定してみる](http://qiita.com/akiraak/items/52aebc558ee312dba2b5)
+ [2 - 日経平均225銘柄の株価予想正解率ランキング〜](http://qiita.com/akiraak/items/706f74eeba95ec32cf16)
+ [3 - 日本3506銘柄の株価予想ランキング](http://qiita.com/akiraak/items/3e1ecbb9acfd872b944a)
+ [4 - 実際に売買したら儲かるのかシミュレーションしてみる](http://qiita.com/akiraak/items/27d8e91982d3322873c3)
+ [5 - 大きく上がると予想されたときだけ買ってみるシミュレーション](http://qiita.com/akiraak/items/fe45001ad011178fae5e)
+ [6 - 学習データの項目を増やす！隠れ層のサイズも増やす！](http://qiita.com/akiraak/items/61def86cc8070d0fa4b2)
+ [7 - 株価が何%上昇すると予測したら買えばいいのか？](http://qiita.com/akiraak/items/5d08587ac460c253492d)
+ [8 - どの銘柄を買うか](http://qiita.com/akiraak/items/5e8a8c761f098a4a68fb)
+ [9 - 年利6.79%](http://qiita.com/akiraak/items/8eec7ed4ec0b383f6592)

ポケモンGO始まりましたね。僕も大いに遊ばせて頂いて今ではレベル20です。めざせレベル30。そんなことをしてたらプー太郎の身が急に忙しくなり Qiita を書いてられなくなりました。ポケモン恐るべしです。気持ちを入れ替えてお香を炊きながら書いていこうと思います。

前回は学習データの項目数を増やしたり隠れ層のサイズを検証したりしました。その結果、隠れ層のサイズは `512, 512` がよいと分かりました。

今回は判定のところを調整します。現在は2%上昇したら買い判定としていますが、株価の変動率は銘柄によって異なります。毎日5%ほど乱高下している銘柄もあれば、1%しか動かないものもあります。そこで、銘柄によって何%上昇したときを買いと判断するのかを変えていきます。

# ソースコード

[github](https://github.com/akiraak/tensorflow-stock-index/tree/7) に上げてあります。

# 上昇%を決める

銘柄によって株価の変動率は違います。そして、あまり高い率にすると買いとなるデータが少なくて学習が進まない可能性もあります。そこで「学習データの株価変動率のうち上位何%が含まれるようにする」という方法にしてみました。わかりにくい日本語ですみません。

たとえば、以下のようなソート済みの２０日分の学習データが合った場合に上位10%を買いとすると

```
[
    0.91,
    0.92,
    0.93,
    0.94,
    0.95,
    0.96,
    0.97,
    0.98,
    0.99,
    1.00,
    1.01,
    1.02,
    1.03,
    1.04,
    1.05,
    1.06,
    1.07,
    1.08,
    1.09,
    1.10
]
```

20個のうちの10%で2個。それが含まれるパーセントということで末尾から２個目の1.09になります。株価が1.09倍上昇した時を買いにします。

ソースコードの箇所はこちら。

```py:goognet.py
UP_RATE = 0.07          # 上位何パーセントを買いと判断するか
```

```py:goognet.py
# 学習データの「終値／始値」を取得
train_close_rates = (using_data[close_column]/using_data[close_column].shift()).values[:len(using_data[close_column]) - TEST_COUNT]
# 小さい順にソートする
train_close_rates.sort()
# 何%以上上昇した場合に購入するかの閾値を得る
up_index = int(len(train_close_rates) * (1. - UP_RATE))
up_rate = train_close_rates[up_index] - 1.
```

# 上位何%を買えばいいのか

このコードに複数の%を設定し、どの値がもっとも結果がよくなるのかを試してみました。20%, 15%, 10%, 9%, 8%, 7%, 6%, 5%, 4% と試した結果がこちららです。

|上位％|平均残高|平均正解率|最大残高|最大正解率|
|------|-------|----------|-------|---------|
|20%|¥9,901,035|18%|¥11,085,959\|26%|
|15%|¥9,793,755|14%|¥10,204,717|24%|
|10%|¥9,983,092|12%|¥10,575,370|28%|
|9%|¥9,896,587|8%|¥10,220,839|24%|
|8%|¥9,919,179|7%|¥10,339,751|37%|
|7%|¥10,162,459|5%|¥10,909,261|18%|
|6%|¥10,067,776|7%|¥10,700,885|59%|
|5%|¥10,047,417|1%|¥10,426,930|4%|
|4%|¥10,028,692|0%|¥10,188,491|0%|

２0％から下げていくと平均正解率（買うと予想したが外れた）は下がるけど平均残高は上がっていきます。今までも同じような結果がでていて、上昇率が大きくあがるようなレアなケースで学習器を作っておくとそんなに悪く無い値段で取引できていると思われます。もっと％を下げた場合の残高がよくないのは、そもそも取引回数が少なすぎているからだと思います。

最適な割合は7%あたりでしょうか。

# そして、そろそろシリーズも終わりです

実際に株価を予想して購入する場合は以下の問題を解かないといけないと思います。

1. どのような学習データで識別器を作るのか
2. いつ識別器を作るのか
3. いつ売買するか
4. どの銘柄で売買するか

1 は今までの検証の結果となります。

2 はアメリカの市場が閉まった後（日本時間午前５時くらい）です。

3 は買いが始値で売りが終値です。

しかし 4 だけ問題として残っています。平均残高が黒字になりましたが、その中でも良いものをより直ぐって売買する方法を検証していきたいと思います。

そして予想ですが、もう２回ほど記事を書くと使えるものになっていると思われるので実戦投入に移り qiita 記事の投稿も終わります。

# 訂正
%の桁が一つズレていたので修正しました。誤:2% 正:20%