マーケットデータの取得元としてこれまでYahoo Financeを軸に、それを補う目的でstooq、Alpha Vantageなどを活用してきました。最近になってInvesting.comにたどり着き、その使い勝手の良さに驚くばかりです。もちろん使用料金は無料。すごい世の中になりました。
どのAPIにも長所・短所がありますし、目的などによって好みの別れるところだと思いますが、カバレッジの充実さでInvesting.comが群を抜いているようです。私の視点で各APIを評価したあと、Investing.comからのデータ取得について簡単にご紹介します。
各API(無料)の特徴
まずは無料APIのカバレッジや特徴について、私の勝手な評価をしてみました。
無料のAPIを使わせてもらっているので大きなことは言えませんが、市場分析で正確性とカバレッジの広さは重要です。この二点でInvesting.comは他APIを圧倒しているのではないかと思います。Indexは約8000、個別銘柄は約4万、債券は多様な年限構成、Currencyは約140の通貨が用意されています。
発表を中止した系列やそもそも取引のない通貨ペアなどもありますので、データの有無を調べてから使用した方が良いでしょう。また膨大なデータベースなので、探したいデータの見つけ方も手間取る可能性があるので、私の方法をご紹介しようと思います。と言っても特別なことをしているわけではありません。
データの探しかた
S&P500をターゲットにします。まずはパッケージをインストールしましょう。
$ pip install investpy
インストールが終了したら、Indexに用意されている指数の全体像をみてみましょう。investing.comには個別株や債券など全部で12個のデータが用意されています。
import pandas as pd
import investpy as iv
df = iv.indices.get_indices(country=None)
df
実行すると7800行*6列のデータを取り出せたことがわかります。
7800行の中から欲しいインデックスをカラム列にstr.contains()メソッドを当てながら地道に絞り込んで行きます。ターゲットはS&P500です。キーワードがうまくヒットすれば良いのですが、まずはcurrencyにUSDを当ててみます。
import pandas as pd
import investpy as iv
df = iv.indices.get_indices(country=None)
df = df[(df['currency'].str.contains('USD'))]
df
データは7800から3197へ削減できましたが、まだまだ絞り込む必要があります。
country は小文字から始まるため"united states"を、classには恐らく"indices"が含まれると考え、以下の条件を追加し実行しました。
import pandas as pd
import investpy as iv
df = iv.indices.get_indices(country=None)
df = df[(df['currency'].str.contains('USD'))&
(df['country'].str.contains('united states'))&
(df['class'].str.contains('indices'))]
df
データ数は3197から1279へさらに減りました。full_nameで使われる言葉は"S&P"で、"NASDAQ"や"Dow"は使われていないはずなので、さらに条件を追加します。
import pandas as pd
import investpy as iv
df = iv.indices.get_indices(country=None)
df = df[(df['currency'].str.contains('USD'))&
(df['country'].str.contains('united states'))&
(df['class'].str.contains('indices'))&
(~df['full_name'].str.contains('NASDAQ'))&
(~df['full_name'].str.contains('Dow'))&
(df['full_name'].str.contains('S&P'))
]
df
ようやくS&P500に出会えました。
今回はお目当てがたまたまデータフレームのトップに出てきましたが、もし上下5番以内に入っていなかったらまだ絞り込む必要があります。ただ100件程度まで絞り込めているのであれば、目視で確認しても良いでしょう。その際には
pd.set_option('display.max_rows', 100)
と書いて検索結果を全てを表示させましょう。上の例では100件を全て表示させています。
ダウンロード
ダウンロード関数は以下です。
investpy.indices.get_index_historical_data(index, country, from_date, to_date, as_json=False, order='ascending', interval='Daily')
*「as_json=False, order='ascending', interval='Daily'」は省略可能
パラメータ入力の際は以下を注意してください。なお「as_json・・・'Daily'」は省略可能です。個別株のライブラリでは"symbol"というカラムを代入するので少し注意が必要です。
- indexにはnameを代入(他のAPIではname以外の列名を入力する時があります)
- country は小文字から
- 日付はDD/MM/YYYY
S&P500の最古データを確認するために適当にスタート時期を1980年してみました。
index = 'S&P 500'
country = 'united states'
start = '20/11/1980'
end = '31/12/2021'
df1=iv.indices.get_index_historical_data(index,country,start,end)
df1
S&P500の一番古いデータは2006年でした。同様にダウ指数は1979年12月25日から4本値が用意されています!米国10年国債利回りは1980年1月2日から、ドル円は1988年3月4日から、それぞれデータが用意されています。驚きです!ヒストリカルデータを見るには十分な期間でしょう。
なおInvesting.comにはindex以外に12のAPIが用意されています。リファレンスがあるので詳しくはこちらもご覧ください。