1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Python] 有価証券報告書(XBRLファイル)から売り上げデータを抽出する

Posted at

この前の記事で、APIを使ってEDINETから上場企業の有価証券報告書をダウンロードする方法を書きました。

本稿では取得した報告書データの中身を見ていきたいと思います。

有価証券報告書(zipファイル)の中身を見てみる

とりあえず、適当に例としてトヨタ自動車のデータを使います。

2018年12月第3四半期のデータです。

zipファイルを展開すると、以下のような構成になっています。

XBRL
├── AuditDoc
│   ├── jpaud-qrr-cc-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
│   ├── jpaud-qrr-cc-001_E02144-000_2018-12-31_01_2019-02-13_pre.xml
│   ├── jpaud-qrr-cc-001_E02144-000_2018-12-31_01_2019-02-13.xbrl
│   ├── jpaud-qrr-cc-001_E02144-000_2018-12-31_01_2019-02-13.xsd
│   └── manifest_AuditDoc.xml
└── PublicDoc
    ├── 0000000_header_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0101010_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0102010_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0103010_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104000_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104010_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104020_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104030_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104035_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104037_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104050_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104100_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0104110_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── 0201010_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
    ├── jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_def.xml
    ├── jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_lab-en.xml
    ├── jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_lab.xml
    ├── jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_pre.xml
    ├── jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13.xbrl
    ├── jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13.xsd
    └── manifest_PublicDoc.xml

AuditDoc/は監査報告書関連が入っており、PublicDoc/は四半期報告書関連が入っています。

XBRL関連ファイル

  • .xbrl: XBRL インスタンス文書(財務データの実際の値、コンテキスト、期間情報を含む)
  • .xsd: XBRL スキーマファイル(データ要素の定義、型定義、名前空間の宣言)
  • _pre.xml: プレゼンテーションリンクベース(要素の表示順序、階層構造の定義)
  • _def.xml: 定義リンクベース(次元、メンバー、ハイパーキューブの定義)
  • _lab.xml: ラベルリンクベース(日本語の要素名、説明の定義)
  • _lab-en.xml: 英語ラベルリンクベース(英語の要素名、説明の定義)

HTML関連ファイル

  • _ixbrl.htm: Inline XBRL(人が読めるHTML形式でXBRLデータを埋め込んだファイル)

HTMLファイルの一例

*.htmlファイル群はブラウザを使って閲覧できます。

0101010_honbun_jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13_ixbrl.htm
スクリーンショット 2025-08-02 10.02.07.png

xbrlファイル

HTMLファイルの方は人間が読んで分かる形式ですが、コンピュータが処理しやすいようにXML形式になっているファイルが*.xbrlファイルです。

XBRLとは

XBRL(eXtensible Business Reporting Language)とは、企業の財務情報や業績データなどを電子的に標準化して記述・交換するためのXMLベースのフォーマットです。これは国際的な標準フォーマットで、日本のみならず米国、欧州でも採用しています。

ファイルの抜粋

jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13.xbrl
<?xml version="1.0" encoding="UTF-8"?>
<xbrli:xbrl xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:jpdei_cor="http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor" xmlns:jppfs_cor="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor" xmlns:jpsps_cor="http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:xbrldi="http://xbrl.org/2006/xbrldi" xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <link:schemaRef xlink:href="jpsps070000-asr-001_G14223-000_2025-04-20_01_2025-07-16.xsd" xlink:type="simple"/>
  <xbrli:context id="FilingDateInstant">
            <xbrli:entity>
              <xbrli:identifier scheme="http://disclosure.edinet-fsa.go.jp">G14223-000</xbrli:identifier>
            </xbrli:entity>
            <xbrli:period>
              <xbrli:instant>2025-07-16</xbrli:instant>
            </xbrli:period>
          </xbrli:context>
  <xbrli:context id="CurrentYearDuration">
・・・

タグの階層構造になっていて、構成するタグのルールさえ分かれば取得したいデータをピックアップできます。タグの構造の仕様書を読むのは面倒そうです。
しかし、自分でxbrlの構造のパーサーをいちから作る必要はありません。すでにオープンソースのライブラリがあります。

Arelleライブラリ

Arelleは、Pythonで書かれた、企業の財務報告などに用いられるXBRL形式のデータを解析・検証できるオープンソースのツールです。米国や欧州のタクソノミはもちろん、日本のEDINETで使用されているXBRLファイルのパースにも対応しています。

導入方法

単純に

$ pip install arelle

とすれば良いです。が、注意点があります。

注意点

pythonの最新版だと互換性に問題があり動きません。python 3.9 を使用する必要があります。

なので、venv環境を作成して使うことをお勧めします。

$ python3.9 -m venv ~/venvs/arelle-env
$ source ~/venvs/arelle-env/bin/activate
(arelle-env) $ 

XBRLから売り上げデータを抽出する

ソースコード

