財務分析に欠かせない、XBRLを理解する Part2
Part2では、XBRLファイルをPythonで読み込んでいきたいと思います。XBRLとは何か?についてはPart1をご参照ください。Part2では、簡単な抽出から複雑な抽出まで順を追って行っていこうと思います。実装は、以下で公開しています。
Part1で、XBRLは「インスタンス文書」と「タクソノミ文書」で構成されると解説しました。
- インスタンス文書
タクソノミ文書の定義に従って書かれる実文書。記載されている値の定義(単位など)も含む。 - タクソノミ文書
記載すべき項目の定義や項目の構造などの定義。
Part2はインスタンス文書からの情報読み取りを扱います。具体的には、 .xbrl
ファイルからの情報抽出です。目次は以下のようになります。
- 要素の読み取り
- コンテキストの読み取り
- ディメンジョンの読み取り
- 注釈の読み取り
基本的な流れは、報告書インスタンス作成ガイドラインの通りです。では、始めていきましょう。
XBRLファイルの作成プロセス
情報抽出に入る前に、XBRLファイルの作成プロセスについて簡単に触れておきます。XBRLは、提出者が作成したiXBRLファイル(インラインXBRLファイル)をベースにEDINET上で作成されます。
インラインXBRLファイルとは、XMLベースであるXBRLとブラウザで表示できるHTMLを橋渡しするフォーマットです。XMLをちまちま作成していくのは人類にやさしくないので、レイアウトを見ながら作業できるインラインXBRLは画期的な技術と言えます。
マニフェストファイルが、インラインXBRLを組み合わせる方法(最終的な方向文書全体)を定義します。マニフェストファイルはファイル名が manifest_
から始まるファイルで、EDINETからダウンロードするzipファイルの中に含まれます。縦覧用(PublicDoc)、独立監査人の報告書用(AuditDoc)、非縦覧用など文書に応じて作成されます。zipの中には監査人への報告用も含まれますが、我々が見るのは縦覧用(PublicDoc)となります。
要素の読み取り
実際にXBRLから要素の値を読んでみましょう。XBRLはタクソノミ文書で定義された語彙に基づき書かれているため、「何が書いてあるか」を知るにはタクソノミ文書を参照する必要があります。実際のタクソノミ文書は .xsd
ファイルですが、人間に見やすい形式(Excel)でも公開されています。以下は、2018年度の方向に使用されるタクソノミです。”タクソノミ要素リスト”からExcelがダウンロードできます。
タクソノミの定義は様式ごとに分かれています。年次報告書に使われる様式は第三号様式が主なので、第三号様式を見てみます。これを見ると、表紙の会社名は名称空間 jpcrp_cor
の CompanyNameCoverPage
という要素名だとわかります。
実際にこのタグを指定して抽出すると、値が取れていることがわかります。
報告様式自体も、タグを指定して取得可能です。提出処理に関する情報の定義はDEI(Document and Entity Information)タクソノミと呼ばれます。
実装はこちらになります。
コンテキストの読み取り
要素の値を読み取っただけでは、それがいつの値か、どんな単位かわかりません。そこで、コンテキストの読み取りを行います。 連結経営指標上の売上高であるjpcrp_cor:NetSalesSummaryOfBusinessResults
のコンテキスト情報を見てみます。
<jpcrp_cor:NetSalesSummaryOfBusinessResults contextRef="Prior4YearDuration" unitRef="JPY" decimals="-6">2455249000000</jpcrp_cor:NetSalesSummaryOfBusinessResults>
contextRef
が Prior4YearDuration
となっています。コンテキストのタグであるxbrli:context
からidがPrior4YearDuration
であるものを探すと、以下のように定義されています。
<xbrli:context id="Prior4YearDuration">
<xbrli:entity>
<xbrli:identifier scheme="http://disclosure.edinet-fsa.go.jp">E22559-000</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:startDate>2014-01-01</xbrli:startDate>
<xbrli:endDate>2014-12-31</xbrli:endDate>
</xbrli:period>
</xbrli:context>
実体としては2014/1/1から2014/12/31、報告年が2018年度なので4年前の売上であることがわかります。Priorなどの名前から推定できたように、コンテキストの名前付けにはルールがあります。「報告書インスタンスの作成: 5–4 コンテキストの定義」に詳細なルールが記載されています。ルールにのっとっているため、コンテキストのidのみからでも推定は可能です。
コンテキストidのみから判断できることもあります。idにNonConsolidatedMemberがつく場合は個別決算、それ以外は連結になります。Prior4YearDuration
も、個別決算用にPrior4YearDuration_NonConsolidatedMember
`というコンテキストが別に存在します(同上の「5–4–1 コンテキスト ID の命名規約」より)。
period
の種類は、期間(startData
/ endData
)と時点(instant
)の2種類があります(同上の「5–4–4 期間時点要素の設定」より)。
contextRef
と同様に、unitRef
から単位の情報が取得可能です。ただ、プラスマイナスの符号(sign
)や表示単位(scale
)は単位の情報には含まれず、タグに直接属性として書かれています。
要素の値とコンテキストの情報双方を読み取ることで、以下のように時系列の値を取得できます。
実装はこちらになります。
ディメンジョンの読み取り
ディメンジョンは表の「軸」を表します。「軸」は横軸か縦軸かのどちらかです。以下はディメンジョンが横軸、各行要素が「表示項目」の例です。
ディメンジョンが横軸の例
ディメンジョンが横軸のケースを見てみましょう。以下のタグは、要素が jppfs_cor:NetAssets
(純資産)で、コンテキストとして CurrentYearInstant_NonConsolidatedMember_ShareholderEquityMember
が設定されています。
<jppfs_cor:NetAssets contextRef="CurrentYearInstant_NonConsolidatedMember_ShareholdersEquityMember" unitRef="JPY" decimals="-6">740191000000</jppfs_cor:NetAssets>
CurrentYearInstant_NonConsolidatedMember_ShareholderEquityMember
には、以下のようにディメンジョンが設定されています。
<xbrli:context id="CurrentYearInstant_NonConsolidatedMember_ShareholdersEquityMember">
<xbrli:entity>
<xbrli:identifier scheme="http://disclosure.edinet-fsa.go.jp">E22559-000</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:instant>2018-12-31</xbrli:instant>
</xbrli:period>
<xbrli:scenario>
<xbrldi:explicitMember dimension="jppfs_cor:ConsolidatedOrNonConsolidatedAxis">jppfs_cor:NonConsolidatedMember</xbrldi:explicitMember>
<xbrldi:explicitMember dimension="jppfs_cor:ComponentsOfEquityAxis">jppfs_cor:ShareholdersEquityMember</xbrldi:explicitMember>
</xbrli:scenario>
</xbrli:context>
ディメンジョンはシナリオ(scenario
)で定義されています。ディメンジョンとして定義されているのは以下2つです。
- 軸
jppfs_cor:ConsolidatedOrNonConsolidatedAxis
のメンバーjppfs_cor:NonConsolidatedMember
である。 - 軸
jppfs_cor:ComponentsOfEquityAxis
のメンバーjppfs_cor:ShareholdersEquityMember
である。
1のjppfs_cor:ConsolidatedOrNonConsolidatedAxis
は連結/個別を表すための特殊な軸です(表の繰り返しにディメンションを使う例に相当します)。個別財務諸表に含まれる要素には、メンバーとして NonConsolidatedMember
を指定します(報告書インスタンス作成ガイドライン 5–4–5–1より)。このタイプは実際に軸としては表示されません。
2は実際に軸として現れます。タグの値 740191000000
は、jppfs_cor:ComponentsOfEquityAxis
=株主資本の内訳を表す軸の、jppfs_cor:ShareholdersEquityMember
=株主資本の値、と解釈できます。
では、軸(Axis)に沿って各列(Member)の値を抽出してみましょう。同じ軸が設定されたコンテキストを取得し、そのメンバー定義からメンバー、コンテキストが設定されたタグから値を取得します。軸(ディメンジョン)はコンテキストの子要素なので、子要素の値を指定して選択を行うことになります。これにはXPathを使うと便利です。
最終的に、以下のように値が取れます。右側の value
が、上図の最下行の値と対応していることがわかると思います。
実装は以下になります。
ディメンジョンが縦軸の例
ディメンジョンが縦軸の場合は、横軸と逆になります(当然ですが)。こちらもディメンジョンが同一のコンテキスト、コンテキストのメンバー、コンテキストが付与されたタグの値、という流れで値の取得が可能です。以下が実際に取得した結果ですが、右端の値が上図の値に一致していることがわかります、
実装は以下になります。
ただ、タグの名前だけでは何の値なのかわかりにくいです。テキストのラベルを付けるには、Part3で扱うタクソノミ文書の情報が必要です。
注釈の読み取り
文書や数値に対しては、注釈をつけることができます(以下の※2や※7など)。
注釈される側にはidをつけておきます(以下の場合、 3841000000
という数値にIdFact77552275
を付与)。
<jppfs_cor:AccountsReceivableTrade id="IdFact775522775" contextRef="Prior1YearInstant_NonConsolidatedMember" unitRef="JPY" decimals="-6">3841000000</jppfs_cor:AccountsReceivableTrade>
注釈は以下のように定義します。値「3841000000
」と注釈「※2」とが、 link:loc
で結びついていることがわかります。
<link:footnoteLink xlink:role="http://disclosure.edinet-fsa.go.jp/role/jppfs/rol_BalanceSheet" xlink:type="extended"> <link:footnote xlink:label="footnote" xlink:role="http://disclosure.edinet-fsa.go.jp/role/jppfs/role/NotesNumber" xlink:type="resource" xml:lang="ja">※2</link:footnote> <link:loc xlink:label="fact" xlink:type="locator" xlink:href="#IdFact775522775"/> <link:footnoteArc xlink:from="fact" xlink:to="footnote" xlink:type="arc" xlink:arcrole="http://www.xbrl.org/2003/arcrole/fact-footnote"/></link:footnoteLink>
ただ、「※2」のテキストが何なのか?はわかりません(!?)。※2がどうなっているかというと・・・
何のタグ付けもされずに浮いています。注記は Notes
から始まるタグで定義されるので、注記のタグを全部洗って該当する※を探せば何とかなるかもしれません。ただ、注記の番号は以下のように使いまわしがあるのでコンテキストを加味する必要もあります。
注記は勘定の明細などが書かれている重要な情報ですので、簡単に取れるようにしてほしいところです。
以上が、インスタンス文書からの情報抽出になります。インスタンス文書のみでは、情報を抽出するタグを把握している必要があったり、抽出してもタグの名称がわからないといった課題がありました。どんな情報を記載すべきか、またタグの名称は何なのかはタクソノミ文書に記載されています。Part3では、このタクソノミ文書を使って情報を抽出する処理を紹介します。