【EDINET/XBRL】決算発表をスクレイピング!Pythonで企業の財務状況を自動スコア化する方法

  • URLをコピーしました!

「数千社ある上場企業の決算をすべてチェックしたいけれど、PDFを1枚ずつ読む時間がない」と悩んだことはありませんか?

投資銘柄を絞り込む際、決算短信や有価証券報告書の中身を確認する作業は欠かせませんが、手作業ではどうしても物理的な限界があります。

そんな課題を解決してくれるのが、金融庁の電子開示システム「EDINET」が提供しているAPIと、プログラミング言語のPythonです。これらを活用すれば、決算書類の中にある売上や利益、自己資本比率といった数値を自動で抜き出し、独自の基準で企業を採点することが可能になります。この記事では、プログラミング初心者の方でも今日から実践できる、決算データの自動取得とスコアリングの手順を丁寧に解説します。

目次

なぜ決算データの取得を自動化すべき?

投資の成績を左右するのは、情報の「精度」と「速度」です。しかし、人間が1日に読み込めるPDFの数には限りがあり、どうしても有名な銘柄や自分が知っている企業だけに注意が偏りがちになります。Pythonを使ってデータの収集を自動化すれば、こうした心理的なバイアスを排除し、すべての企業を同じ物差しで、しかも一瞬で比較できるようになります。

まずは、手作業と自動化でどれほどの差が出るのかを整理しましょう。以下の比較表を見ると、自動化がもたらす圧倒的な効率化がわかります。

項目手作業(PDF閲覧)自動化(Python/API)
確認スピード1社あたり数分〜数十分1社あたり数秒以内
比較の容易さ記憶やメモに頼る必要がある全社を一覧表で並べ替え可能
計算ミス手入力によるミスが起きるプログラムにより常に正確
銘柄の網羅性有名銘柄に偏りやすい全上場企業を一括スキャン可能

PDFを1枚ずつ読む手間をなくせる

決算書類は、文字がびっしりと詰まったPDF形式で公開されるのが一般的です。

そこから「営業利益」や「自己資本比率」といった特定の数字を探し出すのは、慣れていても骨の折れる作業です。

自動化を導入すれば、プログラムが書類の中から必要な項目だけをピンポイントで拾い上げてくれます。

「数字を探す」という単純作業から解放されることで、投資家本来の仕事である「投資判断」に集中できる時間を確保できるようになります。

もちろん、文章の行間を読むことも大切ですが、まずは数値で足切りを行うことで、読むべき書類を100枚から3枚に絞り込めるようになります。

独自の基準で全上場企業を横断的に比較できる

「ROEが10%以上で、なおかつ自己資本比率が50%以上の企業」といった自分なりの条件に合う企業を、全上場企業の中から一瞬で見つけ出せるのは自動化ならではの強みです。

証券会社のスクリーニングツールも便利ですが、自分だけの計算式や、複数の年度をまたいだ変化率などを自由自在に組み込める点は、自作ツールにしかできない特権です。

特定の業種に絞った比較も容易になります。

例えば、製造業の中でも特に収益性が高い企業だけを抜き出し、ランキング形式で表示させるといった分析も数秒で終わります。

自分の投資哲学をコードという形で具体化することで、感情に左右されない一貫した銘柄選定ができるようになります。

決算発表後の「初動」に素早く対応できる

決算シーズンになると、毎日数百社の企業が同時に発表を行います。

この情報の波に飲まれて、本当にお宝銘柄を見逃してしまった経験はないでしょうか。

プログラムを走らせておけば、発表直後にデータを取得し、瞬時にスコアリングを行うことができます。

市場がその企業の良さに気づく前に、いち早く候補リストに載せることが可能になります。

情報の解像度を上げ、スピードを最大化することが、厳しい相場環境で生き残るための武器になります。

共通言語:EDINETとXBRLの仕組みを知る

データの取得を始める前に、まずは「どこに、どんな形式でデータがあるのか」という基礎知識を整理しておきましょう。ここを理解していないと、エラーが起きた際や、新しい指標を追加したいときに、どこを修正すればいいか迷子になってしまいます。

投資家が利用できる最も信頼性の高いデータソースである「EDINET」と、その中身の形式である「XBRL」について、専門用語を噛み砕いて解説します。

金融庁が運営する開示システム「EDINET」とは?

