J-Quants API でまず最初に触れるエンドポイントが /equities/master です。本記事では、上場銘柄一覧の取得と、市場区分・業種でのフィルタを整理します。

目次

  1. エンドポイント概要
  2. レスポンスの主なフィールド
  3. 取得する
  4. よく使うフィルタ
  5. 過去のある日の構成
  6. ローカルに保存する

エンドポイント概要

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

引数なしで呼ぶと、最新の上場銘柄一覧が返ります。code で 1 銘柄に絞ることも、date で過去のある日の構成銘柄を取ることもできます。

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

レスポンスは data キー配下に銘柄情報の配列が入っています。プランによって取得できる列に差があります。

フィールド内容
Code銘柄コード(4 桁または 5 桁)
CoName会社名(日本語)
CoNameEn会社名(英語)
Mkt市場区分コード
MktNm市場区分名(プライム / スタンダード / グロース など)
S17 / S17Nm業種(17 業種)
S33 / S33Nm業種(33 業種)
ScaleCat規模区分(TOPIX 構成区分)

最新のフィールド名は公式ドキュメントを参照します。

取得する

最小のコードは次のとおりです。前提として JQUANTS_API_KEY を環境変数に設定しておきます。

import os
import requests
import pandas as pd
BASE_URL = "https://api.jquants.com/v2"
def fetch_listed_info(headers: dict) -> pd.DataFrame:
"""上場銘柄一覧を DataFrame として取得する。"""
url = f"{BASE_URL}/equities/master"
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
payload = response.json()
return pd.DataFrame(payload["data"])
# API キーは環境変数から読む(ハードコード禁止)
api_key = os.environ["JQUANTS_API_KEY"]
headers = {"x-api-key": api_key}
listed = fetch_listed_info(headers)
print(f"取得件数: {len(listed)}")
print(listed.head())

listed には 4000 件前後の銘柄が並びます(プランや基準日により変動)。

よく使うフィルタ

市場区分で絞る

プライム市場のみに絞る例です。

prime = listed[listed["MktNm"] == "プライム"]
print(f"プライム銘柄数: {len(prime)}")

複数指定するなら isin が便利です。

target_markets = ["プライム", "グロース"]
filtered = listed[listed["MktNm"].isin(target_markets)]
print(f"対象市場の銘柄数: {len(filtered)}")

業種で絞る

17 業種・33 業種のいずれかでフィルタできます。例として情報・通信業に絞ります。

info_comms = listed[listed["S17Nm"] == "情報通信・サービスその他"]
print(f"件数: {len(info_comms)}")
print(info_comms[["Code", "CoName", "MktNm"]].head())

業種名の表記は変わることがあります。事前に listed["S17Nm"].unique() で実際の値を確認するのが安全です。

文字列の部分一致で絞る

会社名から検索したいときは、str.contains を使います。

# "銀行" を含む会社
banks = listed[listed["CoName"].str.contains("銀行", na=False)]
print(banks[["Code", "CoName"]].head())

na=False を渡しておくと、欠損値で例外が出るのを避けられます。

過去のある日の構成

date クエリを渡すと、その日の上場銘柄一覧を取得できます。

def fetch_listed_info_at(headers: dict, date: str) -> pd.DataFrame:
"""指定した基準日の上場銘柄一覧を取得する。"""
url = f"{BASE_URL}/equities/master"
response = requests.get(url, headers=headers, params={"date": date}, timeout=30)
response.raise_for_status()
return pd.DataFrame(response.json()["data"])
snapshot = fetch_listed_info_at(headers, "2024-01-04")
print(f"2024-01-04 時点の銘柄数: {len(snapshot)}")

過去のスナップショットを保存しておくと、後の分析で「上場廃止銘柄」と「新規上場銘柄」を区別できるようになります。

ローカルに保存する

毎回 API を叩くとレート制限を圧迫します。一覧データは更新頻度が低いため、Parquet で保存しておくのが手軽です。

from pathlib import Path
cache_dir = Path("data/jquants")
cache_dir.mkdir(parents=True, exist_ok=True)
listed.to_parquet(cache_dir / "listed_info_latest.parquet", index=False)

キャッシュ戦略は#6-7「取得データのローカル保存とキャッシュ戦略」 で詳しく扱います。

注意点

  • レスポンスのフィールド名は公式の最新を確認する(本記事の例は将来変わる可能性があります)
  • 銘柄コードは文字列(先頭の 0 を保持)として扱う方が安全です
  • 市場再編・上場廃止により、過去日付と現在で銘柄構成が異なります
  • プランによって取得できる列に差があります

生成AI へのプロンプト例

特定条件で銘柄を抽出する関数を生成する例です。

J-Quants API の /equities/master から取得した DataFrame を受け取り、
次の条件で銘柄を抽出する関数 filter_universe(listed, markets, sectors) を書いてください。
引数:
- listed: 上場銘柄の DataFrame
- markets: 市場区分名のリスト(例: ["プライム"])
- sectors: 17 業種名のリスト(空リストなら絞らない)
戻り値: フィルタ後の DataFrame(列順は元のまま)
要件:
- 引数が空のリストならその条件で絞らない
- pandas 2.2 系の API を使う
- docstring を日本語で書く

まとめ

  • /equities/master は上場銘柄一覧の取得エンドポイント
  • 引数なしで最新、code で 1 銘柄、date で過去スナップショット
  • 市場区分・業種・会社名でフィルタするのが定番
  • 更新頻度が低いため、ローカルにキャッシュしておくと API 呼び出しを節約できる