90行のPythonで日本株のスクリーナーを作り、無料でインターネットに公開します。
データはBloombergの財務指標と同じ出所 — 監査済みEDINET有報(XBRLパース済み)。リアルタイム株価や市場データはありませんが、有報ベースのROE・売上高・利益率でスクリーニングするにはこれで十分です。
作るもの

- 4,125社以上の日本企業をROE・売上高・セクターでフィルタ
- 任意の財務指標でソート
- 個別企業の5年推移をチャート表示
- Streamlit Cloudにデプロイして共有URL発行
セットアップ
pip install axiora streamlitAxiora APIキーが必要です — 無料、クレカ不要。
スクリーナー:90行
screener.pyを作成:
import os
import streamlit as st
from axiora import Axiora
st.set_page_config(page_title="日本株スクリーナー", layout="wide")
st.title("日本株スクリーナー")
st.caption("データ: 監査済みEDINET有報(XBRLパース) · Powered by Axiora")
api_key = os.environ.get("AXIORA_API_KEY") or st.secrets.get("AXIORA_API_KEY", "")
if not api_key:
st.error("AXIORA_API_KEYを環境変数または.streamlit/secrets.tomlに設定してください")
st.stop()
client = Axiora(api_key=api_key)
# --- サイドバー ---
st.sidebar.header("フィルタ")
sectors = client.sectors.list()
sector_names = ["全セクター"] + [s.sector for s in sectors.data]
sector = st.sidebar.selectbox("セクター", sector_names)
col1, col2 = st.sidebar.columns(2)
roe_min = col1.number_input("最小ROE (%)", value=0.0, step=1.0)
roe_max = col2.number_input("最大ROE (%)", value=100.0, step=1.0)
revenue_min_b = st.sidebar.number_input("最小売上高(億円)", value=0, step=100)
sort_options = {
"ROE(高い順)": "roe_desc",
"ROE(低い順)": "roe_asc",
"売上高(高い順)": "revenue_desc",
"売上高(低い順)": "revenue_asc",
"純利益率(高い順)": "net_margin_desc",
"営業利益率(高い順)": "operating_margin_desc",
}
sort_label = st.sidebar.selectbox("ソート", list(sort_options.keys()))
sort_value = sort_options[sort_label]
limit = st.sidebar.slider("件数", 10, 100, 50)
# --- データ取得 ---
params = {"sort": sort_value, "limit": limit}
if sector != "全セクター":
params["sector"] = sector
if roe_min > 0:
params["roe_min"] = roe_min
if roe_max < 100:
params["roe_max"] = roe_max
if revenue_min_b > 0:
params["revenue_min"] = revenue_min_b * 100_000_000 # 億円→円
with st.spinner("スクリーニング中..."):
results = client.screen.retrieve(**params)
# --- 結果表示 ---
st.subheader(f"{len(results.data)}社がヒット")
if not results.data:
st.info("条件に一致する企業がありません。フィルタを調整してください。")
st.stop()
rows = []
for r in results.data:
rows.append({
"コード": r.company.securities_code or "",
"企業名": r.company.name_jp,
"セクター": r.company.sector or "",
"売上高(億円)": f"¥{r.financials.revenue / 1e8:,.0f}" if r.financials.revenue else "—",
"純利益(億円)": f"¥{r.financials.net_income / 1e8:,.0f}" if r.financials.net_income else "—",
"ROE": f"{r.metrics.roe:.1f}%" if r.metrics.roe else "—",
"ROA": f"{r.metrics.roa:.1f}%" if r.metrics.roa else "—",
"営業利益率": f"{r.metrics.operating_margin:.1f}%" if r.metrics.operating_margin else "—",
})
st.dataframe(rows, use_container_width=True, hide_index=True)
# --- 個別企業の詳細 ---
st.subheader("企業詳細")
codes = [r.company.securities_code for r in results.data if r.company.securities_code]
selected = st.selectbox(
"企業を選択",
codes,
format_func=lambda c: next(
(f"{c} — {r.company.name_jp}" for r in results.data if r.company.securities_code == c),
c
),
)
if selected:
with st.spinner("財務データ読み込み中..."):
financials = client.companies.retrieve_financials(selected, years=5)
if financials.data:
years = [f.fiscal_year for f in reversed(financials.data)]
rev = [f.revenue / 1e8 if f.revenue else 0 for f in reversed(financials.data)]
ni = [f.net_income / 1e8 if f.net_income else 0 for f in reversed(financials.data)]
col1, col2 = st.columns(2)
col1.line_chart({"売上高(億円)": rev})
col2.line_chart({"純利益(億円)": ni})実行
export AXIORA_API_KEY="your-key"
streamlit run screener.pylocalhost:8501で起動。セクターで絞り、ROE閾値を設定し、利益率でソート — 4,125社以上の日本企業をスクリーニングできるアプリがノートPCで動きます。
Streamlit Cloudにデプロイ
GitHubにpushして:
- share.streamlit.ioにアクセス
- リポジトリを接続
- Settings → Secretsに
AXIORA_API_KEYを追加 - デプロイ
共有URLが発行されます。チームやPMに送れます。
requirements.txt:
axiora
streamlit依存関係はこれだけ。
拡張アイデア
- 成長率オーバーレイ:
client.companies.retrieve_growth()でCAGRをスクリーニング結果に追加 - 類似企業:
client.companies.retrieve_peers()で選択企業の同業他社を表示 - 健全性スコア:
client.companies.retrieve_health()で財務健全性指標を追加 - エクスポート: Streamlitの
st.download_buttonで結果をCSVダウンロード
次のステップ
- Pythonで日本の財務データ — SDK基本チュートリアル
- MCP + Claudeで日本の財務データと対話 — UIを飛ばして、自然言語で質問
無料プラン。クレカ不要。APIキーを取得 →