【Python金融データ】Tiingoの使い方

投資・ファイナンス

Tiingo API は、米国市場の株式、投資信託、ETF の価格と、中国市場の株式価格をサポートしています。

APIキーの取得

まずは、Tiingoのトップページにアクセスします。
Sign up for a free accountがあるので、そちらをクリックして、登録を行っていきます。
トップページ

ユーザー名やメールアドレスなどを入力し、規約に同意して登録をお子似ます。

入力画面

完了するとメールが届きます。リンクをクリックして認証を完了します。
完了するとログイン状態になります。

APIキーは左側メニューのAPI→Tokenの項目をクリックすると表示される文字列になります。
コードを実行する際に必要になるので、メモしておいてください。
APIキー

価格

個人の場合は、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で確認できます。

タイトルとURLをコピーしました