プログラミングと株式投資のブログ

プログラミングで株式投資に役立つ何かをやってます

PythonでEDINETのXBRLを分析する その9「有価証券報告書の構造を取得する(計算リンクベースファイル編)」

はじめに

前回までで有価証券報告書のXBRL(EDINET)から値を取得する方法についてはおおよそ説明してしまいました。今後はこれまでの記事の補足だったり、単発的な内容をお話ししていきたいと思います。


今回は計算リンクベースファイルを用いてXBRLの構造を取得してみます。ただし、計算リンクベースファイルからは基本的に財務諸表の構造しか取得できないので注意が必要です。また、過去の記事で表示リンクベースファイルを用いたやり方を説明していますので併せてご覧ください。


www.quwechan.com
 

なぜ計算リンクベースファイルを用いるのか

過去の記事で説明したように表示リンクベースファイルからもXBRLの構造は取得可能です。ですが表示リンクベースファイルを用いて財務諸表の構造を取得しようと思うと不便なケースが多々あります。これを計算リンクベースファイルを用いることで回避したいというのが今回の記事の趣旨です。


過去にわたしが実際に遭遇した不便なケースについてをいくつかご紹介します。

同一階層内の要素に合算値が含まれている(ほぼ必ず)

表示リンクベースファイルはあくまでも表示構造を定義しているだけなので特定の勘定項目を取得しようとするとその中に合算値が含まれてしまうことが多々あります。ちなみにこれは定義リンクベースファイルでも同様です(EDINETでは定義リンクベースファイルと表示リンクベースファイルの構造は基本的には同じになっています)。


以下は流動資産の表示構造の例です。

 (title)jppfs_cor_CurrentAssetsAbstract(流動資産)
          (number)jppfs_cor_CashAndDeposits(現金及び預金)
          (number)jppfs_cor_NotesAndAccountsReceivableTrade(受取手形及び売掛金)
          (number)jppfs_cor_NotesAndAccountsReceivableTradeAndContractAssets(受取手形、売掛金及び契約資産)
          (number)jppfs_cor_MerchandiseAndFinishedGoods(商品及び製品)
          (number)jppfs_cor_WorkInProcess(仕掛品)
          (number)jppfs_cor_RawMaterialsAndSupplies(原材料及び貯蔵品)
          (number)jppfs_cor_OtherCA(その他)
          (number)jppfs_cor_AllowanceForDoubtfulAccountsCA(貸倒引当金)
          (number)jppfs_cor_CurrentAssets(流動資産合計)

 
この例では 流動資産中の要素と合算値が同じ階層に存在しており、流動資産の勘定項目のみを取得するためには合計値を識別し取り除く必要があります(ほとんどの場合そう)。


計算リンクベースファイルから取得した構造は以下のようになっており、このような問題は発生しません。親要素が合算値、子要素がそれを求めるために必要な要素となっており、流動資産の勘定項目のみを取得するのは容易です。

(number)jppfs_cor_CurrentAssets(流動資産)
          (number)jppfs_cor_CashAndDeposits(現金及び預金)[1.0]
          (number)jppfs_cor_NotesAndAccountsReceivableTrade(受取手形及び売掛金)[1.0]
          (number)jppfs_cor_NotesAndAccountsReceivableTradeAndContractAssets(受取手形、売掛金及び契約資産)[1.0]
          (number)jppfs_cor_MerchandiseAndFinishedGoods(商品及び製品)[1.0]
          (number)jppfs_cor_WorkInProcess(仕掛品)[1.0]
          (number)jppfs_cor_RawMaterialsAndSupplies(原材料及び貯蔵品)[1.0]
          (number)jppfs_cor_OtherCA(その他)[1.0]
          (number)jppfs_cor_AllowanceForDoubtfulAccountsCA(貸倒引当金)[1.0]

 

あるべきはずの階層構造がないことがある(時々)

あるべきはずの階層構造がないケースもあります。以下は損益計算書の販売費及び一般管理費の表示構造の例です。

