解説 · 手順
API で日本株スクリーナーを作る
要点
- check_circle条件は「業種の中央値より ROE が高く、PBR が低い」のように、業種の分布を基準に決めると業種の違いに左右されにくくなります。
- check_circle/stable/screener は条件をすべて任意で組み合わせ、指定した指標の順に最大 100 件を返します。
- check_circle6 種類の定番条件(/stable/screener-presets)は条件が公開されていて、同じ条件を自分で再現・改造できます。
自分でスクリーナーを作る理由
既製のスクリーナーは画面で条件を選ぶだけで便利ですが、条件の保存や、毎日の自動実行、自分の指標との組み合わせはできないことがあります。
API なら、同じ条件を毎日同じように実行し、結果を CSV や自分のアプリに渡せます。このページでは、ZENITH Code の 4 本のエンドポイントで作ります。
1業種の中央値を見て、条件を決める
まず、対象の業種の中央値と四分位を取得します。例は電気機器(業種コード 3650)です。
curl -sG "https://api.zenithcode.net/stable/industry-benchmarks" \ --data-urlencode "sector=3650" \ -H "x-api-key: YOUR_API_KEY"
- check_circleroeMedian や pbrMedian が、その業種の「真ん中の会社」の値です。比率は 0〜1 の小数(0.08 = 8%)です。
- check_circle第 1 四分位(Q1)と第 3 四分位(Q3)のあいだに、中ほどの半数の会社が入ります。「上位 4 分の 1」を狙うなら Q3 を基準にします。
- check_circle外れ値(倍率が 0 以下、ROE・ROA が 100% 超など)は除いて計算しています。定義は業種別データのページにあります。
2/stable/screener で絞り込む
決めた条件を引数に渡します。例は「電気機器で、ROE 10% 以上・PBR 1.5 倍以下を、ROE の高い順に」です。比率の引数も 0〜1 の小数で渡します。
# Electric Appliances (3650): ROE of 10% or more, PBR of 1.5x or less, sorted by ROE curl -sG "https://api.zenithcode.net/stable/screener" \ --data-urlencode "sector=3650" \ --data-urlencode "roeMoreThan=0.1" \ --data-urlencode "pbrLowerThan=1.5" \ --data-urlencode "isEtf=false" \ --data-urlencode "sortBy=roe" \ --data-urlencode "order=desc" \ --data-urlencode "limit=50" \ -H "x-api-key: YOUR_API_KEY"
| 引数 | 意味 |
|---|---|
| sector | 東証 33 業種コード(例: 3700 = 輸送用機器)。一覧は /stable/available-sectors |
| roeMoreThan | ROE の下限(0〜1 の小数。0.1 = 10%) |
| pbrLowerThan | PBR の上限(倍) |
| perLowerThan | PER の上限(倍) |
| dividendYieldMoreThan | 配当利回りの下限(0〜1 の小数。0.03 = 3%) |
| marketCapMoreThan | 時価総額の下限(円) |
| isEtf | true = ETF・REIT だけ、false = ETF・REIT を除く |
| sortBy | 並べ替えの指標。既定は marketCap(時価総額)。指定できる値(marketCap, per, pbr, psr, roe, roa, dividendYield, evToEbitda, changePct1d, changePct1w, changePct1m, changePctYtd, dividendCagr3y, dividendCagr5y, revenueCagr3y, revenueCagr5y, epsCagr3y, epsCagr5y, progressiveDividendYears) |
| order | 並び順。desc = 大きい順(既定)、asc = 小さい順 |
| limit | 返す件数の上限(既定 50、最大 100) |
引数の説明は API カタログ(/stable/screener)から表示しています。
3定番の条件と比べる
/stable/screener-presets は、よく使われる 6 種類の条件をそのまま実行します。条件が公開されているので、自分の条件との違いを確かめられます。
| preset | 条件(すべて満たすもの) | 並び順 |
|---|---|---|
| high-dividend | 配当利回り 4% 以上 12% 以下、PER が正 | 配当利回りの高い順 |
| value | PER 0 倍超 15 倍以下、PBR 0 倍超 1 倍以下、ROE 5% 以上 | PBR の低い順 |
| high-roe | ROE 15% 以上 100% 以下 | ROE の高い順 |
| growth | 売上高 3 年成長率 10% 以上、EPS 3 年成長率 10% 以上、ROE 8% 以上 100% 以下 | 売上高 3 年成長率の高い順 |
| dividend-growth | 連続非減配(増配または据え置きで、減配していない年数)5 年以上、配当利回り 2% 以上 100% 以下。厳密な連続増配の年数は /stable/dividend-streaks で 1 社ずつ確かめます | 連続非減配年数の長い順 |
| momentum | 1 か月の騰落率 +10% 以上、年初来の騰落率 +20% 以上(株価の条件のため、結果の扱いに注意) | 年初来の騰落率の高い順 |
どの条件も、対象は時価総額 50 億円以上の普通株です。sector を付けると業種で絞り込めます。
curl -sG "https://api.zenithcode.net/stable/screener-presets" \ --data-urlencode "preset=value" \ --data-urlencode "sector=3650" \ --data-urlencode "limit=20" \ -H "x-api-key: YOUR_API_KEY"
4まとめて動かし、表にする
手順 1・2 を 1 本のスクリプトにまとめた例です。業種の中央値をそのまま条件に使い、結果を CSV に保存します。
# pip install requests pandas
import pandas as pd
import requests
API = "https://api.zenithcode.net/stable"
HEADERS = {"x-api-key": "YOUR_API_KEY"}
SECTOR = "3650" # TSE 33-sector code (see /stable/available-sectors)
def get(path, **params):
res = requests.get(API + path, params=params, headers=HEADERS)
res.raise_for_status()
return res.json()
# 1. Sector medians become the thresholds
bench = get("/industry-benchmarks", sector=SECTOR)[0]
roe_min = bench["roeMedian"] # 0-1 decimal
pbr_max = bench["pbrMedian"] # times
print(f"{bench['sectorEn']}: median ROE {roe_min:.1%}, median PBR {pbr_max:.2f}x")
# 2. Companies above the median ROE and below the median PBR
rows = get(
"/screener",
sector=SECTOR,
roeMoreThan=roe_min,
pbrLowerThan=pbr_max,
isEtf="false",
sortBy="roe",
order="desc",
limit=50,
)
# 3. Keep fundamental columns only (no price columns) and save
df = pd.DataFrame(rows)[["symbol", "nameJa", "marketCap", "per", "pbr", "roe", "dividendYield"]]
df["marketCap"] = (df["marketCap"] / 1e8).round(0) # 100M JPY
df["roe"] = (df["roe"] * 100).round(1) # %
df["dividendYield"] = (df["dividendYield"] * 100).round(2)
df.to_csv("screen.csv", index=False)
print(df.to_string(index=False))- 1industry-benchmarks の roeMedian と pbrMedian を、screener の roeMoreThan と pbrLowerThan に渡します。
- 2結果から、証券コード・社名・時価総額・PER・PBR・ROE・配当利回りの列だけを残します。株価の列は使いません。
- 3時価総額は億円、ROE と配当利回りは % に直して CSV に保存します。
5更新のタイミングに合わせて実行する
screener と industry-benchmarks の元データは、平日と土曜の 16:45・19:45(日本時間)に作り直します。毎日動かすなら、その後の時刻に実行すると最新の値で絞り込めます。
注意点
- error業種の中央値が null の場合(有効値が 3 社未満)は、そのまま条件に渡せません。null を確かめてから使ってください。
- error応答には price(直近の終値)と changePctYtd(年初来の騰落率)も入りますが、どちらも取引所データです。表示する表には含めないでください。
- error条件を何も付けないと、並べ替えの指標の大きい順に上位が返ります。limit は最大 100 です。
- errorETF・REIT を除くには isEtf=false を付けます。
結果を他人に見せるとき
絞り込みの結果は、ZENITH Code のデータを加工した結果です。Free・Pro では第三者に見せられず、自社サービスで表示するには Business プラン以上が必要です。株価などの取引所データは、どのプランでも見せられません。 投資アプリ・フィンテックの使い方を見る
投資家・開発者向けの FAQ
条件はどう決めればよいですか?expand_more
業種の中央値や四分位を基準にすると、業種ごとの水準の違いに左右されにくくなります。条件の良し悪しは、ご自身の目的に合わせて判断してください。
株価や騰落率で絞り込めますか?expand_more
並べ替えの指標には騰落率もありますが、株価に関する値は取引所データです。取得には会員登録が必要で、結果を第三者に見せることはできません。
サイトのスクリーナーとの違いは?expand_more
サイトのスクリーナーも同じ /stable/screener を使っています。API なら条件の保存や自動実行、自分のデータとの組み合わせができます。
AI・研究者向けの FAQ
AI にスクリーニングをさせられますか?expand_more
MCP の screen_stocks・run_screener_preset・get_industry_benchmarks を使えば、AI が同じ手順で絞り込めます。比率は 0〜1 の小数で渡すよう指示してください。
定番条件の定義は変わりますか?expand_more
条件はサーバー側の定義表から OpenAPI と MCP の説明を作っています。変わったときは API のドキュメントにも反映されます。
結果の基準日は?expand_more
元データのスナップショットの日付です。/stable/system/freshness で各データセットの基準時刻を確認できます。
免責事項
このページは、日本株データ API の使い方とデータの定義を説明するものです。投資の勧誘や、特定の銘柄の売買の推奨を目的としたものではありません。内容は作成時点の情報で、正確性・完全性を保証しません。投資の判断はご自身の責任で行ってください。
取得したデータを第三者に表示・提供できる範囲は、プランと利用規約 第 8 条で決まります。株価などの取引所データは、どのプランでも第三者に表示できません。 利用規約 第 8 条 · データの出典と利用条件