EDINET(エディネット)は、有価証券報告書などの開示書類を閲覧するための電子システムです。

金融庁が運営しており、上場企業にはこのシステムを通じて書類を提出することが法律で義務付けられています。

最大の特徴は、人間が読むためのPDFだけでなく、コンピュータが読み取るための「API(Application Programming Interface)」という窓口が用意されている点です。

この窓口にPythonからアクセスすることで、正式なデータを直接、安定して取得できるようになります。

ブラウザでサイトを表示させてから情報を抜き出す「一般的なスクレイピング」とは違い、システムが公式に提供している窓口を使うため、途中で止まりにくく、非常に正確なデータが手に入ります。

機械読み取りに特化したデータ形式「XBRL」

決算書類のデータをプログラムで扱う際、最も重要になるのが「XBRL(エックス・ビー・アール・エル)」という形式です。

これは、売上高や純利益といった各項目に、あらかじめ「タグ」をつけて整理したデータ形式のことです。

例えば、「売上高」という数字には jpcrp_cor:NetSales という名前のタグが付いています。

Pythonを使えば、このタグを指定するだけで、数万文字ある書類の中からピンポイントで売上の数字を取り出せます。

単なるテキストデータとは異なり、項目ごとに定義が決まっているため、企業ごとの表記の揺れ(「売上」と「営業収益」など)を気にせず、横断的な比較ができるようになります。

APIを使えばスクレイピングよりも安定して取得できる

一般的なWEBサイトをプログラムで巡回して情報を集める手法を「スクレイピング」と呼びますが、これはサイトの見た目が少し変わるだけで動かなくなるリスクがあります。

一方で、EDINET APIを利用すれば、決まったルールに従ってデータが送られてくるため、長期的に安定して運用できます。

「決算短信」や「有価証券報告書」といった種類別にデータを抽出できるため、目的に合わせた柔軟な分析が可能です。

  • 有価証券報告書:情報量は多いが、提出が少し遅い
  • 決算短信:速報性は高いが、情報の網羅性は報告書に譲る

これらの特性を理解し、APIを使い分けることで、より深い企業分析が可能になります。

準備:Pythonの環境構築とライブラリ導入

実際にコードを書き始める前に、Pythonの作業環境を整えましょう。

「環境構築」と聞くと難しそうですが、最近ではGoogle Colabのようにブラウザだけで動く環境も充実しています。

ここでは、データを取得し、XBRLという特殊な形式を解析するために最低限必要なライブラリの導入手順を解説します。

データの取得・解析に必要なライブラリ3つ

Pythonには、世界中の開発者が作った便利な道具(ライブラリ)が豊富にあります。

EDINETのデータを扱うために、以下の3つをインストールしましょう。

  1. Requests:EDINETのAPIと通信を行い、データを取ってくるために使います。
  2. Pandas:取得したデータを表形式(Excelのような形)に整え、計算するために使います。
  3. edinet-xbrl(またはそれに類するパース用ツール):複雑なXBRLファイルを解析し、特定の数字を抜き出すために使います。

ターミナル(またはノートブックのセル)で、以下のコマンドを実行してインストールしてください。

pip install requests pandas edinet-xbrl

API利用のための基本的なコード構成

ライブラリが揃ったら、まずはAPIにアクセスするための「挨拶」となるコードを書きます。

EDINET APIは認証キーが不要なので、URLを指定するだけで誰でも使い始めることができます。

まずは、今日どんな書類が提出されたのか、そのリストを取得するコードからスタートするのが一般的です。

「どの企業の」「どの書類を」取得したいのかを、このリストの中から探し出す作業をコードで行います。

複雑な計算をする前に、まずは正しく通信ができているかを確認しましょう。

特定の企業(証券コード)を特定する方法

EDINET上では、企業は「EDINETコード」という固有のIDで管理されています。

私たちが普段使っている4桁の「証券コード」とは別物なので、これらを紐付ける必要があります。

金融庁のサイトから「EDINETコードリスト」というExcelファイルをダウンロードできますが、プログラム内で検索して特定することも可能です。

一度、自分の狙っている企業のEDINETコード(Eから始まる文字列)をメモしておきましょう。

これが決まれば、あとの取得作業は驚くほどスムーズに進みます。

ステップ1:EDINET APIから書類を探す

