Daijiro Taira

財務・株式分析ブラウザで動く

財務三表スクリーナー

上場企業を「営業利益率が高くて借金の少ない会社」のような条件で一覧から絞り込めるツールです。

財務三表スクリーナー の操作の様子
実画面を操作して録画。全上場企業の一覧から検索・プリセット絞り込み・企業詳細モーダルの表示を経て、2社を選んで比較モーダルを開くところまでの一連の操作を収録(GIF末尾は企業比較モーダル=KDDIとリクルートホールディングスを指数化した売上高グラフと指標表で比較する画面)。

データはあらかじめEDINET(金融庁の企業開示システム)から集めてこのページ自体に埋め込まれているため、開いた瞬間から動作し、検索や絞り込みのたびにサーバーへ問い合わせることはありません。気になった企業をクリックすれば、売上高や利益率の推移グラフ付きの詳細画面が開き、最大4社まで選んで指標を並べて比較することもできます。

使い方

  1. 開くと全上場企業の一覧が表示される

    開くと全上場企業の一覧が表示される

    「上場企業のみ」トグルON(既定)の状態で母集団3,797社が売上高降順で並ぶ。列は社名・証券コード・基準(会計基準・連結/単体)・業種・最新年度・売上高(億円)・営業利益率・ROE・ROA・自己資本比率など。左サイドバーに検索ボックス・プリセット・業種絞り込み・列フィルタ・比較モード・CSVダウンロードが並ぶ。

  2. プリセットで一発絞り込み

    プリセットで一発絞り込み

    「高収益(営業利益率>15%かつROE>10%)」を押すと、該当421/3,797社に即座に絞り込まれ、対応する列フィルタ欄(営業利益率=15、ROE=10)が自動で埋まる。プリセットは他に「無借金優良(ネットD/E<0かつ自己資本比率>50%)」「キャッシュ創出(FCFマージン>8%かつCF品質>0.8)」「連続増収(3期以上)」の計4種類。

  3. 1社クリックで詳細モーダル

    1社クリックで詳細モーダル

    KDDIをクリックすると開く詳細画面。冒頭に営業利益率・ROE・自己資本比率・FCFマージンのドーナツゲージ4枚、続いて売上高・営業利益・当期純利益・営業CF・FCF・ROEの推移ミニグラフ、下部に売上高・総資産・流動資産・現金・流動負債・有利子負債・純資産・営業/投資/財務CFなど全項目の値の一覧表が並ぶ。値がない項目は「—」表示になり、ホバーすると欠損理由が確認できる。

  4. 比較モードで最大4社を並べる

    比較モードで最大4社を並べる

    「比較モード」をONにすると各行にチェックボックスが出現し、最大4社まで選んで「比較を開く」を押すと比較モーダルが開く。売上高を各社の最古年度=100として指数化した折れ線グラフ(二軸は使わず1本のグラフで比較)と、営業利益率・ROE・ROA・自己資本比率・ネットD/E・FCFマージン・CF品質・売上CAGR3年・増収連続期数を並べた指標表が表示される。

仕組みと使った技術

