上場企業(4000社くらい)の4年分くらいの株価データを取得するプログラムを書いた話。

目次。

 

blog.sun-ek2.com

 

はじめに。

快楽とお金を稼ぐためにプログラミングをしていた高校時代。そんなときにFX・株の自動売買のプログラム開発を思い立った。学部4年の頃にやっと開発を始め、「英語やばい。英語やばい」ということでまたほったらかし。

blog.sun-ek2.com

 

海外の大学院に出願するために必要なIELTSという試験でOverall 7.0が取れたので、研究と海外大学院への出願準備と並行して、開発を再び始めた。

blog.sun-ek2.com

 

大阪にいたときは深夜1時くらいまで研究室でのさばっていたが、東京に来てから生活が考えられないくらい健康的になった。5時~7時くらいに起床して11時~1時くらいに就寝。朝の時間は、今まで英語(IELTS)の勉強をしていたのだが、IELTSで7.0取れたので、この時間帯を開発の時間に充てている。僕にとってプログラミングは「楽しいもの」なので、株の自動売買のプログラム開発は早起きできたときの自分へのご褒美。

 

株の自動売買のプログラム開発は、色々な理由で何度も中断している。「開発したい」と思ったときにあらゆるもの(英語とか卒論とか研究とか)を犠牲にして、プログラミングに没頭し、犠牲にしたものに支障が出始めて、慌てて開発を止めるという癖が僕にはあって、きっとこれが中断する主な原因。

 

そんなこんなで毎日、早朝の1時間ぐらいを株の自動売買のプログラム開発に充てるのは、健康的にも開発中断を防ぐためにもいいのではないか。

 

 

 

 

巷では(Webスクレイピングの話)。

Webスクレイピングの話をするが、僕はWebスクレイピングとはちょっと違った方法で株価データを取得した(Webスクレイピング亜種?)。どっちにせよ、株価データの自動取得だなんて話が出てくると大体Webスクレイピングという言葉も聞くのでまずはその話。

 

Webページの実体は、htmlファイル。スマホやパソコンに入っているブラウザは、Webサーバにアクセスして、htmlファイルを取ってきて、レンダリングすることによってhtmlファイルから僕らが普段見るようなWebページを作っている。

 

Webスクレイピングは、Webページの実体であるhtmlファイルから情報を抜き取る手法。株価データをスクレイピングするというのは、株価データの情報を提供しているWebページ(証券会社のサイトとか)にアクセスして、htmlファイルを取ってきて、そこから株価だけ抜き取るということ。

 

 

 

 

Webスクレイピングの問題点(動的なWebサイトに対処できない。マウスオーバーイベントとか)。

色々問題点があると思うが、ここでは僕が直面した問題点に絞って話をする。Webスクレイピング系のプログラムは、高校生の頃に書いたことがあるので、最初はその手法で株価データを取得しようと思っていた。

 

僕がターゲットにしていたWebページには、全上場企業の株価チャートが掲載されている。横軸は日付、縦軸は株価。○月△日のデータ点にマウスのカーソルを合わせると「○月△日 始値 ○○円、高値 ××円、…」という感じで具体的な数字が表示される。

 

つまりWebページがブラウザ側で動的に生成されているのである。

言い換えると、このWebページは、サーバから取ってきたhtmlファイルから直接生成されているのではなく、ユーザの動作(マウスのカーソルを合わせる)によってページは動的に変化している。

 

ここで問題が…

Webサーバから取ってこれる情報は、ユーザが何かしらの動作をする前の情報。株価チャートは、ユーザーがマウスのカーソルを合わせないと株価が表示されない。つまり、取ってきたhtmlファイルをいじくりまわしても株価データは得られないのである。また、ユーザーの動作によってページを動的に変化させるのは、ブラウザ上でhtmlファイルに埋め込まれたプログラム(主にJavaScript)が動くことによって達成される。よってページを自作のプログラム上で変化させるためには、JavaScriptのコードを理解して実行できるインタプリタが必要である。

 

