【Python金融データ】AlphaVantageの使い方(第1回)

投資・ファイナンス

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キー取得

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": ""
        },
        ...
]}
タイトルとURLをコピーしました