とある京大生の作業ログと日々の雑記

コンピュータサイエンスについて学んだことを可視化したり日々の雑記をまとめてます。

Deep Learningを使って株価の予測してみた話(前編)

こんばんは!コミさん(@komi3__ )です!


最近までずっと風邪っぽくて、めっちゃ喉痛かったり口内炎できたりでかなりバッドコンディションだったんですけど、ようやくそれが治りつつあるのでだいぶ調子がいいです。

やっぱ一人暮らしで体調崩すと孤独に絶望しますね....
早く彼女が欲しいです....


そういえば最近だんだんと寒くなってきて冬だなぁって感じがします。
そろそろクリスマスですよね〜


なんで大学生ってクリスマスとかハロウィンみたいな季節イベントに敏感なんですかね?
まあただイベントは騒ぐだけの口実って感じがしないでもないですが

彼女がいないぼくはクリスマスは関係ありません!
ひとりぼっちのエンジニアの皆さん!ぼくはそっち側です!仲間です!


高校の友達とかに
「彼女できへんねんけど」
みたいなこと言うと、必ず
「いや近くに京女(京都女子大学のこと)とかあるやん。京大生やったら入れ食いでしょ」
と返してきます。

京大入って1年半経った今ならそれに対する回答を明確に述べられます。


答えは「まず京女の人と知り合えない」です。


京大生モテるでしょって言われますけど、そもそも出会いがなかったりコミュ障だったりでなかなか彼女ができないのです。
(もちろんインカレに入ってたりちゃんとコミュ力がある人は彼女ができます。イケメンとか関係ないです)


とりあえず京大生の非モテ事情はクリスマスあたりにみっちりと書こうと思います(笑)


ここらへんの京大生の悲しい恋愛事情は置いといて、さっさと本題へ入りましょう。


最近ビットコインとかのことが気になって色々調べてたんですけど、あれって仮想通貨じゃなくて暗号通貨っていうのが正しい感じなんですね。

ぼくらが普段取り扱ってる貨幣ってメインバンクに集積させて、その1点を超絶硬いセキュリティで守ってる感じじゃないですか。


その一方で、ビットコインのセキュリティシステムって「ブロックチェーン」ってシステムを採用してるんです。

皆さん聞いたことありますかね?

簡単に言えば「誰の残高がどのくらいか」ってのを「あえていろんなコンピューター上に分散させて共有する」ってシステムらしいんですよ。

だから、例えばクラッキングして残高を書き換えるとして、メインバンクだったらコアシステムを書き換えればいいんですけど、ブロックチェーンだと全コンピューターにクラックして逐次書き換えなければいけないんです。

まあ頑張ればいけるかもですけど、とんでもない労力になって事実上不可能というわけです。


ビットコインとぼくらが扱っているお金、全く違うアプローチでセキュリティを確保してるってわけですよね。
非常に面白いシステムだと思いました。


あとこの暗号通貨、ビットコインだけかと思いきや、アルトコインというまた別のビットコインがあって、イーサリウムとかいろんな銘柄があるらしいんです。

経済面のことはあんまりわかんないんですけど、ちょっとこれをいい機会に勉強してみようかな、と思いましたね〜

ちなみに今はFXのシステムがどうなってるのかとかの勉強もしてます!
(FX自体はやらないと思いますが)


まあそんな背景で、「せっかく深層学習とかゴリゴリやってるから株価分析とかやってみようぜ」という安易な理由で今からおもちゃ(予測モデル)を作ります(笑)

って言っても割と基本構造は簡単で、結局はRecurrent Neural Networkを教師データにうまいことフィッティングさせるだけなんですよね。

なので今回は分析の準備の話をします。


実を言うと最近TensorflowからPyTorchに乗り換えつつあって、今は修行期間なのでコードはもう少し待ってください。
そのうち載っけます。

まあとりあえずバンバン準備していきましょう!


株価の分析とか予測をするにあたって過去の動向とかのデータが必要ですよね。
株価のサイトとか引っ張ってくれば可能なんですけど、でもそれってまたスクレイピングとかの技術が必要じゃないですか。

そんなモヤモヤを解決してくれるツールがあるんです!
世の中便利になったもんだね!

その名も「Quandl」です!

公式サイトはここです!

www.quandl.com

