MachineLearning
DeepLearning
ディープラーニング
株価
TensorFlow

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

More than 1 year has passed since last update.


TensorFlowで株価予想シリーズ


はじめに

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


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

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


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

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


前回からのコードの違い

コードはgithubに上げてあります。

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


goognet.py

REMOVE_NEWEST_DAYS = 200 * 1    # 除外する最新のデータ日数



goognet.py

# 最新のデータを除外する

if REMOVE_NEWEST_DAYS:
training_test_data = training_test_data[:-REMOVE_NEWEST_DAYS]

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

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


売買シミュレーション

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

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

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

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

215銘柄 x 10回 x 4期間 = 8600回の計算、、、なので凄く時間がかかりました

※実際は5期間してるのでもう少し多い


結果

過去4期(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位くらいがよい成績を出しているので、この銘柄を使って実践的な売買シミュレーションを行おうと思います。今までは1つの銘柄を一定期間の200日で売買していただけでした。それだと実際に購入できる日は200日もあるのに実際に買うと予測する日は10日とかそれくらいしかありません。しかし複数の銘柄で売買を行うのであれば、買うと予測する日はもっと増えると思います。それにより売買シミュレーション後の残高はもっと増えるでしょう(もしくは減るでしょう)

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