J-Quants API × EDINET DB — 株価と有報データを組み合わせた投資分析ガイド
日本株の投資分析で「財務データはあるけど株価がない」「株価はあるけどBPSやEPSが手元にない」と感じたことはないだろうか。
J-Quants APIとEDINET DBは、それぞれ得意な領域が異なる。両方を組み合わせることで、PBRやPER、配当利回りといったバリュエーション指標を自分の手で算出できる。
J-QuantsとEDINET DBは何が違うか
この2つは競合ではなく補完関係にある。
| J-Quants API | EDINET DB | |
|---|---|---|
| 提供元 | JPX総研(東証グループ) | EDINET DB(金融庁EDINET由来) |
| 主なデータ | 株価(OHLCV)、出来高、指数 | 有報の財務データ(BS/PL/CF/指標73項目) |
| 更新頻度 | 日次(取引日ごと) | 日次(有報提出日ベース) |
| 認証方式 | APIキー(x-api-keyヘッダー) | APIキー(X-API-Keyヘッダー) |
| 利用制限 | 個人私的利用限定 | 商用利用可 |
J-Quantsは「今日の株価はいくらか」に答えるサービス。EDINET DBは「この会社の純資産はいくらか、EPSはいくらか、過去6年の利益推移はどうか」に答えるサービス。PBRを計算するには株価とBPSの両方が必要だが、どちらか一方のAPIだけでは完結しない。
事前準備
J-Quants APIの登録
J-Quants公式サイトからアカウントを作成し、APIキーを発行する。Freeプランでも株価データの取得は可能(データの遅延やリクエスト上限はプランで異なる)。
2024年12月のV2リニューアルで、認証方式がリフレッシュトークン方式からAPIキー方式に変わった。V1時代のコードはそのまま動かないので注意。
EDINET DB APIの登録
EDINET DBでGoogleアカウントでログインすると、APIキーが即時発行される。Freeプランで1日100リクエストまで利用可能。
Python環境
pip install requests
連携パターン1: PBR・PERをリアルタイム算出する
1銘柄のPBRとPERを算出する基本パターン。J-Quantsから終値を取得し、EDINET DBからBPSとEPSを取得して割り算する。
import requests
# --- 設定 ---
JQUANTS_KEY = "your-jquants-api-key"
EDINETDB_KEY = "your-edinetdb-api-key"
SECURITY_CODE = "72030" # トヨタ自動車の証券コード(5桁、末尾0付き)
EDINET_CODE = "E02144" # トヨタ自動車のEDINETコード
# --- J-Quantsから直近の終値を取得 ---
jq_url = "https://api.jquants.com/v2/equities/bars/daily"
jq_resp = requests.get(jq_url, params={
"code": SECURITY_CODE,
"date": "2026-03-14",
}, headers={"x-api-key": JQUANTS_KEY})
jq_data = jq_resp.json()
close_price = jq_data["daily_quotes"][0]["Close"]
print(f"終値: {close_price:,.0f}円")
# --- EDINET DBからBPS・EPSを取得 ---
edb_url = f"https://edinetdb.jp/v1/companies/{EDINET_CODE}/financials"
edb_resp = requests.get(edb_url, params={
"years": 1,
}, headers={
"X-API-Key": EDINETDB_KEY,
})
edb_data = edb_resp.json()
latest = edb_data["data"][-1] # 直近年度(配列は古い順)
bps = latest["bps"]
eps = latest["eps"]
print(f"BPS: {bps:,.1f}円 / EPS: {eps:,.1f}円")
# --- PBR・PERを算出 ---
pbr = close_price / bps
per = close_price / eps if eps and eps > 0 else None
print(f"PBR: {pbr:.2f}倍")
print(f"PER: {per:.1f}倍" if per else "PER: 算出不可")
証券コードとEDINETコードは別物。J-Quantsは東証の証券コード(5桁、末尾0付き)、EDINET DBはEDINETコード(E+5桁)を使う。証券コードからEDINETコードへの変換は、EDINET DBの/v1/searchエンドポイントで証券コード4桁を検索すれば取得できる。
BPS・EPSは有報ベースの年次確定値。 有報が提出されるのは決算日の約3か月後なので、算出したPBR/PERは「直近の確定BPS/EPSに対する倍率」という意味になる。速報値が必要な場合は、EDINET DBのTDNet決算短信データと組み合わせる方法もある。
連携パターン2: 配当利回りを算出する
EDINET DBの財務時系列エンドポイントを使うと、過去数年分のDPS(1株あたり配当金)を取得できる。
# --- EDINET DBからDPSの時系列を取得 ---
fin_url = f"https://edinetdb.jp/v1/companies/{EDINET_CODE}/financials"
fin_resp = requests.get(fin_url, headers={
"X-API-Key": EDINETDB_KEY,
})
financials = fin_resp.json()["data"]
# 直近年度のDPSを取り出す(配列の末尾が最新)
latest_fy = financials[-1]
dps = latest_fy["dividend_per_share"]
fiscal_year = latest_fy["fiscal_year"]
# 配当利回り = DPS / 株価 x 100
if dps and dps > 0 and close_price > 0:
div_yield = (dps / close_price) * 100
print(f"FY{fiscal_year} DPS: {dps:,.1f}円")
print(f"配当利回り: {div_yield:.2f}%")
else:
print("DPSが取得できないか、無配です")
# 配当性向も確認(EDINET DBが算出済み)
payout = latest_fy.get("payout_ratio")
if payout:
print(f"配当性向: {payout * 100:.1f}%")
配当利回りだけ見て高配当と判断するのは危険だ。減益で株価が下がった結果、利回りが高く見えているケースがある。EDINET DBの/v1/companies/{code}/financialsで過去6年分のEPS推移を確認し、利益が安定しているかどうかも合わせて見ることをおすすめする。
連携パターン3: スクリーニングから株価取得まで
EDINET DBのスクリーニング機能で財務条件に合う企業を絞り込み、該当銘柄の株価をJ-Quantsで取得する流れ。
import time
# --- EDINET DBでスクリーニング ---
# ROE 15%以上、自己資本比率 40%以上の企業を取得
screen_url = "https://edinetdb.jp/v1/screener"
screen_resp = requests.get(screen_url, params={
"roe_gte": 15,
"equity_ratio_gte": 40,
"limit": 20,
}, headers={"X-API-Key": EDINETDB_KEY})
companies = screen_resp.json()["data"]["companies"]
print(f"{len(companies)}社がヒット")
# --- 各銘柄の株価とBPSを取得してPBRを算出 ---
for co in companies:
sec_code = co.get("secCode")
edinet_code = co.get("edinetCode")
if not sec_code or not edinet_code:
continue
# J-Quantsは5桁コード(末尾0付き)
code_5 = sec_code if len(sec_code) == 5 else sec_code + "0"
# EDINET DBからBPSを取得
fin_resp = requests.get(
f"https://edinetdb.jp/v1/companies/{edinet_code}/financials",
params={"years": 1},
headers={"X-API-Key": EDINETDB_KEY},
)
bps_val = fin_resp.json()["data"][-1].get("bps", 0) if fin_resp.status_code == 200 else 0
# J-Quantsから株価を取得
jq_resp = requests.get(
"https://api.jquants.com/v2/equities/bars/daily",
params={"code": code_5, "date": "2026-03-14"},
headers={"x-api-key": JQUANTS_KEY},
)
if jq_resp.status_code == 200:
quotes = jq_resp.json().get("daily_quotes", [])
if quotes:
price = quotes[0]["Close"]
pbr = price / bps_val if bps_val > 0 else None
name = co["filerName"]
if pbr:
print(f"{name} | {price:,.0f}円 | PBR {pbr:.2f}倍")
else:
print(f"{name} | {price:,.0f}円")
time.sleep(0.5) # レート制限対策
J-Quantsのレート制限に注意。大量のリクエストを短時間に送ると制限にかかる。ループ内にtime.sleep(0.5)程度のウェイトを入れるのが無難。詳細はJ-Quants公式ドキュメントを確認のこと。
利用規約の注意点
J-Quants APIとEDINET DBでは、利用規約が大きく異なる。
| J-Quants API | EDINET DB | |
|---|---|---|
| 利用目的 | 個人の私的利用に限定 | 商用利用可 |
| データの再配布 | 禁止 | Powered byバッジの表示を推奨 |
| 分析結果の公開 | 分析手法や考察の公開は可。データそのものの掲載は不可 | 制限なし |
| アプリへの組み込み | 不可 | 可(API経由での利用を想定) |
J-Quantsのデータを使ったアプリやサービスを第三者に提供することは利用規約に抵触する。個人で分析スクリプトを書いて自分の投資判断に使う分には問題ない。法人利用やサービスへの組み込みが必要な場合は、JPX総研のJ-Quants Pro(法人向け有償版)を検討してほしい。
まとめ
- J-Quantsは株価(OHLCV)。EDINET DBは有報の財務データ(BPS/EPS/DPS等73項目)
- コード体系が異なる(証券コード5桁 vs EDINETコードE+5桁)ので、変換処理が必要
- BPS/EPSは年次確定値。速報が必要ならTDNet短信データと併用
- J-Quantsは個人私的利用限定。サービスに組み込む場合はJ-Quants Proを検討