0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EDINET解析③ TDnetの次に読むXBRL――ファイル・タグ・コンテキストの違いを確かめる

0
Last updated at Posted at 2026-10-27

この連載の読む順番

TDnet①〜④で、書類の役割からXBRLの解析・グラフ化までを順に扱います。その後、EDINET①〜④へ進みます。共通の基本操作はTDnet編を参照し、EDINET編では違いを確認します。

  1. TDnet解析① TDnetとは?決算短信・適時開示とEDINETの違い
  2. TDnet解析② XBRLとは?決算短信のPDFと数値データを図解
  3. TDnet解析③ XBRLの値を比較する前に、期間・単位・欠損を確かめる
  4. TDnet解析④ 累計と四半期単独、実績と予想を分けてグラフにする
  5. EDINET解析① EDINETとは?有価証券報告書から企業を理解する
  6. EDINET解析② XBRLとは?有価証券報告書の構造とタグの仕組みを理解する
  7. EDINET解析③ TDnetの次に読むXBRL――ファイル・タグ・コンテキストの違いを確かめる(この記事)
  8. EDINET解析④ 財務データを継続的な分析に使う

TDnet編とEDINET①・②の説明を踏まえ、今回はEDINETの公式サンプルを読みます。TDnet③で確認した「条件で値を選び、参照先で期間と単位を確かめる」という手順を使い、どこを読み替える必要があるかを見ていきましょう。

前提となる記事:TDnet解析③。候補の選び方、ゼロと欠損、Python・仮想環境の準備、XPathと名前空間の基本は、そちらで説明しています。初めて読む方は先にTDnetの実習を終えてから戻ると、以下の違いを追いやすくなります。

EDINETの書類構造自体を確認したい場合は、EDINET解析②も参照してください。

今回は何が変わるのか

比較するのは、TDnet③で読んだTDnetのInline XBRLと、今回選んだEDINETの.xbrlです。EDINETにもInline XBRLがあり、TDnetとEDINETを形式だけで二分する表ではありません。

確認箇所 TDnet③のサンプル 今回読むEDINETサンプル
対象ファイル 決算短信の-ixbrl.htm PublicDoc内の.xbrl
売上高の位置 ix:nonFractionのname属性 jppfs_cor:NetSales要素
コンテキスト 連結・実績のメンバーを持つ例 今回選ぶ当期のcontextにはscenarioがない
数値の読取り 表示文字にscale等を適用 要素の中の数値を読む。scaleを掛け直さない
共通する確認 期間・範囲・単位・候補数を確認 同じ確認を続ける

使うのは2026年版EDINETタクソノミの公式サンプルです。数値は説明用データで、実在企業の業績ではありません。確認日は2026年10月26日です。目標は、指定したサンプルの売上高323609000000が、2025年4月1日から2026年3月31日までの期間に対応する円単位の値だと説明できることです。

1. サンプルの中で、どのファイルを開くか

金融庁の2026年版EDINETタクソノミ公表ページから「サンプルインスタンス」を取得します。「タクソノミ本体」とは別の配布物です。タクソノミは項目の定義、サンプルインスタンスはその定義を使った報告内容の例です。

金融庁の2026年版EDINETタクソノミ公表ページ。公表資料の(h)にサンプルインスタンスのZIPがあります。

出典:金融庁「2026年版EDINETタクソノミの公表」、公表資料(1)(h)。2026年10月26日撮影。画像の左側にある「サンプルインスタンス(ZIP)」が今回の取得先です。右側の概要説明PDFや、上の「タクソノミ本体」と区別します。

ダウンロードしたZIPを、練習用フォルダーに edinet-official-sample.zip という名前で保存します。コードはZIPを直接読むので、展開しなくても動きます。手で中身を確かめる場合は、別途展開して構いません。

この回の対象は、XBRL/PublicDoc/ に入っている次のファイルです。

jpcrp030000-asr-001_X99001-000_2026-03-31_01_2026-06-12.xbrl

ファイル名に似た文字が並んでいても、拡張子まで確認します。.xbrl と _ixbrl.htm は、この練習では入れ替えて使いません。

見つかるファイル この回での読み方
.xbrl 値とコンテキスト、単位を読む対象
_ixbrl.htm 人が読む表示にタグを埋め込んだInline XBRL
.xsd 項目や参照先を定義するスキーマ
_pre.xml 表示上の親子関係や順序を記した表示リンク

