J-Quants API でまず最初に触れるエンドポイントが /equities/master です。本記事では、上場銘柄一覧の取得と、市場区分・業種でのフィルタを整理します。
目次
- エンドポイント概要
- レスポンスの主なフィールド
- 取得する
- よく使うフィルタ
- 過去のある日の構成
- ローカルに保存する
エンドポイント概要
| 項目 | 内容 |
|---|---|
| パス | /equities/master |
| メソッド | GET |
| ベース URL | https://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 osimport requestsimport 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 呼び出しを節約できる