準備ができたら、いよいよ本番のデータ取得です。まずは、EDINETに蓄積されている膨大な書類の中から、自分が解析したい企業の、特定の日の書類を見つけ出す作業を行います。

このステップでは、「提出書類一覧API」を利用して、その日の新着リストを取得し、そこから目的の「書類ID(DocID)」を抜き出します。

日付を指定して提出書類のリストを取得する

EDINET APIでは、日付(YYYY-MM-DD形式)を指定してリクエストを送ります。

すると、その日に提出されたすべての書類(有価証券報告書、大量保有報告書、訂正書類など)の情報がドサッと送られてきます。

「今日、どんな動きがあったのか」を把握するための第一関門です。

これを毎日自動で実行するように設定すれば、決算の発表を見逃すことはなくなります。

「理屈はわかるが、全ての書類が対象になるとデータが多すぎるのでは?」という懸念もあるでしょう。

そこで、次のフィルタリングが重要になります。

証券コードでフィルタリングして目的の企業を絞り込む

取得したリストには、あなたに関係のない企業の書類も大量に含まれています。

これを証券コードや企業名で絞り込み(フィルタリング)、目的の1社だけを特定します。

このとき、書類の種類も同時にチェックするのが賢いやり方です。

例えば、「120」というコードを指定すれば有価証券報告書だけに、「140」を指定すれば四半期報告書だけに絞り込めます。

必要な情報だけをピンポイントで狙い撃ちすることで、無駄な通信を抑え、解析のスピードを上げることができます。

解析に必要なDocIDを抽出するコード

目的の書類が見つかったら、その書類の「住所」にあたる「DocID(書類管理番号)」を保存します。

これが、次のステップでファイルをダウンロードする際に必要になります。

# イメージ図:リストから目的の企業のIDを探す
for doc in documents_list:
    if doc['secCode'] == '72030': # トヨタ自動車などの証券コード
        target_doc_id = doc['docID']

このIDさえ手に入れば、情報の入り口を突破したも同然です。

次は、このIDを使って、実際の数値が詰まったファイルをダウンロードしましょう。

ステップ2:XBRLファイルをダウンロードして解析する

書類IDが判明したら、次はその中身をダウンロードします。

EDINET APIで取得できるのは「ZIP形式」に固められたファイル群です。

この中には人間用のPDFもありますが、私たちの目的は中にある「XBRL」というデータファイルです。

取得APIを叩いてファイルを保存する

書類取得APIを使い、先ほどのDocIDを指定してリクエストを送ります。

すると、その書類の全データが入ったZIPファイルがダウンロードされます。

これをPythonのプログラム内で一時的に保存し、中にある数値を読み取れる状態に解凍します。

手作業ならブラウザで右クリックして保存……という作業になりますが、コードなら一瞬で終わります。

ダウンロードが終わったら、いよいよXBRLという特殊なフォーマットの解析に入ります。

勘定科目に紐づく「タグ」を抽出する

XBRL解析ライブラリを使い、ファイルの中から「タグ」を基準に数値を抜き出します。

投資家がまず注目すべき主要なタグの例を、以下の表にまとめました。

項目タグ名(例)意味
売上高NetSales企業の売上の総額
営業利益OperatingIncome本業で稼いだ利益
当期純利益NetIncome最終的に残った利益
自己資本Equity企業の返済不要な資産

これらのタグを指定すると、対応する金額が数値データとして取り出せます。

「売上高がどこに書いてあるか探す」必要はなく、「NetSalesというタグがついた数字を持ってこい」と指示するだけです。

この圧倒的な正確さとスピードが、XBRL解析の最大の武器です。

欠損値やエラーへの対処法を解説

すべての企業のXBRLが同じ形式とは限りません。

たまに、特定のタグが存在しなかったり、数字が「0」ではなく「空欄(None)」になっていたりすることがあります。

これをそのまま計算に使おうとすると、プログラムが止まってしまいます。

「もしデータがなければ、0として扱う」あるいは「その指標の計算をスキップする」といった、例外処理のコードをあらかじめ入れておきましょう。

不完全なデータに出会ったときこそ、プログラムの堅牢性が試されます。

ここを丁寧に作っておくことで、全上場企業を対象にした大規模なスキャンでも止まらずに完遂できるようになります。