(number)jppfs_cor_NetSales(売上高)
(number)jppfs_cor_CostOfSales(売上原価)
(number)jppfs_cor_GrossProfit(売上総利益)[http://www.xbrl.org/2003/role/positiveLabel]
(title)jppfs_cor_SellingGeneralAndAdministrativeExpensesAbstract(販売費及び一般管理費)
(number)jppfs_cor_PromotionExpensesSGA(販売促進費)
(number)jpcrp030000-asr_E00385-000_ProvisionForSalesPromotionExpensesSGA(販売促進引当金繰入額)
(number)jppfs_cor_AdvertisingExpensesSGA(広告宣伝費)
(number)jpcrp030000-asr_E00385-000_WarehousingAndDistributionExpensesSGA(保管配送費)
(number)jppfs_cor_SalariesAndAllowancesSGA(給料及び手当)
(number)jppfs_cor_ProvisionForBonusesSGA(賞与引当金繰入額)
(number)jppfs_cor_ProvisionForDirectorsBonusesSGA(役員賞与引当金繰入額)
(number)jppfs_cor_RetirementBenefitExpensesSGA(退職給付費用)
(number)jppfs_cor_DepreciationSGA(減価償却費)
(number)jppfs_cor_ResearchAndDevelopmentExpensesSGA(研究開発費)
(number)jppfs_cor_OtherSGA(その他)
(number)jppfs_cor_SellingGeneralAndAdministrativeExpenses(販売費及び一般管理費合計)[http://www.xbrl.org/2003/role/totalLabel]
(number)jppfs_cor_OperatingIncome(営業利益)[http://www.xbrl.org/2003/role/positiveLabel]

 
販売費及び一般管理費の勘定項目が売上や原価と同じ階層に存在しており、どれが販売費及び一般管理費の勘定項目なのかを識別するのが困難です(毎回そうというわけではないがこういったケースも存在する)。これも計算リンクベースファイルでは以下のように解消されています。

(number)jppfs_cor_SellingGeneralAndAdministrativeExpenses(販売費及び一般管理費)
              (number)jppfs_cor_PromotionExpensesSGA(販売促進費)[1.0]
              (number)jpcrp030000-asr_E00385-000_ProvisionForSalesPromotionExpensesSGA(販売促進引当金繰入額)[1.0]
              (number)jppfs_cor_AdvertisingExpensesSGA(広告宣伝費)[1.0]
              (number)jpcrp030000-asr_E00385-000_WarehousingAndDistributionExpensesSGA(保管配送費)[1.0]
              (number)jppfs_cor_SalariesAndAllowancesSGA(給料及び手当)[1.0]
              (number)jppfs_cor_ProvisionForBonusesSGA(賞与引当金繰入額)[1.0]
              (number)jppfs_cor_ProvisionForDirectorsBonusesSGA(役員賞与引当金繰入額)[1.0]
              (number)jppfs_cor_RetirementBenefitExpensesSGA(退職給付費用)[1.0]
              (number)jppfs_cor_DepreciationSGA(減価償却費)[1.0]
              (number)jppfs_cor_ResearchAndDevelopmentExpensesSGA(研究開発費)[1.0]
              (number)jppfs_cor_OtherSGA(その他)[1.0]

 

表示構造に誤りがあることが時々ある

表示構造が誤っていることも時々あります。EDINETに関しては有価証券報告書の財務諸表を5年分、全銘柄調べてみたのですが大体2%くらい(数値は感覚的なものですが)は何かしらの構造誤りがあったように記憶しています。


以下は「売上総利益の子要素として販管費及び一般管理費が存在するケース」で明らかに構造が誤っています。

(number)jppfs_cor_GrossProfit(売上総利益)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_PackingAndTransportationExpensesSGA(荷造運搬費)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_ProvisionOfAllowanceForDoubtfulAccountsSGA(貸倒引当金繰入額)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_CompensationsSalariesAndAllowancesSGA(報酬及び給料手当)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_RetirementBenefitExpensesSGA(退職給付費用)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_ProvisionForBonusesSGA(賞与引当金繰入額)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_ProvisionForDirectorsRetirementBenefitsSGA(役員退職慰労引当金繰入額)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_LegalWelfareExpensesSGA(法定福利費)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_DepreciationSGA(減価償却費)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_ResearchAndDevelopmentExpensesSGA(研究開発費)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_AmortizationOfGoodwillSGA(のれん償却額)[http://www.xbrl.org/2003/role/positiveLabel]
         (number)jppfs_cor_OtherSGA(その他)[http://www.xbrl.org/2003/role/positiveLabel]
(number)jppfs_cor_SellingGeneralAndAdministrativeExpenses(販売費及び一般管理費)[http://disclosure.edinet-fsa.go.jp/jppfs/Consolidated/role/label]


他にも有形固定資産内に無形固定資産の勘定項目が紛れ込んでいたり、色々なケースの誤りがあります。数件確認しただけですが計算リンクベースファイルでは正されていました。


こういった理由から財務諸表の構造を取得する際は計算リンクベースファイルを用いたほうが良いのではないかと考えました。
 

計算リンクベースファイルの構造概要

有価証券報告書の計算構造(特定の要素の値が他のどの要素の合算となっているか)は計算リンクベースファイルと呼ばれるファイルに記載されています。ただし、すべての計算構造を保持しているわけではなく、貸借対照表・損益計算書・キャッシュフロー計算書などの財務諸表についてのみ計算構造が定義されています。


計算リンクベースファイルはダウンロードしたXBRLの中にあるファイル名が「jpcrp030000-asr-001_E00696-000_2019-03-31_01_2019-06-27_cal.xml」のように「cal.xml」で終わるファイルのことです。


計算リンクベースファイルのおおよその構造は以下の通りです。

<roleRef A>・・・有報に存在する大項目
<roleRef B>
・・・
<calculationLink A> ・・・Aという大項目の計算構造を定義
  <loc elm1> ・・・elm1が存在することを定義
  <loc elm2>
  <calculationArc>・・・ elm1とelm2の計算関係、足し合わせの際の重みを定義
<\calculationLink>

<calculationLink B>
  <loc elm3>
  <loc elm4>
  <calculationArc>
<\calculationLink>

 
先頭に有価証券報告書に存在する大項目が並んでいて、その大項目内の計算構造がその下に続いています。大項目内の計算構造はlocとcalculationArcによって要素の存在と計算関係、足し合わせの際の重みが定義されています。

roleRef要素の説明

roleRef要素については過去の記事で既に説明しているのでここでは飛ばします。

calculationLink要素の説明

calculationLink要素(と子要素であるloc要素、calculationArc要素)は有価証券報告書の大項目の計算構造を定義します。


calculationLink要素がどの大項目の構造なのかを表し、その子要素であるloc要素とcalculationArc要素が計算構造を定義しています。


以下はcalculationLink要素の具体例です。一つだけ抜粋しています。

<link:calculationLink
  xlink:type="extended" 
  xlink:role="http://disclosure.edinet-fsa.go.jp/role/jppfs/rol_ConsolidatedBalanceSheet">

(以下に子要素が続く)
・・・
</link:calculationLink>

 f
role属性がどの大項目の構造であるかを表しています。上記の場合「http://disclosure.edinet-fsa.go.jp/role/jppfs/rol_ConsolidatedBalanceSheet」であるため、連結貸借対照表の構造であるとわかります。



以下はloc要素とcalculationArc要素(上記のcalculationLink要素の子要素)です。最低限の数だけ抜粋しています。

<link:loc xlink:type="locator"
  xlink:href="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2022-11-01/jppfs_cor_2022-11-01.xsd#jppfs_cor_CurrentAssets"
  xlink:label="jppfs_cor_CurrentAssets"/>

<link:loc xlink:type="locator"
  xlink:href="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2022-11-01/jppfs_cor_2022-11-01.xsd#jppfs_cor_CashAndDeposits"
  xlink:label="jppfs_cor_CashAndDeposits"/>

<link:calculationArc xlink:type="arc"
  xlink:from="jppfs_cor_CurrentAssets"
  xlink:to="jppfs_cor_CashAndDeposits"
  xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
  order="1"
  weight="1"/>


loc要素が大項目に存在する項目を定義しています。label属性は表示リンクベースファイル内での項目名称、href属性は項目の定義が存在するスキーマファイルおよび要素をそれぞれ定義しています。

上記の例でいうと、jppfs_cor_CurrentAssetsという名前の項目が存在し、jppfs_cor_CurrentAssetsの定義はスキーマファイル「http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2022-11-01/jppfs_cor_2022-11-01.xsd」のidが「jppfs_cor_CurrentAssets」となる要素に書かれているとわかります。


calculationArc 要素が項目間の関係を定義しています。arcrole属性が「http://www.xbrl.org/2003/arcrole/summation-item」であるため、関係が合計値と合計値を求めるための要素の関係であるとわかります。from属性が「合計値」、to属性が「合計値を求めるための要素」をそれぞれ定義しています。order属性は要素が何番目に加算されるのかを定義しています。weight属性は加算時の重みを定義しています。weightが1.0ならそのまま加算し、-1.0なら減算します。

上記の例でいうと、jppfs_cor_CurrentAssets(流動資産)が合算値であり、これを求めるためにはjppfs_cor_CashAndDeposits(現金)をそのまま足し合わせればよいとわかります。


計算リンクベースファイルの読み込み方法について

計算リンクベースファイル中のcalculationLink要素および子要素を順序付きの木構造に読み込めばよいです。表示リンクベースファイルの場合と同様に木構造が分割されていたら結合して読み込み必要があります。しかし、必ずしも単一の木構造とはなりません。
 

インスタンスファイルから値を取得する際の注意点

構造がわかったので各要素の値をXBRLインスタンスファイルから読み込みたいところですが、計算リンクベースファイルにはディメンション情報が存在しないためコンテキストを決定することができず、これ単体では値を取得することが出来ません。

したがって、値の取得自体は表示リンクベースファイルや定義リンクベースファイルを用いて行い、取得した値を計算リンクベースファイルの各要素に設定することになります。

実装

ここのリポジトリにソースコードを置いています。

やっていることは単純で

  1. 定義リンクベース、表示リンクベースを元に値を取得
  2. 計算リンクベースを元に連結貸借対照表の構造を取得
  3. 連結貸借対照表の構造に1で取得した値を転記

しているだけです。
 

おわりに

表示リンクベースファイルから財務諸表の構造を取得すると色々不便なケースがあるため、計算リンクベースファイルを用いて構造を取得してみました。

計算リンクベースファイルを用いた財務諸表の構造取得に問題がないか(計算構造が誤っているケースはないのか、計算リンクベースファイル特有の問題はないのか)は今のところ分かっていないので、EDINETのXBRLを実際に分析して確認してみようと思っています。


今回はここまでです。