[TensorFlowで株価予想] 8 - どの銘柄を買うか

# 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)

# はじめに

前回まではデータ項目数を増やしたり、隠れ層のサイズを調整したり、株価が何％上がると予想したときに買うのが一番結果が良いかを検証してきました。その結果、日経２２５銘柄の全てで売買した場合でも売買シミュレーションで黒字にできるような値に調整できました。しかし、予算の問題もあり全部の銘柄なんて買ってられません。そして、データを見ていると予測が当たる銘柄もあれば外れる銘柄もあるように見えます。そこで買うべき銘柄を絞りこんでみようと思います。

# 今までの予測はマグレではないのか？

しかし、もう一つ疑問があります。それは、今までの売買シミュレーションでは直近200日よりも前のデータで予測器を作って、直近２００日のデータで売買シミュレーションを行ってきました。それによって儲かる銘柄と儲からない銘柄が分けれる気がします。しかし、それはマグレではないのでしょうか？たまたま「テストデータ」で結果が良い「学習データ」があったというだけではないのでしょか？本当にこれで作った予測器で明日以降の株を買っても良いのでしょうか？

# 過去何年かの予測が当たっていれば今の予測も当たるはず

そこで「過去何年かの予測が当たっていれば今年の予測も当たるだろう」という仮説を検証してみたいと思います。「１年前、２年前、３年前、４年前の売買シミュレーションの結果が良ければ、きっと今年の結果も良いだろう」という考えです。

# 前回からのコードの違い

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

前回からの変更点はこちらになります。直近何日かの株価データを除外できるようにしました。これにより１年後、２年後での株価予測を行えるようにしています。実際は200日後、400日後などの200日の倍数にしています。

```py:goognet.py
REMOVE_NEWEST_DAYS = 200 * 1    # 除外する最新のデータ日数
```

```py:goognet.py
# 最新のデータを除外する
if REMOVE_NEWEST_DAYS:
    training_test_data = training_test_data[:-REMOVE_NEWEST_DAYS]
```

また、今回の検証とは関係ないのですが、あまりにも処理時間が長くかかるので、いくつか高速化を入れました。