ステップ3:主要な財務指標を数値化する

タグから生データを抜き出せたら、次はそれらを組み合わせて、投資判断に役立つ「指標」へと変換します。

単なる「売上高」という数字だけでなく、企業の効率性や安全性を測るための数式をプログラムに実装しましょう。

このステップで、ただのデータが「投資の判断材料」へと変わります。

ROE(自己資本利益率)を算出する計算式

投資家が最も重視する指標の一つがROEです。

「株主から預かったお金を使って、どれだけ効率よく利益を出したか」を示します。

計算式は、 当期純利益 ÷ 自己資本 × 100 です。

先ほどXBRLから抜き出した NetIncome と Equity を使って、コード内で計算させます。

roe = (net_income / total_equity) * 100

ROEが10%を超えているか、あるいは年々上昇しているか。

こうした変化を数値として取り出せるようになれば、優良企業を見つける精度が格段に上がります。

自己資本比率から企業の安全性を測る

どれだけ利益が出ていても、財務がボロボロでは投資先として不安です。

企業の「体力」を示す自己資本比率( 自己資本 ÷ 総資産 × 100 )も同時に計算しましょう。

倒産リスクを避けるための「足切りライン」として利用できます。

例えば、自己資本比率が20%を下回る企業には警告を出す、といったロジックも簡単に組み込めます。

安全性と収益性の両面から企業を評価することが、負けない投資の第一歩です。

営業利益率の推移をデータとして取り出す

売上に対して、本業の儲けである営業利益がどれくらい残っているかを示す営業利益率も重要です。

「売上は増えているのに、利益率は下がっていないか?」というチェックを自動で行います。

単年度の結果だけでなく、過去の書類も取得して比較すれば、その企業の競争力が強化されているのか、それとも衰退しているのかをグラフにするためのデータが揃います。

こうして一つひとつの指標を計算していくことで、次第にその企業の輪郭がくっきりと浮かび上がってきます。

ステップ4:独自のロジックで企業をスコア化する

各指標が計算できたら、それらを統合して一つの「点数(スコア)」を算出しましょう。

これが、この記事の最終的なゴールです。

複数の指標を別々に眺めるのではなく、自分なりの「重み付け」をして100点満点で評価することで、銘柄選定の基準が明確になります。

スコアリング機能の実装コード

例えば、以下のような配分でスコアをつけるロジックを考えてみましょう。

  • ROEが15%以上なら30点
  • 営業利益率が10%以上なら30点
  • 自己資本比率が50%以上なら20点
  • 売上が前期比で増えていれば20点

これらを足し合わせて、合計点が高い企業を「お宝銘柄」としてリストアップします。

数式を変えれば、「成長性重視」や「割安性重視」など、自分の投資スタイルに合わせたスコアリングが自由自在に作れます。

投資スタイルに合わせた重み付けのコツ

一律のスコアリングではなく、業種や自分の好みに合わせて「重み」を変えるのがコツです。

例えば、成長株(グロース株)を狙うなら売上成長率の配点を高くし、安定配当株を狙うなら自己資本比率や配当性向の配点を高くします。

「自分はどんな企業を応援したいのか」という哲学をスコアリングに反映させましょう。

AIや他人の意見ではなく、自分のロジックで算出された点数だからこそ、自信を持って投資できるようになります。

確かに、最初はどの指標を重視すべきか迷うかもしれません。

まずは有名な投資家が提唱する基準(例:バフェット流など)をコードで再現することから始めて、徐々に自分流にアレンジしていくのがおすすめです。

割安・割高を判定する基準を追加する

どんなに優良な企業でも、株価が高すぎれば投資としては失敗です。

算出されたスコアに、現在の株価指標(PERやPBRなど)を組み合わせて、「良い企業が、安く放置されているか」を判定しましょう。

スコアが高いのにPERが低い企業。

これこそが、多くの投資家が探し求めている「掘り出し物」です。

Pythonなら、株価データを別のAPI(Yahoo Financeなど)から取得して、決算データと合体させることも簡単です。

「財務の質」と「株価の安さ」の両面から、最高の1社を炙り出しましょう。

分析結果を可視化して投資に役立てる

計算が終わったら、その結果を人間が理解しやすい形に整えましょう。

数字の羅列だけでは、直感的な判断を下すのは難しいものです。