ここに登録すれば(無料)、一部有料のデータがありますが基本的なデータは全部無料で使えるのです!

めちゃくちゃ便利!

では早速インストしましょう。

pip3 install quandl


そしたら随分と長くたくさんのものを引っ張ってきます....

komi:22:37:31 ~$ pip3 install Quandl
Collecting Quandl
  Downloading Quandl-3.2.1-py2.py3-none-any.whl
Collecting requests<2.18,>=2.7.0 (from Quandl)
  Downloading requests-2.17.3-py2.py3-none-any.whl (87kB)
    100% |████████████████████████████████| 92kB 897kB/s 
Requirement already satisfied: pandas>=0.14 in /usr/local/lib/python3.6/site-packages (from Quandl)
Collecting inflection>=0.3.1 (from Quandl)
  Downloading inflection-0.3.1.tar.gz
Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/site-packages (from Quandl)
Requirement already satisfied: six in /usr/local/lib/python3.6/site-packages (from Quandl)
Requirement already satisfied: pyOpenSSL in /usr/local/lib/python3.6/site-packages (from Quandl)
Requirement already satisfied: pyasn1 in /usr/local/lib/python3.6/site-packages (from Quandl)
Requirement already satisfied: numpy>=1.8 in /usr/local/lib/python3.6/site-packages (from Quandl)
Collecting more-itertools (from Quandl)
  Downloading more_itertools-3.2.0-py3-none-any.whl
Collecting ndg-httpsclient (from Quandl)
  Downloading ndg_httpsclient-0.4.3-py3-none-any.whl
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/site-packages (from requests<2.18,>=2.7.0->Quandl)
Collecting urllib3<1.22,>=1.21.1 (from requests<2.18,>=2.7.0->Quandl)
  Downloading urllib3-1.21.1-py2.py3-none-any.whl (131kB)
    100% |████████████████████████████████| 133kB 1.3MB/s 
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/site-packages (from requests<2.18,>=2.7.0->Quandl)
Requirement already satisfied: idna<2.6,>=2.5 in /usr/local/lib/python3.6/site-packages (from requests<2.18,>=2.7.0->Quandl)
Requirement already satisfied: pytz>=2011k in /usr/local/lib/python3.6/site-packages (from pandas>=0.14->Quandl)
Requirement already satisfied: cryptography>=1.9 in /usr/local/lib/python3.6/site-packages (from pyOpenSSL->Quandl)
Requirement already satisfied: asn1crypto>=0.21.0 in /usr/local/lib/python3.6/site-packages (from cryptography>=1.9->pyOpenSSL->Quandl)
Requirement already satisfied: cffi>=1.7 in /usr/local/lib/python3.6/site-packages (from cryptography>=1.9->pyOpenSSL->Quandl)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/site-packages (from cffi>=1.7->cryptography>=1.9->pyOpenSSL->Quandl)
Building wheels for collected packages: inflection
  Running setup.py bdist_wheel for inflection ... done
  Stored in directory: /Users/komi/Library/Caches/pip/wheels/41/fa/e9/2995f4ab121e9f30f342fa2d43f0b27f851a0cb9f0d98d3b45
Successfully built inflection
Installing collected packages: urllib3, requests, inflection, more-itertools, ndg-httpsclient, Quandl
  Found existing installation: urllib3 1.22
    Uninstalling urllib3-1.22:
      Successfully uninstalled urllib3-1.22
  Found existing installation: requests 2.18.3
    Uninstalling requests-2.18.3:
      Successfully uninstalled requests-2.18.3
Successfully installed Quandl-3.2.1 inflection-0.3.1 more-itertools-3.2.0 ndg-httpsclient-0.4.3 requests-2.17.3 urllib3-1.21.1

長かったですがインストールできました。

では早速使ってみましょう。

import quandl
mydata = quandl.get("EIA/PET_RWTC_D")

こんな感じでデータを取得します。

ちなみにこのデータはアメリカのDepartment of Energy出典の石油の値段のデータです。
(株価だけじゃなくてこんなのも扱えるんかいっていう驚き)

中身を見てみましょう。

>>> mydata
            Value