+ [正規化したデータをキャッシュする](https://github.com/akiraak/tensorflow-stock-index/commit/c4767c39bf4324944e647138a0577cf1da41c9eb)
+ [Fabricでの処理中にサーバを再起動させる](http://qiita.com/akiraak/items/ef78d2bd66da9b80ba02)

高速化を入れる前は TITAN X でも10日ほど、CPU だと100日くらいかかると思うんですけど、なんと５日で終わります。。。でも長いですねぇ

# 売買シミュレーション

売買シミュレーションは直近200日よりも前のデータで予測器を作り、売買は直近200日のデータで行います。買いと予測したら当日の始値で購入し終値で売ります。元金は1000万円とし、手数料はGMOクリック証券のものを使います。

同じ銘柄と同じデータで作った予測器でも売買を行った結果のブレがかなりありました。そこで１０回予測器を作って、その結果の平均を取ることにします。

過去の売買シミューレションは、200日前、400日前、600日前、800日前の４期間を取ります。

これらの計算を日経225の銘柄で行います。株価データ日数が2000日未満のものは除外したので実際は215銘柄で行います。

215銘柄 x 10回 x 4期間 = 8600回の計算、、、なので凄く時間がかかりました
※実際は5期間してるのでもう少し多い

# 結果

過去４期（200日前、400日前、600日前、800日前）の過去平均が高い順でソートしてみました。

|順位|コード|200日前|400日前|600日前|800日前|過去平均|今期|
|----|-----|------|-------|-------|------|--------|----|
|1位|9501 |13,236,176 |10,189,855 |11,206,372 |12,857,355 |11,872,440 |10,382,269 |
|2位|9503 |10,622,372 |9,165,977 |10,706,464 |12,018,935 |10,628,437 |10,895,548 |
|3位|8354 |11,258,174 |10,326,286 |10,542,657 |9,884,058 |10,502,794 |10,288,487 |
|4位|7270 |10,249,210 |10,000,000 |11,009,887 |10,064,866 |10,330,991 |9,829,349 |
|5位|9064 |10,147,030 |10,000,000 |11,135,282 |10,000,000 |10,320,578 |10,447,982 |
|6位|8628 |10,080,358 |9,414,992 |11,555,517 |10,190,270 |10,310,284 |10,123,759 |
|7位|8804 |10,000,000 |10,051,893 |11,025,573 |10,038,685 |10,279,038 |10,261,250 |
|8位|6762 |9,892,138 |10,000,000 |10,000,000 |11,173,654 |10,266,448 |10,158,491 |
|9位|2282 |10,740,998 |10,000,000 |10,178,852 |9,975,078 |10,223,732 |9,677,328 |
|10位|8316 |9,988,294 |9,930,837 |10,965,068 |10,000,000 |10,221,050 |9,855,435 |
|11位|6701 |9,916,700 |10,000,000 |10,244,565 |10,651,423 |10,203,172 |10,041,070 |
|12位|6305 |10,124,122 |10,000,000 |10,795,665 |9,858,144 |10,194,483 |10,622,213 |
|13位|8304 |9,972,819 |10,040,739 |9,549,783 |11,173,009 |10,184,088 |10,183,232 |
|14位|7205 |10,000,000 |10,000,000 |10,733,394 |10,000,000 |10,183,349 |10,306,141 |
|15位|6703 |10,039,016 |9,998,200 |10,468,641 |10,212,056 |10,179,478 |10,829,367 |
|16位|5631 |10,000,000 |10,000,000 |10,364,357 |10,324,014 |10,172,093 |10,000,000 |
|17位|6902 |10,237,315 |10,043,422 |10,378,513 |10,000,000 |10,164,813 |10,290,123 |
|18位|9020 |10,263,033 |10,122,231 |10,261,937 |10,000,000 |10,161,800 |10,438,586 |
|19位|6752 |10,000,000 |10,000,000 |10,015,329 |10,616,381 |10,157,928 |10,484,708 |
|20位|7211 |10,000,000 |10,000,000 |10,623,240 |10,000,000 |10,155,810 |9,781,904 |
|21位|1803 |10,234,688 |10,000,000 |10,203,478 |10,184,073 |10,155,560 |10,062,507 |
|22位|5214 |10,000,000 |9,979,647 |9,731,806 |10,909,612 |10,155,266 |10,539,237 |
|23位|4568 |10,000,000 |9,899,362 |10,181,208 |10,510,263 |10,147,708 |9,865,446 |
|24位|3865 |10,000,000 |10,068,954 |10,518,001 |10,000,000 |10,146,739 |10,172,274 |
|25位|1925 |10,000,000 |10,000,000 |10,586,564 |10,000,000 |10,146,641 |9,962,757 |
|26位|8252 |10,226,797 |10,038,418 |10,262,574 |10,054,677 |10,145,617 |9,758,519 |
|27位|8802 |9,566,611 |10,014,219 |10,996,050 |10,000,000 |10,144,220 |9,663,384 |
|28位|2871 |10,097,209 |10,000,000 |10,476,164 |10,000,000 |10,143,343 |10,994,989 |
|29位|4519 |10,292,881 |10,000,000 |10,231,844 |10,033,116 |10,139,460 |9,944,584 |
|30位|4502 |10,135,005 |9,985,573 |10,427,788 |10,000,000 |10,137,092 |10,000,000 |

これだとイマイチ良いのか悪いのか分からないですね。過去の成績が良いほうが今期の結果も良いのか、それとも関係ないのか？を分かりやすくするために、1位〜10位までの今期の平均、1位〜20位までの今期の平均と、10位間隔で平均を出してみます。

|順位|平均|
|---|-----------|
|1〜10位|10,191,990 |
|1〜20位|10,244,862 |
|1〜30位|10,195,365 |
|1〜40位|10,133,095 |
|1〜50位|10,112,535 |
|1〜60位|10,090,702 |
|1〜70位|10,093,744 |
|1〜80位|10,079,340 |
|1〜90位|10,090,340 |
|1〜100位|10,077,959 |
|1〜110位|10,080,998 |
|1〜120位|10,072,952 |
|1〜130位|10,060,293 |
|1〜140位|10,038,517 |
|1〜150位|10,046,266 |
|1〜160位|10,043,150 |
|1〜170位|10,056,072 |
|1〜180位|10,052,065 |
|1〜190位|10,053,752 |
|1〜200位|10,057,925 |
|1〜210位|10,043,934 |
|1〜215|10,038,364 |

過去売買ラインキング上位10位による今期売買の平均は10,191,990円です。上位20位だと10,244,862円になります。上位30位だと10,195,365円だけど、そこから下になるとだんだん下がっていきます。最終的に日経225（今回は215）での平均は10,038,364円でした。

順位が高いほうが売買平均も高いので、これは過去成績が良かった銘柄は今期も成績が良いと思ってよいのではないでしょうか。

# 今後

今回の「どの銘柄を買うか」で上位30位くらいがよい成績を出しているので、この銘柄を使って実践的な売買シミュレーションを行おうと思います。今までは１つの銘柄を一定期間の200日で売買していただけでした。それだと実際に購入できる日は200日もあるのに実際に買うと予測する日は10日とかそれくらいしかありません。しかし複数の銘柄で売買を行うのであれば、買うと予測する日はもっと増えると思います。それにより売買シミュレーション後の残高はもっと増えるでしょう（もしくは減るでしょう）

そして、次で内容的には一段落しそうなので「TensorFlowで株価予想シリーズ」としては一区切りです。