Pythonの強力なグラフ作成機能や、表形式での保存機能を使い、分析結果を「投資の判断材料」として完成させます。

Pandasを使って分析結果を一覧表にする

数百社の企業のスコアを、PandasのDataFrameという形式で一覧表にします。

これをスコアの高い順に並べ替える(ソートする)だけで、即座に「今買うべき候補リスト」が出来上がります。

証券会社のサイトではできない、独自の計算項目を含んだ自分だけのリストです。

これを週に一度実行するだけで、市場の変化を完全に把握できるようになります。

グラフを描画して財務の推移を視覚化する

単年度のスコアだけでなく、数年間の推移をグラフにしてみましょう。

売上やROEが右肩上がりなのか、それとも停滞しているのかが視覚的にわかります。

「数字」では気づけなかった変化も、「形」にすることで一瞬で理解できます。

例えば、利益率が急激に改善している場所を見つけたら、その理由を深く探る(個別のPDFを読む)という、効率的なリサーチが可能になります。

CSVやExcel形式でデータを保存する

分析結果は、CSVやExcelファイルとして保存しておきましょう。

Python上だけでなく、後でExcelで開いてフィルターをかけたり、メモを書き加えたりすることもできます。

df.to_csv('analysis_results.csv', index=False)

この一行で、あなたの苦労して作ったデータがファイルとして残ります。

これを蓄積していくことで、あなただけの強力な企業データベースが出来上がります。

運用上の注意点と制限事項を確認

最後に、このシステムを運用し続けるための「守り」の部分を確認しましょう。

EDINET APIは公共のインフラです。ルールを守って正しく利用しなければ、アクセスを遮断されてしまうこともあります。

また、データの性質についても、誤解を招かないための知識が必要です。

APIのアクセス制限(リクエスト数)に注意

EDINET APIには、短時間の過剰なアクセスを制限する仕組みがあります。

数千社のデータを一気に取得しようとして、高速でリクエストを送り続けると、サーバーに負荷がかかり、接続を拒否される可能性があります。

コードの中に time.sleep(1) のように、リクエストごとに数秒の休憩を入れる処理を必ず書き込みましょう。

「急がば回れ」です。サーバーに優しく、確実にデータを集めるのがプロの作法です。

決算短信と有価証券報告書のデータの違い

EDINETには有価証券報告書がメインですが、決算直後に出る「決算短信」はTDnet(東証のシステム)から開示されることが多く、EDINETに反映されるまでにはタイムラグがある場合があります。

より速報性を求めるならTDnetのAPI、より深い財務情報を求めるならEDINET、という使い分けが必要です。

この記事で学んだXBRL解析のスキルはどちらのシステムでも応用できるため、慣れてきたら取得先を広げてみるのも良いでしょう。

タクソノミの変更によるコードの修正リスク

会計のルール(タクソノミ)は数年ごとに更新されます。

これに伴い、XBRLのタグ名が変わることがあるため、ある日突然コードが動かなくなる、あるいは特定の数字が取れなくなることがあります。

エラーが出たときは、「タグ名が変わっていないか」を金融庁の最新のガイドラインで確認しましょう。

こうしたメンテナンスも、自作ツールを運用する楽しみの一つです。

注意点対策
サーバー負荷通信の間に待機時間を入れる
反映の遅れ速報データは他のシステムと併用する
タグの変更定期的にエラーがないか確認し、タグを更新する

まとめ:Pythonで「根拠のある投資」を実現しよう

この記事では、EDINET APIとPythonを使って、決算データを自動取得し、独自の基準でスコア化するまでの最短ルートを解説しました。

  1. EDINET API で開示書類を特定し、XBRL形式 のデータを取得する
  2. Pythonのライブラリを使い、特定の タグ(NetSales等) から数値を抜き出す
  3. ROEや自己資本比率といった 財務指標 をコードで計算する
  4. 自分の投資哲学を反映した 独自のスコア で、企業を客観的に評価する

情報をただ受け取るだけの受動的な投資から、自らデータを解析して真の優良企業を見つけ出す能動的な投資へ。Pythonという武器を手にすることで、あなたの投資判断はより鋭く、より確かなものになるはずです。まずは自分の持っている銘柄の「売上高」をAPIで取得するところから、最初の一歩を踏み出してみませんか。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次