PublicDoc は提出本文側、AuditDoc は監査報告書側のデータを探す際の区別になります。今回はファイル名に加えて /PublicDoc/ という場所も確認します。別の場所にある似たファイルを、黙って採用しないためです。

ZIP内の日本語フォルダー名が環境によって読みづらく表示される場合があります。この例では、ASCIIで書かれた末尾のパスを使って対象を特定します。文字化けした名前を新しい正しい名称として扱ったり、元のZIPを書き換えたりする必要はありません。

2. name属性ではなく、項目の要素を探す

TDnet③では、ix:nonFractionのname="tse-ed-t:NetSales"を探しました。今回の.xbrlでは、売上高そのものが次の要素です。改行を追加し、今回使わないid属性を省いています。

<jppfs_cor:NetSales
    contextRef="CurrentYearDuration"
    unitRef="JPY"
    decimals="-6">323609000000</jppfs_cor:NetSales>

したがって、前のXPathをそのまま使うのではなく、./p:NetSales[@contextRef=$c]へ変更します。pは、このコードで財務諸表本表タクソノミの名前空間URIに割り当てる接頭辞です。

http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2025-11-01/jppfs_cor

ここで確認するのは元ファイルが参照しているURIです。2026年版という配布名を見て、URIの日付を独自に2026年へ書き換えないでください。別の版へ進むときは、そのファイルの名前空間宣言とタクソノミを確認します。接頭辞とURIの役割は、TDnet③の「コードは、何をどの順番でしている?」で扱った考え方と同じです。

3. 連結・個別の表し方を読み替える

今回のファイルで同じ売上高要素を探すと16件あります。TDnetで学んだ候補の絞り方を使いますが、コンテキストIDや軸の設定をそのままコピーすることはできません。一部を抜粋すると、次の違いがあります。

コンテキストID 値(円) 今回確認する違い
Prior1YearDuration 316,934,000,000 前年の期間
CurrentYearDuration 323,609,000,000 今回選ぶ当年の期間
CurrentYearDuration_NonConsolidatedMember 210,346,000,000 当年の個別

TDnetのサンプルでは、ConsolidatedMemberとResultMemberを含むコンテキストを使いました。今回はCurrentYearDurationをたどり、period内の開始日2025-04-01と終了日2026-03-31を確認します。主体を示すentity/identifierはX99001-000です。

このコンテキストには scenario がありません。EDINET解析②で扱った設定例では、個別側に NonConsolidatedMember を指定する形と区別しました。ただし、scenarioがないことだけで、あらゆるXBRLの連結・実績を断定しないようにします。該当タクソノミ、対象の表、ディメンションのデフォルトなどとの関係があります。今回は確認済みのサンプルに対象を限定しています。報告書インスタンス作成ガイドライン

報告書インスタンス作成ガイドラインのコンテキスト設定例。当期連結期間と当期個別時点ではperiodとscenarioの設定が異なります。

出典:金融庁「報告書インスタンス作成ガイドライン」p.40(PDF 50ページ目)の抜粋。上の表の period/startDate と period/endDate が、今回読む開始日と終了日に対応します。下の表は個別・時点の設定例であり、今回の売上高にそのまま当てはめるものではありません。

4. TDnetのscale計算を、そのまま移さない

unitRefからユニットをたどる手順はTDnet③と同じです。今回も参照先のmeasureはiso4217:JPYなので円ですが、値の取り出し方は変わります。

読取りの段階 TDnetのInline XBRLの例 今回のEDINET .xbrlの例
元の文字 1 323609000000
円単位への解釈 scale="6"を使い1 × 10⁶ 要素の数値をそのまま読む
得られる円単位の値 1000000 323609000000
百万円表示にする 円単位の値を100万で割る 同じく100万で割る

二つは別のサンプルの数値です。同じ企業・同じ業績を二通りに表現した比較ではありません。

decimals="-6"は百万の位までの精度に関する情報で、100万倍する指示ではないことも、TDnetで確認した通りです。今回の.xbrlの値へ掛け直すと、既に円単位の数値をさらに100万倍してしまいます。XBRL 2.1仕様

円単位323609000000を1000000で割ると323609百万円。decimals=-6は倍率として適用しない。

図:今回新しく確認するのは、.xbrlから読んだ値にInline XBRL用の桁調整を掛け直さないことです。

5. TDnetで使ったPython環境で実行する

