CodeLab技術ブログ

プログラミング技術まとめ

PythonでQuandlから金融データを取得する

株価を取得する場合、データをどこから入手するかが問題になります。

よく、Yahooファイナンスからクロールでとってくる手法がネットや書籍で紹介されていますが、本当はNGなんですよね。
というわけで別の方法を探してみました。

quandlすごい

quandlというサイトを使います。
https://www.quandl.com/
一部有料ですが、ほとんどのデータが無料でダウンロードできます。
ダウンロードどころかAPIとか各言語のライブラリまで完備しています。
データの取得方法はこの辺りを見ればわかるかと思います。
https://www.quandl.com/docs/api?csv#authenticating-your-requests
CSVダウンロードならかなり簡単です。英語が読めなくてもなんとなくわかるでしょう。
コードを指定してAPIのURLにアクセスすればCSVでダウンロードできます。
なんだけど、このサイト若干情報が探しにくい。日本の株価の場合は???

アクセスに必要なキーはこちらのDownload all parameters and codes here: のところからDLできます。
https://www.quandl.com/data/TSE-Tokyo-Stock-Exchange/documentation/documentation

TES/(証券コード)という感じでアクセスするようです。
https://www.quandl.com/api/v3/datasets/TSE/(証券コード).csv

アカウント登録

APIキーを付けないと取得制限があるようなのでAPIキーを発行してもらいましょう。
トップページ右上のSIGN INでログインしようとすると、下のほうにアカウント作成のメッセージが出てきます。

アカウントを作れたら、右上の ME->ACCOUNT SETTINGSを選び。左のメニューからAPI KEYを選びREQUEST NEW API KEYボタンを押すと
発行してもらえます。
APIキー付きでダウンロードする場合はこちら
https://www.quandl.com/api/v3/datasets/TSE/(証券コード).csv?api_key=1234567890000

ライブラリ経由での取得

なんと、各言語でデータを取得できるようにライブラリが公開されています。
CSVやXML以外にはjsonやr,python,excelでの取得が可能です。

pythonでちょっと取得の実験をしてみます。
インストールは

$pip3 install quandl

取得方法はこんな感じ

>>> import quandl
>>> quandl.ApiConfig.api_key = '123456789ABCDEFG'
>>> data = quandl.get('TSE/6758')
>>> data [:5]
              Open    High     Low   Close      Volume
Date
2012-08-30   920.0   923.0   898.0   906.0   8525900.0
2012-08-31   897.0   903.0   881.0   881.0  10903400.0
2012-09-03   883.0   894.0   862.0   876.0  10390600.0
2012-09-04   881.0   897.0   871.0   890.0  11639800.0
2012-09-05   880.0   885.0   860.0   863.0   9558400.0

すごく簡単に取得できるうえ、期間を指定するなどほかにも機能がいろいろあるようです。

まぁ、JSONでとれるのであればPHPとかRubyとかほかの言語でも特に困らないとは思います。

ちょっと問題も…

いかがでしょうか?かなり簡単にデータが取得できるすごいサイトだということがお分かりいただけたと思います。

ただ、ちょっと難点があって、サイトの構成がわかりにくく、必要な情報にたどり着くまでにかなり時間がかかります。
まぁ、株価だけならわかったので良いのですが、先物とかほかのデータも持ってこようとすると、どこにあるのかさっぱりわかりません。
また、日足しかなく(日足未満のデータは有料のようです)リアルタイムデータもないので、解析には使えますがこのデータでリアルタイムに取引しようというのはちょっと無理です。

それでもこれだけのデータが無料で使えるのはありがたいですね!

コメントは受け付けていません。