株価の取得方法について調べていて見つけたQuandlというサービスが良さげだったので使ってみた。
Quandl
Quandlは金融、経済などの数値データの検索エンジンで、さまざまなソースから得られたデータを検索し、グラフや表を表示させることができる。またデータはJSON、CSVなどの形式でダウンロードしたり、Plotlyなどのサービスに取り込ませることもできる。
一部有料のデータもあるが多くのデータについては無料で取得することができる。
様々な言語のライブラリも用意されており(https://www.quandl.com/help/libraries )、APIを用いてデータの取得や検索ができるようになっている。
各データを個別に提供しているだけではなく、データをまとめているページがある。
画面左上からData > Data Browser とクリックすると国やデータの種類でまとめられている中から探すことができる。
例えば、以下のようなページがある。
- 日本の人口
- アップルについての数字
- 国別の平均余命
- インターネット普及率
Pythonライブラリのインストール
Quandlのライブラリはpipを使ってインストールすることができる。(Numpyとpandasが必要)
$ pip install Quandl
Pythonライブラリの使い方
Quandlモジュールをインポートし、get関数にQuandl Codeを渡すと、pandasのDataFrameとしてデータを取得することができる。Quandl Codeはデータを検索すると画面の右上の方に表示されている。
>>> import Quandl
>>> df = Quandl.get('GOOG/NASDAQ_GOOG')
>>> df[:5]
Open High Low Close Volume
Date
2004-08-19 49.96 51.98 47.93 50.12 NaN
2004-08-20 50.69 54.49 50.20 54.10 NaN
2004-08-23 55.32 56.68 54.47 54.65 NaN
2004-08-24 55.56 55.74 51.73 52.38 NaN
2004-08-25 52.43 53.95 51.89 52.95 NaN
[5 rows x 5 columns]
トークンの使用
Quandlのアカウントがない場合にはAPIの使用回数は1日に50回までに制限されている。
Quandlにアカウント登録しアカウントページに表示されているトークンを一緒に渡せばAPIを無制限に使うことができる。
>>> df = Quandl.get('GOOG/NASDAQ_GOOG', authtoken='YOUR_AUTH_TOKEN')
複数のデータの同時取得
以下の例のようにQuandl Codeのリストを引数として渡すことで同時に複数のデータを取得することができる。
データ間の比較をしたいときなどには便利。
>>> df = Quandl.get(["WORLDBANK/JPN_IT_NET_USER_P2",
... "WORLDBANK/KOR_IT_NET_USER_P2",
... "WORLDBANK/CHN_IT_NET_USER_P2"])
>>> df.columns = ["Japan", "Korea", "China"]
>>> df[:5]
Japan Korea China
Date
1990-12-31 0.020294 0.023265 0.000000
1991-12-31 0.040438 0.046124 NaN
1992-12-31 0.096678 0.098404 NaN
1993-12-31 0.401278 0.249947 0.000169
1994-12-31 0.799684 0.311359 0.001168
データの検索
search関数を使ってデータを検索することができる。verboseはデフォルトではTrueになっており、Trueの場合上位4件のデータを標準出力へ出力する。
>>> dataset = Quandl.search("Internet User", source="WORLDBANK", verbose=False)
結果の数が多い場合にはページが分割されているので、ページ数を指定して繰り返し実行する必要がある。ページ数が多すぎるとスロットリングに引っかかることがあるので注意。
>>> page = 0
>>> dataset = []
>>> import itertools as it
>>> for page in it.count():
... d = Quandl.search("Internet User", page=page, source="WORLDBANK", verbose=False)
... if not d:
... break
... dataset.extend(d)
基本的にはブラウザで検索するのと同じだが、Quandl Codeをまとめて取得したいときなどはAPIを使うと楽かもしれない。
その他
その他のAPIの詳細についてはドキュメントを参照。
PythonライブラリではサポートされていないオプションなどについてはAPIのドキュメントを参照。urllib2などを使って直接URLを開くことで使うこともできる。