Tiingo API は、米国市場の株式、投資信託、ETF の価格と、中国市場の株式価格をサポートしています。
APIキーの取得
まずは、Tiingoのトップページにアクセスします。
Sign up for a free accountがあるので、そちらをクリックして、登録を行っていきます。
ユーザー名やメールアドレスなどを入力し、規約に同意して登録をお子似ます。
完了するとメールが届きます。リンクをクリックして認証を完了します。
完了するとログイン状態になります。
APIキーは左側メニューのAPI→Tokenの項目をクリックすると表示される文字列になります。
コードを実行する際に必要になるので、メモしておいてください。
価格
個人の場合は、0円のStarterプランと、$30のPowerプランの2つがあります。
主な違いは、
– 無料の場合、財務データは5年分、有料は15年分以上
– スクリーナーが使える数
– ポートフォリオの登録数
– 無料の場合は、APIでアクセスできる月のuniqueシンボル数が500
– APIの1日、1時間のリクエスト数制限
– 無料の場合は、APIでのニュースやファンダメンタルデータにアクセスできない
といったことになります。
今回はStarterでできる内容を主に紹介していきます。
データの取得方法
それではさっそく、Tiingoを使ってデータを取得してみたいと思います。
以前は以下のようにしてpandas_datareaderでデータ取得ができたようですが、現在はエラーが発生します。公式ドキュメントに従って、requestモジュールなどでデータを取得すれば通常通り取得が可能です。
import os
import pandas_datareader as pdr
# 'GOOG'(Googleの株式)の過去の終値データを取得
df = pdr.get_data_tiingo('GOOG', api_key=api_key)
df
requestsを使う場合。(こちらはデータ取得が可能)
例えば、アップルの2024年1月2日からのデータを取得してみます。
import requests
headers = {
'Content-Type': 'application/json'
}
start_date='2024-01-02'
ticker = 'aapl'
requestResponse = requests.get(f"https://api.tiingo.com/tiingo/daily/{ticker}/prices?startDate={start_date}&token={api_key}", headers=headers)
print(requestResponse.json())
CSV形式で受け取ることもデータによっては可能です。こちらの方が4~5倍ほど高速になるとドキュメントには記載されていました。
import requests
headers = {
'Content-Type': 'application/json'
}
start_date='2024-01-02'
ticker = 'aapl'
requestResponse = requests.get(f"https://api.tiingo.com/tiingo/daily/{ticker}/prices?startDate={start_date}&format=csv&token={api_key}", headers=headers)
df = pd.read_csv(io.StringIO(requestResponse.content.decode('utf-8')))
df
Tickerシンボルについて
Tiingoでデータ取得可能なTickerのルールについて簡単に説明します。
APPLなどの通常のTickerはそのまま使えます。
少し複雑な場合は以下のようなルールとなっているようです。
個別の株式クラスを持つすべてのティッカーは基本的に次の形式に従います。
{シンボル}-{シェアクラス}
たとえば、バークシャー・ハサウェイのクラス A 株は「BRK-A」です。
同様に、優先株式の場合は次の形式を使用できます。
{シンボル}-P-{シェアクラス}
たとえば、Simon Property Group の Preferred J シリーズ株は「SPG-PJ」になります。
投資信託とクローズドエンドファンド (CEF) は、標準的な形式に従います。
投資信託は通常、文字「X」で終わり (例: 「VFINX」)、CEF は文字「X」で始まり、文字「X」で終わります (例: 「XAIFX」)。
利用可能なすべてのTickerの一覧はこちらのzipファイルから取得可能なようです。
zipファイルをPythonで読み込んでデータフレームにするコードは以下になります。
import requests
import zipfile
import io
import pandas as pd
# zipファイルをダウンロードするURL
url = "https://apimedia.tiingo.com/docs/tiingo/daily/supported_tickers.zip"
# zipファイルをダウンロード
response = requests.get(url)
response.raise_for_status() # 有効なレスポンスを受け取ったことを確認
# レスポンスの内容からZipFileオブジェクトを作成
with zipfile.ZipFile(io.BytesIO(response.content)) as z:
# zipファイルの全内容をリスト表示
print(z.namelist())
# 全ファイルを指定したディレクトリに解凍
z.extractall("/path/to/extract")
# zip内の特定のファイルを読み込む場合
with z.open('supported_tickers.csv') as f:
df = pd.read_csv(f)
df
様々なデータにアクセスするための関数の整理
jsonの出力、CSVの出力、JSON出力時にCSVに適切に変換できるようにコードをまとめます。
import requests
import pandas as pd
from io import StringIO
def get_data(url, csv=False, is_df=True, df_name=None):
headers = {
'Content-Type': 'application/json'
}
if csv:
with requests.Session() as s:
download = s.get(url, headers=headers)
decoded_content = download.content.decode('utf-8')
# StringIOを使ってPandasのデータフレームに変換
df = pd.read_csv(StringIO(decoded_content))
return df
else:
r = requests.get(url, headers=headers)
data = r.json()
if is_df:
if df_name and df_name in data:
df_data = data[0][df_name]
else:
# 最も長いリストを持つキーを検索
max_len = 0
df_data = None
if type(data) is list:
for key, value in data[0].items():
if isinstance(value, list) and len(value) > max_len:
max_len = len(value)
df_data = value
if df_data:
df = pd.DataFrame(df_data)
else:
if type(data) is list:
df = pd.DataFrame(data)
else:
df = pd.DataFrame([data])
return df
else:
return data
以下で簡単に説明します。
関数定義
import requests
import pandas as pd
from io import StringIO
def get_data(url, csv=False, is_df=True, df_name=None):
get_data
: データを取得するための関数。url
: データを取得するURL。csv
: URLがCSVファイルを指す場合にTrue。is_df
: データをデータフレームとして返す場合にTrue。df_name
: JSONデータから特定のデータフレームを取得するためのキー名。
ヘッダーの設定
headers = {
'Content-Type': 'application/json'
}
headers
: リクエストのヘッダー情報。ここでは、コンテンツタイプをJSONに設定。
CSVデータの処理
if csv:
with requests.Session() as s:
download = s.get(url, headers=headers)
decoded_content = download.content.decode('utf-8')
# StringIOを使ってPandasのデータフレームに変換
df = pd.read_csv(StringIO(decoded_content))
return df
- CSVファイルを処理する部分。
requests.Session()
: セッションを使ってリクエストを送信。download.content.decode('utf-8')
: ダウンロードしたバイトデータをUTF-8でデコード。pd.read_csv(StringIO(decoded_content))
: デコードした文字列をデータフレームに変換。- 変換したデータフレームを返す。
非CSVデータの処理
else:
r = requests.get(url, headers=headers)
data = r.json()
- 非CSVファイルを処理する部分。
requests.get(url, headers=headers)
: URLからデータを取得。r.json()
: JSONデータに変換。
データフレームへの変換処理
if is_df:
if df_name and df_name in data:
df_data = data[0][df_name]
else:
# 最も長いリストを持つキーを検索
max_len = 0
df_data = None
if type(data) is list:
for key, value in data[0].items():
if isinstance(value, list) and len(value) > max_len:
max_len = len(value)
df_data = value
- データフレームに変換する場合の処理。
df_name
が指定されている場合、そのキーのデータを使用。df_name
が指定されていない場合、最も長いリストを持つキーを探索。
データフレームの生成
if df_data:
df = pd.DataFrame(df_data)
else:
if type(data) is list:
df = pd.DataFrame(data)
else:
df = pd.DataFrame([data])
return df
else:
return data
df_data
が存在する場合、それをデータフレームに変換。df_data
が存在しない場合、data
の型に応じてデータフレームを生成。- データフレームを返すか、
is_df
がFalseの場合は元のデータを返す。
各種データの取得
企業情報
基本的な企業情報を取得できるエンドポイントです。
get_data(f'https://api.tiingo.com/tiingo/daily/{ticker}?token={api_key}')
例えば、次のような出力が得られます。
{'ticker': 'AAPL',
'name': 'Apple Inc',
'description': "Apple Inc. (Apple) designs, manufactures and markets mobile communication and media devices, personal computers, and portable digital music players, and a variety of related software, services, peripherals, networking solutions, and third-party digital content and applications. The Company's products and services include iPhone, iPad, Mac, iPod, Apple TV, a portfolio of consumer and professional software applications, the iOS and OS X operating systems, iCloud, and a variety of accessory, service and support offerings. The Company also delivers digital content and applications through the iTunes Store, App StoreSM, iBookstoreSM, and Mac App Store. The Company distributes its products worldwide through its retail stores, online stores, and direct sales force, as well as through third-party cellular network carriers, wholesalers, retailers, and value-added resellers. In February 2012, the Company acquired app-search engine Chomp.",
'startDate': '1980-12-12',
'endDate': '2024-06-17',
'exchangeCode': 'NASDAQ'}
ニュースデータ
無料のプランでは使用できませんが、有料プランであれば、ニュースデータを取得可能です。
get_data(f'https://api.tiingo.com/tiingo/news?token={api_key}')
仮想通貨データ
仮想通貨の価格データも取得可能です。
リアルタイムデータもある程度取得できます。
get_data(f'https://api.tiingo.com/tiingo/crypto/prices?tickers=btcusd&token={api_key}')
Ticker情報
get_data(f'https://api.tiingo.com/tiingo/crypto?tickers=curebtc&token={api_key}',is_df=False)
為替データ
ベータ版のようですが、為替データも取得可能です。
get_data(f'https://api.tiingo.com/tiingo/fx/prices?tickers=audusd,eurusd&token={api_key}')
TOPデータのみ
get_data(f'https://api.tiingo.com/tiingo/fx/top?tickers=audusd,eurusd&token={api_key}')
ティックデータ
株価のティックデータなども取得できるようです。
直近値
get_data(f'https://api.tiingo.com/iex/?tickers=aapl,spy&token={api_key}')
ヒストリカルデータ(5分間隔の価格データの例)
get_data(f'https://api.tiingo.com/iex/aapl/prices?startDate=2024-01-02&resampleFreq=5min&columns=open,high,low,close,volume&token={api_key}')
財務データ
無料のAPIではDow30の銘柄のみ取得できるようです。
日次(更新がなければ日々同じ値)
get_data(f"https://api.tiingo.com/tiingo/fundamentals/aapl/daily?token={api_key}")
今回のコードはこちらのGoogleColabで確認できます。