13
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【R】 XBRLから財務諸表項目を吸い上げる

Last updated at Posted at 2020-01-13

1. 趣旨

前回: よく分からないXBRLをざっくり理解したい男たち!!

これの続きとして、XBRLをデータとしてRで具体的にどう処理するか、やってみました。
結論から言えば、XML文書と全く同じ取り扱いができます。

2. 今回の目標

前回の記事で「現金及び預金」の要素名などが分かったところで、今回はその数値情報をRで吸い取ってみたいと思います。

より厳密には、以下の3つの条件に合致するデータを取得します。

  • 連結上の
  • 当期末の
  • 「現金及び預金」計上額

2-1. 対象

前回と同じです。公式サンプルを利用します。

2020年版EDINETタクソノミの公表について:金融庁

  • 3. 公表資料 > (1)EDINETタクソノミ関連 > (h)サンプルインスタンス(ZIP)をダウンロード・展開。
  • サンプルインスタンス\ダウンロードデータ\02_開示府令-有価証券報告書\S002XXXX\XBRL\PublicDoc\jpcrp030000-asr-001_X99001-000_2020-03-31_01_2020-06-28.xbrlを分析する。

2-2. 復習

XBRL本体(インスタンス)での現金及び預金の記述は、以下の通りです。

4301行目
  <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">95111000000</jppfs_cor:CashAndDeposits>

つまり、この「95111000000」という数値が抽出できれば成功です。

3. コード

> library(xml2) 
> xbrl <- read_xml("jpcrp030000-asr-001_X99001-000_2020-03-31_01_2020-06-28.xbrl")
> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' ) %>% xml_text()
[1] "95111000000"

4. 解説

4-1. xml2パッケージ

XML形式のファイルを操作するためには、xml2パッケージが必要になります。
そしてXBRLはXMLの派生形なので、なんとこのパッケージで操作できます。やったね。

持っていない方は入れておきましょう。

> install.packages("xml2")
> library(xml2)

4-2. XBRLファイルの読み込み

xml2パッケージ内のread_xml()関数は、XMLファイルを読み込んでR上で操作・分析できるようにしてくれます。
通常、引数にはXMLファイルが来るところを、今回はXBRLファイルを引数に設定します

> xbrl <- read_xml("jpcrp030000-asr-001_X99001-000_2020-03-31_01_2020-06-28.xbrl")

これをxbrlオブジェクトとして格納しておきます。

4-3. 要素・テキストの抽出

流れはrvestパッケージと同じです。
すなわち、**「要素を抽出⇒要素内のテキスト部分だけを抽出」**ということをやればOKです。

