ブログに戻る
tutorial

PythonとStreamlitで日本株スクリーナーを作る

Onkar Dahale

90行のPythonで日本株のスクリーナーを作り、無料でインターネットに公開します。

データはBloombergの財務指標と同じ出所 — 監査済みEDINET有報(XBRLパース済み)。リアルタイム株価や市場データはありませんが、有報ベースのROE・売上高・利益率でスクリーニングするにはこれで十分です。

作るもの

日本株スクリーナー

  • 4,125社以上の日本企業をROE・売上高・セクターでフィルタ
  • 任意の財務指標でソート
  • 個別企業の5年推移をチャート表示
  • Streamlit Cloudにデプロイして共有URL発行

セットアップ

pip install axiora streamlit

Axiora 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.py

localhost:8501で起動。セクターで絞り、ROE閾値を設定し、利益率でソート — 4,125社以上の日本企業をスクリーニングできるアプリがノートPCで動きます。

Streamlit Cloudにデプロイ

GitHubにpushして:

  1. share.streamlit.ioにアクセス
  2. リポジトリを接続
  3. Settings → SecretsにAXIORA_API_KEYを追加
  4. デプロイ

共有URLが発行されます。チームやPMに送れます。

requirements.txt:

axiora
streamlit

依存関係はこれだけ。

拡張アイデア

  • 成長率オーバーレイ: client.companies.retrieve_growth()でCAGRをスクリーニング結果に追加
  • 類似企業: client.companies.retrieve_peers()で選択企業の同業他社を表示
  • 健全性スコア: client.companies.retrieve_health()で財務健全性指標を追加
  • エクスポート: Streamlitのst.download_buttonで結果をCSVダウンロード

次のステップ

無料プラン。クレカ不要。APIキーを取得 →