J-Quants APIの紹介
個人的に株式投資を行なっており、その他にも時系列データ分析の学習などの用途でも株価データを頻繁に利用しています。元々、それらのデータをどうやって用意するかが課題で証券会社のページ等々から引っ張ってきていたのですが、この度、日本取引所グループが公式にJ-Quants API という非常に便利なAPIを提供してくれるようになりました。
参考: J-Quants
ベータ版が登場した時から即座に登録して使っていたのですが、この度正式にリリースされましたので使い方とか紹介していこうと思います。
会員登録しないと使えないので、興味のある人は上記のリンクから登録してください。プラン表にある通り、Freeプランもあるので使い勝手を見るには無料で試せます。(Freeプランは12週間遅延のデータなので運用には使いにくいですが、時系列データ分析のサンプルデータ取得等の用途では十分活用できます。)
ちなみに僕はライトプランを使っているでこの記事ではそれを前提とします。(将来的にスタンダード以上のプランに上げるかも。)
肝心の取得できる情報なのですが、東証各市場の上場銘柄の一覧や、株価の四本値、財務情報や投資部門別情報などの情報を取得することができます。物によっては他の手段での収集がかなり手間なものもあり、とても貴重な情報源になると思います。
基本的な使い方
APIは認証周り以外はかなりシンプルな設計になっていて、API仕様にそって、認証情報とパラメーターを指定して規定のURLを叩けばJSONで結果を得られます。
参考: API仕様 J-Quants API
認証だけちょっと珍しい形式をとっていて、以下の手順を踏みます。
- メールアドレスとパスワードを用いてWeb画面かAPIでリフレッシュトークンを取得する。
- リフレッシュトークンを用いて専用APIでIDトークンを取得する。
- IDトークンを用いて、各種情報を取得するAPIを利用する。
ベータ版の初期はリフレッシュトークンの取得がWebでログインしてコピーする以外になかったのでそこもAPI化されたことで大変便利になりました。
なお、リフレッシュトークンの有効期限は1週間、IDトークンの有効期限は24時間です。
Pythonでトークンの取得
ではここからやっていきましょう。実は専用クライアントライブラリ等も開発が進んでるのですが、requests でも十分使っていけるのでrequestsで説明します。
まず、リフレッシュトークンの取得です。
参考: リフレッシュトークン取得(/token/auth_user) – J-Quants API
指定のURLにメールアドレスとパスワードをPOSTし、戻ってきたJSONから取り出します。
import json
import requests
import pandas as pd
# POSTするデータを作る。
email = "{メールアドレス}"
password = "{パスワード}"
account_data = json.dumps({
"mailaddress": email,
"password": password,
})
auth_user_url = "https://api.jquants.com/v1/token/auth_user"
auth_result = requests.post(auth_user_url, data=account_data)
refresh_token = auth_result.json()["refreshToken"]
これでリフレッシュトークンが取得できたので、次は IDトークンを取得します。
参考: IDトークン取得(/token/auth_refresh) – J-Quants API
これはクエリパラメーターでURL内にリフレッシュトークンを指定して使います。(ここは少し設計の意図が不明ですね。何もPOSTしてないのでGETが自然な気がしますが、GETだとエラーになります。)
auth_refresh_url=f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={refresh_token}"
refresh_result = requests.post(auth_refresh_url)
id_token = refresh_result.json()["idToken"]
これでIDトークンも取得できました。
ちなみに両トークンとも1000文字以上の結構長い文字列です。
各種情報の取得
IDトークンが手に入ったらいよいよこれを使って必要な情報を取得します。APIの仕様書はかなりわかりやすいので、あまり迷わずに使えると思います。
たとえば、株価4本値が必要だとしましょう。
参考: 株価四本値(/prices/daily_quotes) – J-Quants API
仕様書にある通り、証券コード(code) や日付(dateもしくはfrom/to)をURLで指定し、ヘッダーにさっきの認証情報をつけて、GETメソッドでAPIを叩きます。
たとえば、トヨタ自動車(7203)の昨年1年間の株価を取得してみましょう。必須ではありませんが、得られたデータはDataFrameに変換しやすい形で帰ってくるのでDataFrameにしました。
import pandas as pd
code = "7203" # 4桁のコードでも5桁のコード72030でもよい。
from_ = "2022-01-01"
to_ = "2022-12-31"
daily_quotes_url = f"https://api.jquants.com/v1/prices/daily_quotes?code={code}&from={from_}&to={to_}"
# idトークンはヘッダーにセットする
headers = {"Authorization": f"Bearer {id_token}"}
daily_quotes_result = requests.get(daily_quotes_url, headers=headers)
# DataFrameにすると使いやすい
daily_quotes_df = pd.DataFrame(daily_quotes_result.json()["daily_quotes"])
取れたデータを表示してみましょう。ブログレイアウトの都合ですが3レコードほどを縦横転置してprintしたのが以下です。
print(daily_quotes_df.head(3).T)
"""
0 1 2
Date 2022-01-04 2022-01-05 2022-01-06
Code 72030 72030 72030
Open 2158.0 2330.0 2284.5
High 2237.5 2341.0 2327.0
Low 2154.5 2259.0 2277.0
Close 2234.5 2292.0 2284.5
Volume 43072600.0 53536300.0 37579600.0
TurnoverValue 94795110250.0 123423876550.0 86533079050.0
AdjustmentFactor 1.0 1.0 1.0
AdjustmentOpen 2158.0 2330.0 2284.5
AdjustmentHigh 2237.5 2341.0 2327.0
AdjustmentLow 2154.5 2259.0 2277.0
AdjustmentClose 2234.5 2292.0 2284.5
AdjustmentVolume 43072600.0 53536300.0 37579600.0
"""
バッチリデータ取れてますね。
もう一つ、例として財務情報も取ってみましょう。
参考: 財務情報(/fins/statements) – J-Quants API
取れる情報の種類がめっちゃ多いので結果は一部絞ってprintしてます。
code = "7203"
statements_url = f"https://api.jquants.com/v1/fins/statements?code={code}"
headers = {"Authorization": f"Bearer {id_token}"}
statements_result = requests.get(statements_url, headers=headers)
statements_df = pd.DataFrame(statements_result.json()["statements"])
# 100列以上取れるので、1レコードを20列だけprint
print(statements_df.head(1).T.head(20))
"""
DisclosedDate 2018-05-09
DisclosedTime 13:25:00
LocalCode 72030
DisclosureNumber 20180312488206
TypeOfDocument FYFinancialStatements_Consolidated_US
TypeOfCurrentPeriod FY
CurrentPeriodStartDate 2017-04-01
CurrentPeriodEndDate 2018-03-31
CurrentFiscalYearStartDate 2017-04-01
CurrentFiscalYearEndDate 2018-03-31
NextFiscalYearStartDate 2018-04-01
NextFiscalYearEndDate 2019-03-31
NetSales 29379510000000
OperatingProfit 2399862000000
OrdinaryProfit
Profit 2493983000000
EarningsPerShare 842.0
DilutedEarningsPerShare 832.78
TotalAssets 50308249000000
Equity 19922076000000
"""
以上が、J-Quants APIの基本的な使い方になります。
クライアントライブラリについての紹介
ここまで、requestsライブラリを使ってAPIを直接叩いてましたが、実はもっと手軽に使える様にするための専用ライブラリの開発も進んでおりすでにリリースされています。
ライブラリも有志の方々が頑張って開発していただけていますが、なにせAPI本体もまだリリースされたばかりですし、まだバグフィックスなどもされている最中の様なので今時点では僕はこちらのライブラリは使っていません。
API本体のアップデートとかも今後多そうですしね。
ただ、将来的にはこちらのライブラリが非常に便利な物になると期待しているので、API/ライブラリ双方の開発が落ち着いてきたら移行したいなと思ってます。