日経平均株価をプログラムから取得する方法
2018/04/07
私は投資家と言う訳ではないのですが、プログラムを組む者として「株価」と言う常に変動し続ける値を使って何かしたい!!と言うのは当然の思考回路です。(ですか?)
ただ、日本の証券会社では「APIを公開する」と言うのは一般的ではないみたいで、たかだか「日経平均」と言うただの指標1個取得する如きにも大変な苦労を強いられます。
と言う訳で、今回は手軽に、アカウント登録などを必要とせず、日経平均をプログラムで処理できる形として取得する方法をいくつかご紹介しましょう。
スポンサーリンク
システムトレード
今の投資の世界は一部の機関投資家などがシステムトレードをしてやがります。(あまり詳しくはないのですが……
すなわち「機械 vs 人間」が勃発している訳ですね。(まぁ、機械は人間が作ったものなので究極の所は「人間vs人間」なのですが……
機械は命令を忠実に、間違える事なく実行し続ける事が可能です、過去データの検索速度はディスクI/Oの速度に比例(人間よりかは遥かに速い
もちろん感情なんて余分な物は持ち合わせていませんし、24時間働かせても労基法には触れません。
これではトラックに生身で勝負を挑んでいるのと同じです。
だったらどうするか、こっちもその「機械」とやらを用意してしまえば良いのです。
とは言え、私はそっちの世界には詳しくないので、とりあえずは「株価」を取得する方法を考えてみます。
スクレイピング
- 手軽さ:サイトによる
- リアルタイム性:サイトによるが、大抵の場合その時のデータは取れる
- 過去データの取得:大抵の場合不可
良くある手法ですね、右も左も猫も杓子も最初に上がるのはこれでしょう。
スクレイピングとは、皆さんが日頃見ているWebサイトをプログラムで取得してきて、その中に書かれてある「株価」を抽出するやり方です。
ただし、この手法にはプログラミングに加えてHTMLの知識が必要です、場合によっては正規表現も出来た方が良いでしょう。
加えて、Webサイトならどこでも良いかと言うとそう言う訳でもなく、中にはJavaScriptを利用して株価を表示する(すなわち、Webサイトのデータそのものに株価が書かれていない)サイトがあります、多分スクレイピング対策でしょう。
もちろん、そういうサイトでもRhinoとかV8とか使えば出来ない訳でもないですが、そう言う事をするならさっさと他を当たった方が良いでしょう。
また、これらのWebサイトは普通、「人間」が見るために用意されたものです。
本来の使い方とは違う使い方をしているのです、良心を以て、節度のある速度で取得しに行きましょう。(だいたい5分に1回くらい、早くて3分に1回、1分に1回だとそこそこ迷惑
過度の高速アクセスは相手方に迷惑を掛けますし、それは巡り巡って自分の不利益になります。
その例がYahoo! Financeでしょう。
その昔はYahoo! Finance(日本)から持って来たデータでそれをするのが当たり前だったみたいですが、今、そう言った目的でのYahoo! Financeの利用は「禁止」です。(ヘルプページに書かれています、有料会員みたいなのだと出来るみたいですが……)
ルールは守りましょうね、ルールの守れない人間は損切ルールも破るでしょうし、どの道勝てないと思いますよ。
きっと、暴走して無限ループに陥ったプログラム、異常な速度でアクセスしてくるプログラム、それらが積もりに積もって無視できない存在になったのでしょう。
(また、機械でアクセスすると言う事は広告を見ないと言う事でもあります、広告はWebサイトの主に対して支払う対価の様な物です、対価も支払わずにサービスだけ受けようってのは本来あってはならない考え方です。)
Javaでスクレイピングをするならjsoupを使うのが使いやすくてオススメですよ。
k-db.comから取得させてもらう
- 手軽さ:簡単、ただし少し工夫が要る
- リアルタイム性:(恐らく)1日遅れ、5分置き
- 過去データの取得:5分足なら4営業日まで、日足なら10年前まで
「株価データサイト k-db.com」と言う恐らく個人の方がご厚意で運営されているだろうと思われるサイトがあります。
ここでは、個別銘柄や各種指標、ストップ高、ストップ安などを非常に細かく、長期間のデータが取得できます。
また、CSV形式でのデータ取得も可能になっており、プログラム処理する事も考えられているみたいです。
さっき持ってきたCSVの中から重要なポイントを抜き出したのが以下のCSVです。(実物をDLしてみてもらった方が分かりやすいでしょう。
日付,時刻,始値,高値,安値,終値
2016-09-05,15:00,17029.27,17037.63,17029.27,17037.63
2016-09-05,14:55,17017.21,17030.30,17009.21,17026.29
2016-09-05,14:50,17026.46,17027.17,17011.61,17011.61
~~~ 略 ~~~
2016-09-05,12:25,,,,
まず、1行目にはどの項目が何の値を示しているかが書かれています。
プログラムで処理するにはこの項目は不要なので、1行目を読み捨てる必要があります。
また、取引のない時間帯は空のデータが入ります。(上の表で言う6行目の部分)
なので、値が空かどうかを判定しないとNullPointerException、いわゆるぬるぽの元になります。
それさえ気を付ければ、後は普通にsplite(",")みたいに切り分けて、数値型に変換して利用できます。
価格の部分にカンマが含まれていないので、例えばJavaであればそのまま
new BigDecimal("取得してきた価格");
と言う処理が出来てとても楽です。
無料で、アカウント登録などもなしにこれだけの事が出来るサイトはここのみと言っても良いでしょう。
先のスクレイピングの項目でも書きましたが、良心を以て、節度を守って利用しましょう。
運営している方のブログを見れば分かると思いますが、現在も転送量の肥大化とサーバへの過負荷、マナーの悪いプログラムに頭を悩ませているみたいです。
またコメント欄を見れば自分勝手な連中による好き勝手な要求が多数見受けられます、無料のサービスに対してああだこうだと要求するのは失礼だと言う事、説明しなくても分かっていますよね。
それらの行き着く先はサービスの終了以外の何物でもないのです、それはすなわち自分の不利益になる訳です、気を付けましょう。(本当はこんな事を書かなくても良いのが理想なのですが、どうやら人間の世界でそれは叶わぬ願いみたいで……
リアルタイム性は恐らく1日遅れです、その日の取引時間が終了してから掲載されているみたいです。(記憶が不確かだが、そうだったはず……)
indexes.nikkei.co.jpから取得させてもらう
- 手軽さ:CSVで取得できるがクセがある
- リアルタイム性:1日置き
- 過去データの取得:日足なら3年前まで
本家本元「日経平均プロフィル」から取得する方法です。
「指数情報」や「指数一覧」を見れば分かると思いますが、各種指標の大まかなデータはCSVとして提供されています。
ただ、データは日足の物しかないので「だいたいの目安」程度にしか使えないかと思われます。
また、CSVにクセがあるのでプログラムで処理する際には要注意です。
転載禁止みたいなので、ダミーのデータに置き換えていますが、主に以下の様になっています。
データ日付,終値,始値,高値,安値
"2013/01/04","10000.00","10000.00","10000.00","10000.00"
~~~ 略 ~~~
"2016/09/05","10000.00","10000.00","10000.00","10000.00"
"ここに著作権が書かれてある"
1行目と5行目は不要なデータです。
価格データですが、「"」で区切られているので、splite(",")で区切る前にreplace()みたいな文字列置換関数を使って「"」を全部消してしまう必要があります。
それさえ出来てしまえば、後は普通に数値データに変換できます。
また、日足だと3年分のデータが含まれており、データが少しだけ大きいです。
普段はあまり使う事はないかと……
Google Financeから取得する
- 手軽さ:CSVっぽいデータで取得できるが色々難しい
- リアルタイム性:日足くらいは取れる?
- 過去データの取得:不明
色々と不明だったのが我らが総本山、天下のGoogleによるGoogleFinanceが提供しているデータです。
URLで色々指定出来るみたいですが、複雑でちょっと良く分からないので説明は他所のサイトに投げましょう。
あんまり使い勝手良くないです、先に紹介したk-db.comを利用した方が楽。
まとめ
私の知り得る情報をいくつか紹介してみましたが、どれも一長一短です。
願いが叶うのであれば各証券会社がAPIを公開してくれる事が一番なのですが、残念ながら無理っぽいでしょう(と言うか、願いが叶うなら金そのもの貰った方が良いか……)
基本的に、リアルタイム性重視ならスクレイピング、データの豊富さを重視ならk-db.comから取得するのが一番かなぁ、と思われます。
株価を取得しただけでは売買を含めた完全なる自動化は不可能ですので、あくまで参考程度にどうぞ。