import argparse
from arelle import Cntlr
from arelle.ModelManager import ModelManager
from arelle.FileSource import FileSource

def extract_revenue_from_xbrl(xbrl_file_path):
    """XBRLファイルから売上高を抽出する"""
    results = []
    
    # Arelleコントローラーを初期化
    ctrl = Cntlr.Cntlr()
    
    try:
        # XBRLファイルを読み込み
        model_manager = ModelManager(ctrl)
        file_source = FileSource(xbrl_file_path)
        model_xbrl = model_manager.load(file_source)
        
        if model_xbrl is None:
            return results
            
        # 売上高関連キーワード
        revenue_keywords = ['revenue', 'sales', 'netsales']
        
        # 全ファクトから売上高を検索
        for fact in model_xbrl.facts:
            tag_name = fact.localName.lower()
            
            # 売上高関連タグをチェック
            if any(keyword in tag_name for keyword in revenue_keywords):
                results.append({
                    'tag': fact.localName,
                    'value': fact.value,
                    'context': fact.context.id if fact.context is not None else 'Unknown'
                })
        
        model_xbrl.close()
        
    except Exception as e:
        print(f"Error: {e}")
    finally:
        ctrl.close()
    
    return results

def main():
    """メイン処理"""
    parser = argparse.ArgumentParser(description='XBRLから売上高を抽出')
    parser.add_argument('xbrl_file', help='XBRLファイルのパス')
    args = parser.parse_args()
    
    # 売上高データを抽出
    revenue_data = extract_revenue_from_xbrl(args.xbrl_file)
    
    # 結果を表示
    if revenue_data:
        for data in revenue_data:
            print(f"Tag: {data['tag']}")
            print(f"Value: {data['value']}")
            print(f"Context: {data['context']}")
            print("-" * 30)
    else:
        print("売上高データが見つかりませんでした")

if __name__ == "__main__":
    main()

売り上げに関するタグ名は複数あり、ここでは簡易的にrevenuesalesnetsalesのキーワードが含まれるものを抽出しています。

実行例

(arelle-env)$ python extract_revenue.py XBRL/PublicDoc/jpcrp040300-q3r-001_E02144-000_2018-12-31_01_2019-02-13.xbrl
Tag: RevenuesUSGAAPSummaryOfBusinessResults
Value: 21796974000000
Context: Prior1YTDDuration
------------------------------
Tag: RevenuesUSGAAPSummaryOfBusinessResults
Value: 22475548000000
Context: CurrentYTDDuration
------------------------------
Tag: RevenuesUSGAAPSummaryOfBusinessResults
Value: 29379510000000
Context: Prior1YearDuration
------------------------------
Tag: RevenuesUSGAAPSummaryOfBusinessResults
Value: 7605767000000
Context: Prior1QuarterDuration
------------------------------
Tag: RevenuesUSGAAPSummaryOfBusinessResults
Value: 7801542000000
Context: CurrentQuarterDuration
------------------------------

取得できた情報の意味は下記のとおりです。

タグ

  • RevenuesUSGAAPSummaryOfBusinessResults
    • Revenues: 売上高・収益
    • USGAAP: 米国会計基準(US Generally Accepted Accounting Principles)
    • SummaryOfBusinessResults: 業績概要
    • 意味: 米国会計基準による業績概要の売上高

売上高データ一覧

Context 期間の意味 売上高(円) 売上高(兆円)
Prior1YTDDuration 前年度累計(4月-12月) 21,796,974,000,000 21.8兆円
CurrentYTDDuration 当年度累計(4月-12月) 22,475,548,000,000 22.5兆円
Prior1YearDuration 前年度通年(4月-翌年3月) 29,379,510,000,000 29.4兆円
Prior1QuarterDuration 前年同四半期(10月-12月) 7,605,767,000,000 7.6兆円
CurrentQuarterDuration 当四半期(10月-12月) 7,801,542,000,000 7.8兆円

やっかいなところ

XBRLで企業の業績データは取得できますが、やっかいなのは同じ種類のデータを取得するにに、企業ごとに使用しているタグ名が異なることです。

たとえば、「売上高」を表すデータひとつとっても、ある企業はjpcrp_cor:NetSalesを使い、別の企業は jpcrp_cor:OperatingRevenue、さらにはjpcrp_cor:RevenueFromGoodsAndServicesのように記述している場合があります。

なぜ統一しないのか、あるいは統一できないのか謎ですが、本格的なシステムを作る際は、おそらく企業ごとに使用しているタグのリストを作成する必要があるでしょう。

日本の上場企業は4000弱なので大変です。とはいえ、一度作ってしまえば、あとは多少変更があったときに修正すれば良いので、最初だけ結構な労力がかかる感じですね。(ここら辺、やろうと思えばpythonスクリプトなどで自動的に全銘柄の使用タグのリストを作成するのはできそうですが)

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?