参考: [RでQiitaの記事を取得しよう - Qiita]
(https://qiita.com/zakkiiii/items/18b177f332bf90c65fdb#%E7%89%B9%E5%AE%9A%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%AE%E6%8A%BD%E5%87%BA)

4-3-1. 要素の抽出

> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' )
{xml_nodeset (1)}
[1] <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">95111000000</jppfs_cor:CashA ...

xml_find_all()は、xpathの条件に合致する要素をリスト形式で全部抜き出してくれる関数です。
xpathとは、XBRL文書(インスタントといいます)内の要素を参照するときのパスです。

4-3-1-1. xpathの設定

恐らくこの記事の中で一番難しいのがココです
頑張りましょう。

「有価証券報告書の分析」という目的の達成のためだけであれば、xpathに対して深い理解は不要です。
ようは、xpathとは、「現金及び預金」、「売上高」といった要素が文書全体のどこにあるかを特定するためのパスです

4-3-1-2. XBRL上のxpathの雛型

財務諸表項目であれば、基本的にコレで行けると思います。

xpath = '//名前空間:要素名[@contextRef = "年度・期間、連結の特定"]'
4-3-1-2-1. 名前空間・要素名

以下の記事を参考に、名前空間と要素名を特定してください。
よく分からないXBRLをざっくり理解したい男たち!! - Qiita

例えば、現金であればjppfs_cor:CashAndDeposits、売上高であればjppfs_cor:NetSalesになります。
しかし、この後すぐ説明するcontextRef属性を設定しないと、色んな「現金及び預金」(前年度のものや単体のもの)が抽出されてしまいます

> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits')
{xml_nodeset (4)}
[1] <jppfs_cor:CashAndDeposits contextRef="Prior1YearInstant" unitRef="JPY" decimals="-6">78030000000</jppfs_cor:CashAn ...
[2] <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">95111000000</jppfs_cor:CashA ...
[3] <jppfs_cor:CashAndDeposits contextRef="Prior1YearInstant_NonConsolidatedMember" unitRef="JPY" decimals="-6">5462000 ...
[4] <jppfs_cor:CashAndDeposits contextRef="CurrentYearInstant_NonConsolidatedMember" unitRef="JPY" decimals="-6">114130 ...

そこで、この中からさらに絞り込みを行うために、抽出する情報をcontextRef属性で特定します。

4-3-1-2-2. contextRef属性

contextRefは、環境を表す属性で、大きく3つの項目1を表現します。

  • どの年度の項目か
  • ストック項目かフロー項目か
  • 連結か単体か
年度・期間の特定
年度(ストック項目) 期間(フロー項目) 記述法
当期末 当期 CurrentYear
当期首 = 前期末 前期 Prior1Year
前期首 = 前々期末 前々期 Prior2Year
ストック / フローの特定
項目の性質 記述法
ストック Instant
フロー Duration

なお、キャッシュフロー計算書は基本的にはフロー項目ですが、現金等の期首残高・期末残高はフロー項目に該当するので注意しましょう。

連結 / 単体の特定
項目の性質 記述法
連結 (不要)
単体 _NonConsolidatedMember

4-3-1-3. xml_find_all()・xpathの記述例

以上の雛型と表を参考にしながら、当期末の現金預金残高を特定しましょう。

環境 欲しい対象 記述法
年度 当期末 CurrentYear
ストック / フロー ストック Instant
連結 / 単体 連結 (不要)

この記述法を**「年度⇒ストック⇒連結」の順番にスペースなしで繋げます**。

@contextRef = "CurrentYearInstant"

なお、前年度の単体の売上高(フロー項目)が必要であれば、以下のようになります。

@contextRef = "Prior1YearDuration_NonConsolidatedMember"

これでcontextRefの記述が完成しました。
以上を雛型に当てはめれば完成です。

> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' )

4-3-1-4. xml_find_all()の留意点

  • シングルクォーテーションとダブルクォーテーションを必ず使い分けてください。どちらか一方で書くと、必ずエラーが発生します。

4-3-2. テキストの抽出

お疲れ様でした。
ここまで来れば簡単です。
xml_text()を使うと、要素からテキストを抽出して返してくれます。

> xml_find_all(xbrl, xpath = '//jppfs_cor:CashAndDeposits[@contextRef = "CurrentYearInstant"]' ) %>% xml_text()
[1] "95111000000"

5. おわりに

ストック / フローを環境属性として設定するメリットが全くないと思うのですけど。

本来、年度と単体 / 連結だけ選べば欲しい情報は十分特定できるはずなんですよ。
「現金及び預金」という要素それ自体がB/S項目として定義されている以上、ストック情報しかないでしょ、と。
現金のフロー情報は別の独立した要素として記録しているのに、何でわざわざストックかフローかを利用者で特定しなければならないのかというね。
偉い人にはそれがわからんのです。

それはさておき、XBRLファイルから財務情報を抽出することができました。
こんな感じで、XBRLファイルはR上でXMLファイルとして扱えますよー、という。

ここまで行ければ、複数ファイルをまとめて分析できるはずです。
ループ関数とか使えば、XBRLをスクレイピングして根こそぎ分析できるようになると思います。

おしまい。

6. 参考文献

外部

自分の作成した記事

  1. 他にも例えばセグメント情報等の場合、セグメントを特定するための項目等が加わりますが、財務諸表の外であること、あまりにも複雑になることから、今回は省略します。

13
18
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
13
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?