Alpha Vantageとは?
Alpha Vantageでは、株や為替の価格データを取得できます。ただし、データの取得には登録が必要となり、その際に取得できるAPIキーが必要になります。
過去データだけではなく、リアルタイムに近いデータもプランによっては取得可能です。
個別銘柄の財務諸表データを無料である程度取得できるのでおすすめです。
データの取得はAPI、エクセル、スプレッドシートなどいくつかの方法で可能ですが、今回は、PythonでAPIを使った取得方法を紹介します。
かなり様々なデータを取得でき、説明することがたくさんあるので、3回に分けて説明していきます。
1. pandas_datareaderを使ったデータ取得など基本的な取得方法
2. データダウンロードを簡単にするための関数作成
3. 様々なデータのダウンロード
という形で説明していきます。
全体のコードはこちらのGoogleColabに載せています。
APIキーの取得
まずは以下のURLにアクセスをしてAPIキーを取得します。
https://www.alphavantage.co/support/#api-key
無料枠で十分ダウンロードできるので、基本的には無料枠の利用で問題ないと思います。
利用者タイプ、組織、Emailなどを入力します。
入力後APIキーが画面に表示されるので必ずメモしておきましょう。
APIのドキュメントについてはこちらにあります。
https://www.alphavantage.co/documentation/
pandas_datareaderによるデータ取得
pandas_datareaderという様々なデータソースのデータを簡単に取得できるライブラリを使用すれば、AlphaVantageのデータも簡単に取得できます。
株価データの取得
例えば、Googleの日次株価データであれば、次のようにして取得できます。
from datetime import datetime
import pandas_datareader.data as web
df = web.DataReader("GOOGL", "av-daily",api_key=api_key)
“av-daily”の部分は以下のパターンが指定可能です。
– av-intraday- 日中時系列
– av-daily- 日次時系列
– av-daily-adjusted- 日次時系列(調整済み)
– av-weekly- 週次時系列
– av-weekly-adjusted- 週次時系列(調整済み)
– av-monthly- 月次時系列
– av-monthly-adjusted- 月次時系列(調整済み)
– av-forex-daily- 日次時系列(為替)
例えば、日中の場合、以下のように1分間のデータが取得可能になります。
web.DataReader("GOOGL", "av-intraday",api_key=api_key)
為替データの取得
為替の場合は、次のようになります。
df_fx = web.DataReader("USD/JPY", "av-forex-daily",api_key=api_key)
df_fx
ヒストリカルデータではなく、直近の値だけでよい場合は、次のようにも書けます。
web.DataReader(["USD/JPY", "EUR/JPY"], "av-forex",api_key=api_key)
pandas_datareaderを使わない場合
pandas_datareaderを使わない場合にはrequestsを使用して、データの取得が可能です。
pandas_datareaderでは価格データなどしか取得できませんが、自分でAPIを使ってコードを書けば、ファンダメンタルデータや経済データ、仮想通貨やコモディティーなどかなり幅広いデータを取得できるようになります。
今回は、最初に取得したGoogleの日次株価と同じデータを取得したいと思います。
#pandas_datareaderを使わない場合
import requests
import pandas as pd
# 株価データを取得したい銘柄のティッカーシンボルを変数tickerに保存します。
ticker = "GOOGL"
# Alpha VantageのAPIで使用する関数名を変数keywordに保存します。
# ここでは日次の調整済み株価データを取得する関数であるTIME_SERIES_DAILY_ADJUSTEDを指定しています。
keyword = "TIME_SERIES_DAILY"
# Alpha VantageのAPIエンドポイントのURLを作成します。
# ここでは指定した関数、ティッカーシンボル、APIキーをURLのクエリパラメータに指定しています。
url = f"https://www.alphavantage.co/query?function={keyword}&symbol={ticker}&apikey={api_key}"
# requestsライブラリのget関数を使ってAlpha VantageのAPIからデータを取得します。
# 結果はresponseオブジェクトに保存されます。
response = requests.get(url)
# responseオブジェクトのjsonメソッドを使ってレスポンスデータをJSON形式で取得します。
# その後、株価データが格納されている"Time Series (Daily)"部分を取り出して変数stock_dataに保存します。
stock_data = response.json()["Time Series (Daily)"]
# pandasのDataFrameのfrom_dictメソッドを使って、stock_dataをDataFrame形式に変換します。
# orientパラメータに"index"を指定して、ディクショナリのキーをDataFrameのインデックスとして扱うようにします。
# また、dtypeパラメータにfloatを指定して、数値データを浮動小数点数として扱うようにします。結果は変数df_dailyに保存されます。
df_daily = pd.DataFrame.from_dict(stock_data, orient="index", dtype=float)
Tickerの調べ方
上記のようなコードで、株価のヒストリーデータを得られますが、ほしい銘柄のTickerどのように取得すればいいのでしょうか。こちらもAPIを使って可能になっています。
例えば、「トヨタ」を検索してみましょう。
import requests
key_word='toyota'
url = f'https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords={key_word}&apikey={api_key}'
r = requests.get(url)
data = r.json()
すると、以下のように表示されました。
{'bestMatches': [{'1. symbol': 'SCT.LIS',
'2. name': 'Toyota Caetano',
'3. type': 'Equity',
'4. region': 'Lisbon',
'5. marketOpen': '08:00',
'6. marketClose': '16:30',
'7. timezone': 'UTC+00',
'8. currency': 'EUR',
'9. matchScore': '0.6000'},
{'1. symbol': 'TDBOY',
'2. name': 'Toyota Boshoku Corporation',
'3. type': 'Equity',
'4. region': 'United States',
'5. marketOpen': '09:30',
'6. marketClose': '16:00',
'7. timezone': 'UTC-04',
'8. currency': 'USD',
'9. matchScore': '0.5455'},
{'1. symbol': 'TYT.LON',
'2. name': 'Toyota Motor Corp',
'3. type': 'Equity',
'4. region': 'United Kingdom',
'5. marketOpen': '08:00',
'6. marketClose': '16:30',
'7. timezone': 'UTC+01',
'8. currency': 'JPY',
'9. matchScore': '0.5455'},
...
]}
ここで対象にしたい銘柄のsymbolを使うことができます。
市場がOpenかCloseか取得する
主要な市場がOpenかCloseかを以下のエンドポイント(url)で取得できます。
import requests
url = f'https://www.alphavantage.co/query?function=MARKET_STATUS&apikey={api_key}'
r = requests.get(url)
data = r.json()
data
例えば、次のような結果が返ってきます。
{
"endpoint": "Global Market Open & Close Status",
"markets": [
{
"market_type": "Equity",
"region": "United States",
"primary_exchanges": "NASDAQ, NYSE, AMEX, BATS",
"local_open": "09:30",
"local_close": "16:15",
"current_status": "closed",
"notes": ""
},
{
"market_type": "Equity",
"region": "Canada",
"primary_exchanges": "Toronto, Toronto Ventures",
"local_open": "09:30",
"local_close": "16:00",
"current_status": "closed",
"notes": ""
},
...
]}