全体の流れ

  1. 取得: EDINET API v2(https://api.edinet-fsa.go.jp/api/v2/)の書類一覧APIで有価証券報告書(docTypeCode 120・訂正130)を検出し、書類ごとにXBRL/CSV(type=5)をダウンロードする。取込は冪等で、途中で止めても既存のraw/配下は再利用され再取得しない。
  2. 抽出・正規化: CSV/XBRLの要素IDをspec/item_map.yamlの会計基準別タグマッピングに従って標準16項目(売上高・営業利益・総資産・純資産・各種CF等)に正規化する。連結優先、無ければ単体へフォールバックし、採用したbasis(consolidated/non_consolidated)を記録する。訂正報告書がある場合は最新提出分のみを採用し、被訂正分は除外する。
  3. 派生指標の計算: 標準16項目から営業利益率・ROE・ROA・自己資本比率・ネットD/E・FCF・FCFマージン・CF品質・売上/営業利益CAGR3年・増収連続年数を算出する。連結と単体が混在する組み合わせは計算せず、決算期間が330〜400日から外れる年度が計算対象に含まれる場合もNULLにする。派生指標は元の標準項目とは別レコードとして扱い、DELETE→再生成が可能。
  4. 書き出し: companies+metricsから1社1レコードのJSON(企業名・証券コード・業種・基準・最新年度の全項目値・6項目の時系列・欠損理由・決算期間の異常フラグ)を生成し、単一HTMLに埋め込む。ブラウザはこのJSONに対してJavaScriptで検索・数値レンジフィルタ・業種フィルタ・ソート・CSV書き出し・詳細/比較モーダル描画を行うだけで、外部通信は発生しない。

使った技術

Python (pandas, requests, sqlite3)
EDINET APIからの取得・XBRL/CSV抽出・正規化・派生指標計算・SQLite格納の一連のバッチ処理
PyYAML
会計基準別タグマッピング仕様(spec/item_map.yaml)の読み込み
HTML / vanilla JavaScript
単一ファイルのUI。検索・数値レンジフィルタ・業種フィルタ・プリセット・ソート・CSV書き出し・詳細/比較モーダルをすべてクライアント側だけで処理
SVG(自前描画)
詳細モーダルのドーナツゲージ・スパークライン、比較モーダルの指数化折れ線グラフをライブラリなしで描画

実装の工夫

  • EDINET APIキー(Subscription-Key)は例外メッセージ・ログ・URL文字列表現に一切含めないよう、送出前に必ずサニタイズしてから例外化する層(edinet_api.py)を分離している。
  • 標準項目(item_map.yaml定義の16項目)と派生指標(operating_margin・roe等)をmetricsテーブル上で明確に分離し、派生指標だけをDELETE→再生成できるようにすることで、指標の計算式を変更しても生データの再取得なしに全社再計算できる。
  • 欠損は無言の0埋めをせず、missing_reason(basis_mismatch・denominator_zero・period_length_anomaly・insufficient_history・ifrs_operating_income_not_disclosed等)を項目ごとに記録し、UI側では詳細モーダルの「—」表示にホバーすると欠損理由が出る。
  • 銀行業など「流動/固定の区分がない」業種は、jppfs_cor:OrdinaryIncomeBNK要素の有無で機械判定し、流動資産・流動負債・有利子負債を対象外として扱う(financial_industry_scope)。米国基準(US-GAAP)は経常利益等の一部項目を明示的にunsupportedとして除外する。
  • CSV書き出しは先頭文字が =+-@等の値に ' を前置してExcel/Sheetsの数式誤認(CSVインジェクション)を防止している。
  • 比較モーダルの折れ線グラフは各社の売上高を最古年度=100として指数化した単一軸で表示し、絶対額の規模差が大きい企業同士でも成長トレンドを比較できるようにしている(二軸は使わない設計)。

用語

EDINET
金融庁が運営する有価証券報告書等の開示書類の電子開示システム。このツールはEDINET API v2で財務データを取得している。
有価証券報告書
上場企業等が年1回提出する法定開示書類。財務三表(貸借対照表・損益計算書・キャッシュフロー計算書)を含む。訂正版が出た場合はこのツールでは最新提出分を採用する。
XBRL
財務情報を機械可読なタグで表現する開示用データ形式。EDINET提出書類はXBRL形式でも提供され、このツールはそこから項目を抽出している。
基準(連結/単体)
会計基準(JGAAP・IFRS等)と、連結決算か単体決算かの組み合わせ。この2つが揃った値でないと指標を計算しない(連結と単体を混ぜて割り算しない)。
ROE(自己資本利益率)
このツールでは 当期純利益 ÷ 純資産(非支配株主持分込み) の簡便値。厳密な自己資本利益率とは分母が異なる点に注意。
ROA(総資産利益率)
当期純利益 ÷ 総資産。
自己資本比率
純資産 ÷ 総資産の簡便値。
ネットD/E
(有利子負債-現金及び現金同等物) ÷ 純資産。マイナスは実質無借金(現金が有利子負債を上回る)を意味する。
FCF / FCFマージン
FCF(フリーキャッシュフロー)=営業CF+投資CF。FCFマージンはFCF÷売上高。
CF品質
営業CF ÷ 当期純利益。当期純利益がゼロ以下の年はNULL(計算不能)として扱う。
売上CAGR3年
その企業のmetrics上で3期分(暦年ではなく提出順の3つ前)さかのぼった売上高との年平均成長率。決算期変更等で期間が330〜400日から外れる年度が範囲に含まれる場合は算出しない。
増収連続年数
直近年度を含め、遡って何年連続で前年より売上高が増えているかの年数。前年データがない・基準が食い違う場合はリセットして0扱いになる。
母集団
「上場企業のみ」トグルの状態を反映した対象企業数。業種選択や検索・列フィルタでは変わらず、上場/非上場の切り替えでのみ変わる。