Date             
1986-01-02  25.56
1986-01-03  26.00
1986-01-06  26.53
1986-01-07  25.85
1986-01-08  25.87
1986-01-09  26.03
1986-01-10  25.65
1986-01-13  25.08
1986-01-14  24.97
1986-01-15  25.18
1986-01-16  23.98
1986-01-17  23.63
1986-01-20  21.33
1986-01-21  20.61
1986-01-22  20.25
1986-01-23  19.93
1986-01-24  19.45
1986-01-27  20.87
1986-01-28  19.45
1986-01-29  19.61
1986-01-30  19.58
1986-01-31  18.95
1986-02-03  17.42
1986-02-04  15.58
1986-02-05  16.28
1986-02-06  16.60
1986-02-07  17.70
1986-02-10  16.78
1986-02-11  16.28
1986-02-12  15.74
...           ...
2017-09-19  49.54
2017-09-20  50.29
2017-09-21  50.58
2017-09-22  50.33
2017-09-25  51.85
2017-09-26  51.59
2017-09-27  52.14
2017-09-28  51.62
2017-09-29  51.67
2017-10-02  50.59
2017-10-03  50.44
2017-10-04  50.00
2017-10-05  50.79
2017-10-06  49.34
2017-10-09  49.58
2017-10-10  50.93
2017-10-11  51.30
2017-10-12  50.61
2017-10-13  51.43
2017-10-16  51.86
2017-10-17  51.87
2017-10-18  52.05
2017-10-19  51.29
2017-10-20  51.63
2017-10-23  51.91
2017-10-24  52.32
2017-10-25  51.97
2017-10-26  52.41
2017-10-27  53.92
2017-10-30  54.11

[8039 rows x 1 columns]


えぇ...なにこのデータ量....


ちなみにデータの形をnumpyでも指定できるようです。

mydata = quandl.get("EIA/PET_RWTC_D", returns="numpy")

これはかなり便利ですね....

時系列の指定もできるようです。

mydata = quandl.get("FRED/GDP", start_date="2001-12-31", end_date="2005-12-31")


または並列させることも可能です。

>>> mydata = quandl.get("WIKI/AAPL", rows=5)
>>> mydata
               Open    High     Low   Close      Volume  Ex-Dividend  \
Date                                                                   
2017-11-01  169.870  169.94  165.61  166.89  33100847.0          0.0   
2017-11-02  167.640  168.50  165.28  168.11  32710040.0          0.0   
2017-11-03  174.000  174.26  171.12  172.50  58683826.0          0.0   
2017-11-06  172.365  174.99  171.72  174.25  34242566.0          0.0   
2017-11-07  173.910  175.25  173.60  174.81  23910914.0          0.0   

            Split Ratio  Adj. Open  Adj. High  Adj. Low  Adj. Close  \
Date                                                                  
2017-11-01          1.0    169.870     169.94    165.61      166.89   
2017-11-02          1.0    167.640     168.50    165.28      168.11   
2017-11-03          1.0    174.000     174.26    171.12      172.50   
2017-11-06          1.0    172.365     174.99    171.72      174.25   
2017-11-07          1.0    173.910     175.25    173.60      174.81   

            Adj. Volume  
Date                     
2017-11-01   33100847.0  
2017-11-02   32710040.0  
2017-11-03   58683826.0  
2017-11-06   34242566.0  
2017-11-07   23910914.0  


テーブルで取得したり

mydata = quandl.get_table('ZACKS/FC', ticker='AAPL')

ページ付けの指定もできるようです

data = quandl.get_table('ZACKS/FC', paginate=True)

こんな感じでデータの取得が行われるようです。


ちなみに自分のアカウントを指定しないと、一日でデータを取得する回数は50回までらしいですね。

自分のキー指定は以下の通りらしいです。

quandl.ApiConfig.api_key = "YOUR_KEY_HERE"

こんな感じです。


以上がQuandlの使い方です。

ちょっと長くなっちゃいましたね。


とりあえず今日のところはここらへんにしときましょう。
予測モデルは次回以降に回すとします。(気が向いたらだけど)


途中にも書いたんですけど、最近になってPyTorchがとてもパイソニックにコードを書けるという事実を知って、現在猛勉強中です。

予測モデルに関してはPyTorchのいい練習台として使おうと思います。

クックック....今後のコードは一味違うぜ....


てな感じで今日はお疲れ様です!

では!