決算書データを使うファンダメンタルズ分析の入り口が /fins/summary です。本記事では、財務情報の取得とよく使うカラムの読み方を整理します。

目次

  1. エンドポイント概要
  2. レスポンスの主なフィールド
  3. 取得する
  4. 数値型に変換する
  5. 通期決算だけを抽出する
  6. 業績予想の修正履歴
  7. 指標を計算する
  8. 株価データとの結合

エンドポイント概要

項目内容
パス/fins/summary
メソッドGET
ベース URLhttps://api.jquants.com/v2
認証x-api-key: <API キー>
主なクエリcode(銘柄コード)、date(発表日)

クエリの組み合わせは次のとおりです。

組み合わせ取得内容
code のみ指定銘柄の発表済み決算データ(複数期分)
date のみ指定日に発表された全銘柄の決算データ
code + date指定銘柄の指定日のデータ

date発表日(開示日) であり、決算期末日ではない点に注意します。

レスポンスの主なフィールド

決算データのフィールドは多く、種類別の違いも大きいです。代表的なものを整理します。

フィールド内容
Code銘柄コード
DiscDate開示日
DiscTime開示時刻
CurPerType当期種別(1Q / 2Q / 3Q / FY)
CurPerSt / CurPerEn当期の期間
CurFYSt / CurFYEn通期の期間
Sales売上高
OP営業利益
OdP経常利益
NP当期純利益
EPS1 株あたり純利益(EPS)
TA / Eq総資産 / 純資産
FSales / FOP通期予想

DocType で「決算短信」「業績予想修正」「配当予想修正」などの種類が判別できます。

取得する

単一銘柄の決算履歴を取得する例です。

import os
import requests
import pandas as pd
BASE_URL = "https://api.jquants.com/v2"
def fetch_statements(headers: dict, code: str | None = None, date: str | None = None) -> pd.DataFrame:
"""財務情報を取得する。code または date のいずれかを指定する。"""
url = f"{BASE_URL}/fins/summary"
params: dict[str, str] = {}
if code:
params["code"] = code
if date:
params["date"] = date
rows = []
pagination_key: str | None = None
while True:
if pagination_key:
params["pagination_key"] = pagination_key
response = requests.get(url, headers=headers, params=params, timeout=30)
response.raise_for_status()
payload = response.json()
rows.extend(payload.get("data", []))
pagination_key = payload.get("pagination_key")
if not pagination_key:
break
return pd.DataFrame(rows)
# API キーは環境変数から読む(ハードコード禁止)
headers = {"x-api-key": os.environ["JQUANTS_API_KEY"]}
fins = fetch_statements(headers, code="7203")
print(f"件数: {len(fins)}")
print(fins.columns.tolist()[:10]) # 列名は数十あるため一部だけ表示

戻り値の DataFrame は列が多いので、必要な列だけ抜き出して扱うのが現実的です。

数値型に変換する

レスポンスは多くの列が 文字列 として返ります。数値として扱うには明示的な変換が必要です。空文字や "-" が混入することもあるので、errors="coerce" で NaN に倒すのが安全です。

numeric_cols = [
"Sales", "OP", "OdP", "NP",
"EPS", "TA", "Eq",
]
for col in numeric_cols:
if col in fins.columns:
fins[col] = pd.to_numeric(fins[col], errors="coerce")
# 開示日は datetime に
fins["DiscDate"] = pd.to_datetime(fins["DiscDate"])

通期決算だけを抽出する

四半期データと通期データが混在しているため、用途に応じて絞り込みます。通期(FY)だけにしぼる例です。

fy = fins[fins["CurPerType"] == "FY"].copy()
fy = fy.sort_values("DiscDate")
print(fy[["DiscDate", "CurPerType", "Sales", "NP", "EPS"]])

四半期ごとに比較したい場合は、CurPerType ごとに同じ四半期を縦に並べて差分を取る、といった処理が定番です。

業績予想の修正履歴

DocType で文書種別を判別すると、業績予想の修正の履歴を抽出できます。

guidance_revisions = fins[fins["DocType"].astype(str).str.contains("ForecastRevision", na=False)]
print(guidance_revisions[["DiscDate", "DocType", "FSales", "FOP"]])

文字列の表記は API の仕様変更で変わる可能性があります。実際の値は fins["DocType"].unique() で確認します。

指標を計算する

取得したデータから、よく使う指標を計算する例です。

# 指定したスナップショット行で ROE を計算
def compute_roe(row: pd.Series) -> float:
profit = row.get("NP")
equity = row.get("Eq")
if pd.isna(profit) or pd.isna(equity) or equity == 0:
return float("nan")
return profit / equity
fy["ROE"] = fy.apply(compute_roe, axis=1)
print(fy[["DiscDate", "NP", "Eq", "ROE"]])

PER のように 株価が必要な指標 は、/equities/bars/daily(#6-5「日次株価四本値を取得する (/equities/bars/daily)」)のデータと結合します。決算開示の 直前営業日の株価 を用いるか、翌営業日の始値 を用いるかは目的に合わせます。

注意点

  • 数値は文字列で返るため、明示的に pd.to_numeric で変換する
  • 通期(FY)と四半期(1Q3Q)の混在に注意。集計前にフィルタする
  • 業績予想の修正がある場合、後の開示が直近の予想を表す
  • 連結 / 単体・IFRS / 日本基準で列の意味が変わる場合があります
  • 過去にさかのぼった指標を計算するときは、開示日基準の時点合わせ(point-in-time)を意識します(将来情報の混入を避ける)

株価データとの結合

PER を計算する流れの一例です。日付の取り扱いには注意します。

# 仮: prices は前掲の wide_df(行=Date、列=Code、値=AdjC)
# 各 FY 開示について、開示日の前営業日の終値を取って PER を出す
per_rows = []
for _, r in fy.iterrows():
disc = r["DiscDate"]
eps = r.get("EPS")
if pd.isna(eps) or eps == 0:
continue
# 前営業日の値(無ければ直前の値)
prior_close = prices.loc[:disc - pd.Timedelta(days=1), "7203"].dropna()
if prior_close.empty:
continue
last_close = prior_close.iloc[-1]
per_rows.append({"DiscDate": disc, "C": last_close, "EPS": eps, "PER": last_close / eps})
per_df = pd.DataFrame(per_rows)
print(per_df)

EPS は通期実績ベースか、会社予想ベースかで意味が変わります。混同しないように、計算時に どの EPS を使ったか を明示しておくと、後で見返したときに混乱しにくくなります。

生成AI へのプロンプト例

通期決算を整形して時系列にする関数の例です。

J-Quants API の /fins/summary から取得した DataFrame を受け取り、
次の処理を行う関数 build_fy_history(statements) を書いてください。
要件:
- CurPerType が "FY" の行だけ抽出
- DiscDate を datetime に変換し昇順ソート
- Sales / OP / NP / EPS / Eq / TA を数値型に変換
- 戻り値は DiscDate / FiscalYearEnd / Sales / OP / NP / EPS / Eq / ROE 列のみ
- pandas 2.2 系の API を使う
- docstring を日本語で書く

まとめ

  • /fins/summary は決算データの取得エンドポイント
  • レスポンスは列が多く、数値は文字列で返るため変換が必要
  • 通期と四半期の混在、業績予想の修正履歴に注意
  • 株価指標(PER 等)を計算するときは、/equities/bars/daily と日付ベースで結合する
  • 過去にさかのぼった分析では、開示日基準のタイムスタンプを必ず意識する