TDnet③で用意したPython 3とlxmlの環境をそのまま使います。仮想環境やライブラリをまだ用意していなければ、TDnet③の「実行前に用意するもの」を先に進めてください。

練習用フォルダーへedinet-official-sample.zipを追加し、下のコードをread_edinet_sample.pyとして保存します。TDnet用のZIPとスクリプトは別名のまま残せます。macOS・Linuxでは次のコマンドで実行します。

.venv/bin/python read_edinet_sample.py

WindowsのPowerShellでは次を使います。

.\.venv\Scripts\python.exe read_edinet_sample.py

変更点を含む実行用コード

コピーして試せるよう、コードは一つにまとめています。ZIPの読取り、候補数の確認、参照先をたどる部分はTDnet③と共通です。今回変わる中心は、対象パス、名前空間と要素の選択、想定するコンテキスト、数値の変換です。特定のサンプルだけを扱い、想定と違う入力では止まる例です。

"""One known fact from the FSA 2026 taxonomy sample; not a general XBRL parser."""
import json
import sys
from decimal import Decimal
from zipfile import ZipFile
from lxml import etree

FILENAME = "jpcrp030000-asr-001_X99001-000_2026-03-31_01_2026-06-12.xbrl"
NS = {
    "x": "http://www.xbrl.org/2003/instance",
    "p": "http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2025-11-01/jppfs_cor",
    "xsi": "http://www.w3.org/2001/XMLSchema-instance",
}


def exactly_one(items, label):
    if len(items) != 1:
        raise ValueError(f"{label}: expected 1, got {len(items)}")
    return items[0]


def read_sample(path):
    with ZipFile(path) as archive:
        member = exactly_one(
            [n for n in archive.namelist() if n.endswith("/PublicDoc/" + FILENAME)],
            "sample file",
        )
        root = etree.fromstring(
            archive.read(member),
            parser=etree.XMLParser(resolve_entities=False, no_network=True),
        )
    context_id = "CurrentYearDuration"
    fact = exactly_one(root.xpath(
        "./p:NetSales[@contextRef=$c]", namespaces=NS, c=context_id
    ), "NetSales")
    context = exactly_one(root.xpath(
        "./x:context[@id=$c]", namespaces=NS, c=fact.get("contextRef")
    ), "context")
    unit = exactly_one(root.xpath(
        "./x:unit[@id=$u]", namespaces=NS, u=fact.get("unitRef")
    ), "unit")
    if fact.get("{" + NS["xsi"] + "}nil") in {"true", "1"}:
        raise ValueError("The selected fact is nil")
    if context.find("x:scenario", NS) is not None or context.find("x:entity/x:segment", NS) is not None:
        raise ValueError("This example expects a context without scenario/segment")
    if len(unit) != 1 or unit[0].tag != "{" + NS["x"] + "}measure":
        raise ValueError("This example expects a simple currency unit")
    measure = (unit[0].text or "").strip()
    prefix, local = measure.split(":", 1)
    if unit[0].nsmap.get(prefix) != "http://www.xbrl.org/2003/iso4217" or local != "JPY":
        raise ValueError("This example expects JPY")
    start = context.findtext("x:period/x:startDate", namespaces=NS)
    end = context.findtext("x:period/x:endDate", namespaces=NS)
    if (start, end) != ("2025-04-01", "2026-03-31"):
        raise ValueError("Unexpected reporting period")
    value = Decimal((fact.text or "").strip())
    return {
        "element": "jppfs_cor:NetSales",
        "entity": context.findtext("x:entity/x:identifier", namespaces=NS),
        "contextId": context_id,
        "startDate": start,
        "endDate": end,
        "unit": local,
        "value": str(value),
        "decimals": fact.get("decimals"),
        "displayMillionYen": str(value / Decimal("1000000")),
    }


if __name__ == "__main__":
    path = sys.argv[1] if len(sys.argv) > 1 else "edinet-official-sample.zip"
    print(json.dumps(read_sample(path), ensure_ascii=False, indent=2))

TDnetのコードから変わる箇所

今回のコード 変更する理由
endswith("/PublicDoc/" + FILENAME) 提出本文側の指定ファイルを選ぶ
NS["p"]と./p:NetSales 項目の名前空間と要素名で探す
scenario/segmentを確認 今回選んだ、これらを持たない既知のcontextと一致するかを確かめる
Decimal((fact.text or "").strip()) .xbrlの数値を読み、scaleを掛けない