1つの解決策は、ヘッドレスブラウザを自作プログラムから操作し、取ってきたhtmlファイル中のJavaScriptをヘッドレスブラウザで実行し、結果を拾ってきて解析する方法。ヘッドレスブラウザは、普通のブラウザみたいに綺麗なWebページを見せてくれないブラウザのこと。つまりGUIのないブラウザ。

 

ちなみに高校の頃にブラウザを操作するプログラムを書いたことがあるが、ヘッドレスブラウザの存在は知らなかった。普通のブラウザを操作していたので、動作がクソ重かった記憶がある。そのとき、ヘッドレスブラウザを知っていれば…。

 

ヘッドレスブラウザを使ってWebスクレイピングやるか…。

と思っていたのだが。

 

 

 

 

株価の生データの源泉を探し出し、直接そこに手を突っ込む。

ヘッドレスブラウザの情報収集をしていた時にふと頭によぎった考え…。

「株価チャートにマウスのカーソルを合わせると株価が表示されるといった具合にWebページが動的に変化しているのであれば、動的に変化されるために必要な情報一式(株価一式、つまり株価の生データ)は予めブラウザ上にあるのではないか。カーソルを合わせるたびにサーバからいちいち株価を取ってくるようなめんどくさいことはやっていないはず」

 

そう、僕が株価データを取ってくるためにやったことはWebスクレイピングではなくて、動的なWebページを生成するのに必要な予めブラウザ上に保存されている株価の生データ一式の源泉探し。

 

 

サーバ、ブラウザ間のhttp通信の監視。

証券会社のwebページにログインする際に使ったとの同じ手法。サーバ、ブラウザ間のhttp通信を監視して、得られたログから株価データの生データが送られた時のhttpリクエストを引きずり出すという手法に戦略変更。

 

Json形式やxml形式のデータをwebブラウザから取ってくるというプログラムも高校の頃に書いたことがある。マウスのカーソルを合わせると株価が表示される、つまりマウスオーバーイベントはJavaScriptで実装されていたので、使っているデータ形式はjson形式だろうという予想の下、json形式のデータを中心に調べていると…。

 

f:id:sun_ek2:20190602073110p:plain

あった!

 

そして、このログから得られたリクエストurlにアクセス(+このサイトに特有の諸々のこと)するプログラムを書いたら無事に上場企業(4000社くらい)の株価データ4年分くらいを取得することができた。

f:id:sun_ek2:20190602073134p:plain

 

 

さいごに。

今回は、ソースコード(プログラムのコード)は載せない。コードの大半は、僕が使っているWebサイトから生データを取ってくるために必要な一般性のない処理が占めている。載せたところであまり意味がないと思った。

 

大半のWebサイトは、Webスクレイピングで株価を取ってくる話をしている。僕のようにhttp通信を監視して、生データの源泉を見つけて、直に手を突っ込むといった話は見当たらなかった。

 

今回、僕が紹介した方法は、一般性があり、応用範囲が広いと思う。魚(ソースコード)はないけど、魚の釣り方(方法論)は紹介したのでお許しを。

 

"Pattern Recognition and Machine Learning"は、3章の途中まで読み終わって放置。研究関連の知り合いに「2章までのベイズ理論を含む数学的な話は読む価値はあるけど、それ以降は別途、より詳しい本を読んだ方がいい」と言われた。うーん。これからどうしようか…。

 

大量の株価データが取得できたので、しばらくはデータ解析をしようと思う。「機械学習がしたい」と言っていたが、開発のプロセスを考えたときに、これはちょっと飛躍しすぎかなと思い始めた。しばらくは先行研究の検証を行う。

 

株価チャートから株の売買タイミングを判断することをテクニカル分析という。これは、色々な投資家の先行研究によって得られた経験則である。「7日でマスター 株チャートがおもしろいくらいわかる本」をとりあえず買ってみたので、この本に載ってある株売買の経験則を検証するプログラムをしばらくは書こうと思う。おそらく経験則で上手くいく部分と上手くいかない部分があって、次の展開として上手くいく部分、いかない部分を独立に抽出して、それらを学習する機械学習のプログラムを書きたいと思う。

ブログランキング・にほんブログ村へ
にほんブログ村