金融庁 EDINET は、上場企業の 有価証券報告書 (有報)・四半期報告書・大量保有報告書などを / / XBRL で取得できる 無料 API。同業他社の決算を一括ダウンロードして、自社の利益率や ROE が業界水準と比べてどうかを 半日で可視化 できます。
「業界平均と比べて自社はどう」は経営報告で頻出。ただし証券会社が出す業界レポートは 時差 + 高い。EDINET なら 当日公開された有報を即取得でき、同業 20 社の比較を 数分 で出せます。
API 概要と利用条件
| 項目 | 内容 |
|---|---|
| 料金 | 完全無料 |
| 認証 | API キー必要(無料登録、即日発行) |
| レート制限 | 明示なし(過度なアクセスは控える) |
| 形式 | 書類一覧 JSON、本体は PDF / XBRL / |
| カバー範囲 | 上場企業・大手非上場の有報、四半期、大量保有、内部統制報告書 |
| 過去データ | 2008 年〜(XBRL 対応は 2014 年以降) |
| 更新頻度 | リアルタイム(公開時に反映) |
Step 1: API キー取得
- 1EDINET API の利用申請ページにアクセス
- 2メールアドレス + 利用目的で登録、即時に API キー発行
- 3発行されたキーは `.env` 等で管理、 には commit しない
Step 2: 書類一覧の取得
import osimport requestsfrom datetime import date
API_BASE = "https://api.edinet-fsa.go.jp/api/v2"API_KEY = os.environ["EDINET_API_KEY"]
def list_documents(target_date: date) -> list[dict]: """指定日の書類一覧を取得""" r = requests.get( f"{API_BASE}/documents.json", params={ "date": target_date.isoformat(), "type": 2, # 1=メタ、2=書類本体含む一覧 "Subscription-Key": API_KEY, }, timeout=30, ) r.raise_for_status() return r.json().get("results", [])
# 例: 2027-06-30 の提出書類docs = list_documents(date(2027, 6, 30))print(f"提出件数: {len(docs)}")for d in docs[:5]: print(f" {d['filerName']}: {d['docDescription']}")Step 3: XBRL を取得して財務指標を抜き出す
import zipfile, iofrom arelle import Cntlr # pip install arelle-release
def fetch_xbrl(doc_id: str) -> bytes: r = requests.get( f"{API_BASE}/documents/{doc_id}", params={"type": 1, "Subscription-Key": API_KEY}, timeout=60, ) r.raise_for_status() return r.content
def extract_financials(xbrl_zip: bytes) -> dict: """XBRL から売上高・営業利益・純利益・純資産を抜く(簡易版)""" z = zipfile.ZipFile(io.BytesIO(xbrl_zip)) # 実際は arelle でタクソノミ解析、ここでは概念のみ # InlineXBRL を BeautifulSoup で読むパターンが手っ取り早い return { "revenue": ..., "operating_income": ..., "net_income": ..., "net_assets": ..., }EDINET は CSV 一括ダウンロード機能 も提供しており、各勘定科目を一覧で取れる。「とりあえず数値が欲しい」なら CSV が圧倒的に楽。本格的な勘定科目展開や タクソノミ依存の指標 が必要な場合のみ XBRL に踏み込む。
Step 4: 同業比較の典型コード
import pandas as pd
# 同業 EDINET コード一覧(事前に edinetCode を調べておく)peers = { "E12345": "同業A", "E12346": "同業B", # ...}
rows = []for edinet_code, name in peers.items(): # この企業の最新有報を検索 → financials 抽出 fin = get_latest_annual_report(edinet_code) rows.append({ "company": name, "revenue": fin["revenue"], "op_income": fin["operating_income"], "op_margin": fin["operating_income"] / fin["revenue"], "roe": fin["net_income"] / fin["net_assets"], })
df = pd.DataFrame(rows)print(df.sort_values("op_margin", ascending=False))# → 同業 20 社の営業利益率ランキング業務での使い所
- 経営会議資料: 同業比較・業界平均との乖離を月次で出す
- 競合分析: 売上構成・地域別・セグメント別の動きをトラッキング
- M&A 候補スクリーニング: PER / PBR / ROE 等で条件抽出
- 与信判断: 取引先の財務健全性を最新有報で確認
- IR 資料生成: 自社の数字 + 業界水準の対比で説得力を上げる
落とし穴
3 月決算と 12 月決算が混在するため、単純な「同期間比較」が崩れる。直近4四半期合算 (TTM) で揃えるのが標準。
「売上高」「営業収益」「純売上高」など企業ごとに違う名称。XBRL のタクソノミでは概念で統一されているが、CSV だと手作業の正規化が必要。
次の話
EP.19 では gBizINFO API。EDINET は上場企業中心ですが、gBizINFO は 国内 400 万法人をカバーします。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。