exactly_oneは、TDnet③の「一件だけかを確認してから取り出す」処理を関数にしたものです。複数候補を一般的に解決する規則を追加したものではありません。連結の判定も汎用化していません。

6. 今回のサンプルの出力を照合する

出力は次のとおりです。ZENITH CodeのAPI応答ではなく、この練習用の独自形式です。

{
  "element": "jppfs_cor:NetSales",
  "entity": "X99001-000",
  "contextId": "CurrentYearDuration",
  "startDate": "2025-04-01",
  "endDate": "2026-03-31",
  "unit": "JPY",
  "value": "323609000000",
  "decimals": "-6",
  "displayMillionYen": "323609"
}

valueは元の要素の数値、startDateとendDateはコンテキストの期間、unitはユニットの定義と照合します。確認の順序はTDnet③と同じです。今回追加で確かめたいのは、displayMillionYenの323609を100万倍するとvalueへ戻り、value自体には倍率を掛け直していないことです。

valueを文字列で出しているのは、Decimalで扱った十進数の表現を残すためです。今回の対象表を人が確認したことと、コードが自動で確認する条件は区別してください。

7. EDINETのファイルへ替えたときに止まったら

ZIPの保存場所やlxmlのインストールに関する基本的なエラーは、TDnet③の「動かなかったときに確認する場所」を参照してください。ここでは入力を替えたことで起こる違いに絞ります。

表示 この回で確認するところ
sample file: expected 1, got 0 2026年版のサンプルか。PublicDoc内に指定した.xbrlがあるか
NetSales: expected 1, got 0 Inline XBRL用の検索式を使っていないか。URI・要素・contextが一致するか
Unexpected reporting period 指定したcontextの実際の日付が今回の想定と合うか
This example expects a context without scenario/segment 個別やセグメントのcontextに替わっていないか。このコードの対象範囲か

確認行を削除するのではなく、どの前提が変わったかを調べます。別年度へ拡張する場合は、日付やファイル名だけでなく、参照する定義も読み直します。

8. このコードで行っていないこと

今回は対象を小さく固定しました。ほかの会社や年度への展開では、さらに確認が必要です。

  • IFRSや提出者独自のタグを、同じ意味の項目へ対応付けること。
  • ディメンションやデフォルトを含む一般的な連結・個別の判断。
  • 表示リンクをたどって財務諸表の階層を組み立てること。
  • 円/株などの複合単位、Inline XBRLの変換規則、文章の連結。
  • 訂正・取下げ、同一条件の複数候補、書類間の採用順の決定。
  • タクソノミ全体の読込みや、XBRL仕様への完全な妥当性検証。

no_network=True は、今回のXML読取りで外部への参照を読み込ませない指定です。未信頼の巨大ZIPやXML全般に対応する安全な解析基盤が、これだけで完成するわけではありません。今回扱うのは金融庁から取得した既知の学習用ファイルです。

確認問題: TDnetで使ったDecimal(文字列) * 10 ** scaleを、今回の.xbrlにもそのまま移してよいでしょうか。

今回は移しません。今回の要素には既に円単位の数値が記録されています。decimalsをscaleの代わりに使うこともできません。提供元の名前だけで処理を切り替えるのではなく、実際に読む形式と属性を確認します。

自分の分析へ進むには

今回のように値の意味を確認する手順は、構造化済みのデータをAPIで取得するときにも使います。自分で項目や表示方法を選びたい場合は、必要な情報の粒度を先に決めましょう。主要項目の推移、表の階層、個々のXBRL要素では、読むデータの形が違います。

私たち株式会社Crabgrassは、財務データAPI「ZENITH Code」を開発・提供しています。標準化された主要項目に加え、有価証券報告書のXBRL数値データの利用方法も案内しています。

目的に合わせて、次の資料を選ぶ

今回確認した内容をサービス内のガイドにも整理しました。疑問に近い入口から読み進められます。

  • EDINET解析ガイド:書類の識別、タグ、表示階層、タクソノミの管理を一通り確認する。
  • 財務データAPIの選び方:主要項目の推移、表の階層、個々のXBRLファクトのどれが必要かを決める。
  • TDnet解析ガイド:決算短信を扱う際の実績・予想、期間、単位、訂正の確認順を読む。

関連記事:TDnet解析②:PDFと数値データ / EDINET解析②:構造とタグ

本記事は公式サンプルを用いた技術解説です。特定の金融商品の売買を勧めるものではありません。

続けて読む

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?