この前の記事で、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
xbrlファイル
HTMLファイルの方は人間が読んで分かる形式ですが、コンピュータが処理しやすいようにXML形式になっているファイルが*.xbrl
ファイルです。
XBRLとは
XBRL(eXtensible Business Reporting Language)とは、企業の財務情報や業績データなどを電子的に標準化して記述・交換するためのXMLベースのフォーマットです。これは国際的な標準フォーマットで、日本のみならず米国、欧州でも採用しています。
ファイルの抜粋
<?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()
売り上げに関するタグ名は複数あり、ここでは簡易的にrevenue
、 sales
、netsales
のキーワードが含まれるものを抽出しています。
実行例
(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スクリプトなどで自動的に全銘柄の使用タグのリストを作成するのはできそうですが)