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

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

PythonでEDINETのXBRLを分析する その6「スキーマファイルを読み込み、要素を分類する」

はじめに

前回はXBRLの表示構造を調べました。その結果、XBRLに要素がどんな順番で並んでいるのかわかりました。

しかし、各要素の分類についてはまだわかっていません。

分類とは例えば以下のようなものです。

  • 数値(売上、利益、現預金の額など)
  • テキスト(事業概要などの説明など)
  • タイトル項目(流動資産、固定資産など、要素をグループにまとめるための要素で値の紐づけはない)
  • 軸、メンバー(財務諸表等の主に列構造を定義する)

 
分類がわからないとXRBLからどのようにして値を取得したらよいか(要素はテキストなのか数値なのか、値の紐づけがあるのかないのか)わからないので、調べる必要があります。


要素の分類を知るための情報はスキーマファイルに記載されているので、今回はそれを読み込んでいきます。

関連記事

EDINETのXBRLを分析する大まかな流れを説明しています。

開発環境

  • windows 10 home
  • python 3.7.4
  • K2Editor(テキストエディタ) + コマンドプロンプト

 

使用したpythonの外部ライブラリ

少なくとも以下の外部ライブラリを利用しているのでインストールしていなければpipコマンドでインストールしてください。

  • pysqlite3
  • requests
  • beautifulsoup4
  • lxml

 

スキーマファイルの構造概要

各要素の詳細情報はスキーマファイルと呼ばれるファイルに記載されています。


スキーマファイルはダウンロードしたXBRLの中にあるファイル名が「jpcrp030000-asr-001_E31037-000_2015-12-31_01_2016-03-30.xsd」のように「.xsd」で終わるファイルのことです。また、スキーマファイルはEDINETのサーバ上にも存在しています。


スキーマファイルのおおよその構造は以下の通りです。

<import A>・・・他のスキーマファイルへの参照を定義
<import B>
・・・

<linkbaseRef A>・・・リンクベースファイルへの参照を定義
<linkbaseRef B>
・・・

<element A>・・・XBRL中の要素を定義
<element B>
・・・

 
先頭に他ファイルへの参照定義が並んでいて、その下にXBRLに存在する要素の定義があります。構造は正確ではないですが、大体こんな感じだとおもってくれていいです。

element 要素の説明

element要素には有価証券報告書に存在する要素の定義が書かれています。以下はelement要素の具体例です。一つだけ抜粋しています。

<element id="jpcrp030000-asr_E31037-000_Mold" 
                 xbrli:balance="debit"
                 xbrli:periodType="instant"
                 abstract="false"
                 name="Mold"
                 nillable="true"
                 substitutionGroup="xbrli:item"
                 type="xbrli:monetaryItemType" />
・・・

 
id属性が表示リンクベースファイルに記載されたid属性の値と一致しているので、id属性の値を用いてスキーマファイルを検索することで各要素の詳細情報を取得することが出来ます。

上記の例では

  • abstractがfalseなので値の紐づけがあり
  • typeがxbrli:monetaryItemTypeなので金額を表す値

であることがわかります。


各属性についてはEDINET上に公開されている文書に説明があります。具体的には「EDINET タクソノミの設定規約書」を読めばよいです。以下はその抜粋です。






EDINET タクソノミの設定規約書 p22、p23、p28より引用

 

要素の分類が何であるかは属性の組み合わせからわかります。そこら辺の規則についても「EDINET タクソノミの設定規約書」に記載があります。以下は抜粋です。






EDINET タクソノミの設定規約書 p23 ~p27より引用

 
上記に加えて、abstract属性がfalseでtype属性が数値であるものを「数値」、typeが文字であるものを「文字」として判定したらよいです。


おおよそですが各要素を以下のように分類できれば、実用上問題ないでしょう。

分類 説明 値の有無
heading 目次 ×
table テーブル ×
axis ×
member メンバー ×
line_item ラインアイテム ×
number 数値
text_block 文字列のかたまり
text 文字列
date 日時
abstract タイトル ×

 

また、分類の判別とは別にelement要素のperiodType属性は保存しておいてください。後の値取得処理で使うので。

スキーマファイルの読み込み処理

ソースコードはここに公開しています。このソースは日本語名称の読み込みまで実施しているので、必要な部分だけ拾って読んでください。

具体的な処理はXBRLAnalysis.pyの419行目以降に記載しています。


以下が実行結果です。

(None)rol_ConsolidatedStatementOfIncome
     (heading)jppfs_cor_ConsolidatedStatementOfIncomeHeading
          (table)jppfs_cor_StatementOfIncomeTable
               (axis)jppfs_cor_ConsolidatedOrNonConsolidatedAxis
                    (member)jppfs_cor_ConsolidatedMember
          (line_items)jppfs_cor_StatementOfIncomeLineItems
               (number)jppfs_cor_NetSales
               (number)jppfs_cor_CostOfSales
               (number)jppfs_cor_GrossProfit
               (number)jppfs_cor_SellingGeneralAndAdministrativeExpenses
               (number)jppfs_cor_OperatingIncome
               (title)jppfs_cor_NonOperatingIncomeAbstract
                    (number)jppfs_cor_InterestIncomeNOI
                    (number)jppfs_cor_DividendsIncomeNOI
                    (number)jppfs_cor_ForeignExchangeGainsNOI
                    (number)jppfs_cor_SubsidyIncomeNOIBounty
                    (number)jppfs_cor_OtherNOI
                    (number)jppfs_cor_NonOperatingIncome
               (title)jppfs_cor_NonOperatingExpensesAbstract
                    (number)jppfs_cor_InterestExpensesNOE
                    (number)jppfs_cor_StockIssuanceCostNOE
                    (number)jppfs_cor_OtherNOE
                    (number)jppfs_cor_NonOperatingExpenses
               (number)jppfs_cor_OrdinaryIncome
               (title)jppfs_cor_ExtraordinaryIncomeAbstract
                    (number)jppfs_cor_GainOnSalesOfNoncurrentAssetsEI
                    (number)jppfs_cor_GainOnSalesOfInvestmentSecuritiesEI
                    (number)jppfs_cor_ExtraordinaryIncome
               (title)jppfs_cor_ExtraordinaryLossAbstract
                    (number)jppfs_cor_LossOnSalesOfNoncurrentAssetsEL
                    (number)jppfs_cor_LossOnRetirementOfNoncurrentAssetsEL
                    (number)jppfs_cor_ImpairmentLossEL
                    (number)jppfs_cor_ExtraordinaryLoss
               (number)jppfs_cor_IncomeBeforeIncomeTaxes
               (number)jppfs_cor_IncomeTaxesCurrent
               (number)jppfs_cor_IncomeTaxesDeferred
               (number)jppfs_cor_IncomeTaxes
               (number)jppfs_cor_IncomeBeforeMinorityInterests
               (number)jppfs_cor_NetIncome


要素を分類することが出来ました。
 

ディメンション要素についての説明

要素の分類のうち

  • table
  • axis
  • member
  • line_item

については理解しにくいと思うのでここで説明します。

table、axis、member、line_itemをディメンション要素と呼んでいます。これらの要素の役割はデータの多次元構造を定義することです。以下は各分類の説明です。

分類 説明
table テーブル要素。軸要素の親
axis 軸要素。列方向の奥行、または連結or単体方向の奥行を定義するメンバー要素の親
member メンバー要素。列方向の奥行に何があるのか、また、データが連結のデータなのか単体のデータなのかを表す
line_item ラインアイテム要素。行要素の親


かなり抽象的な概念なので具体例を出します。以下は連結株主資本等変動計算書の読み込み結果です。ここでは説明のため日本語名称まで読み込んでいます。

(None)rol_ConsolidatedStatementOfChangesInEquity(None)
     (heading)jppfs_cor_ConsolidatedStatementOfChangesInEquityHeading(連結株主資本等変動計算書)
          (table)jppfs_cor_StatementOfChangesInEquityTable(連結株主資本等変動計算書)
               (axis)jppfs_cor_ConsolidatedOrNonConsolidatedAxis(連結個別)
                    (member)jppfs_cor_ConsolidatedMember(連結)
               (axis)jppfs_cor_ComponentsOfEquityAxis(純資産の内訳項目)
                    (member)jppfs_cor_NetAssetsMember(純資産合計)
                         (member)jppfs_cor_ShareholdersEquityMember(株主資本合計)
                              (member)jppfs_cor_CapitalStockMember(資本金)
                              (member)jppfs_cor_CapitalSurplusMember(資本剰余金合計)
                              (member)jppfs_cor_RetainedEarningsMember(利益剰余金合計)
                              (member)jppfs_cor_TreasuryStockMember(自己株式)
                         (member)jppfs_cor_ValuationAndTranslationAdjustmentsMember(その他の包括利益累計額合計)
                              (member)jppfs_cor_ValuationDifferenceOnAvailableForSaleSecuritiesMember(その他有価証券評価差額金)
                              (member)jppfs_cor_ForeignCurrencyTranslationAdjustmentMember(為替換算調整勘定)
                              (member)jppfs_cor_RemeasurementsOfDefinedBenefitPlansMember(退職給付に係る調整累計額)
          (line_items)jppfs_cor_StatementOfChangesInEquityLineItems(連結株主資本等変動計算書)
               (number)jppfs_cor_NetAssets(当期首残高)
               (number)jppfs_cor_CumulativeEffectsOfChangesInAccountingPolicies(会計方針の変更による累積的影響額)
               (number)jppfs_cor_RestatedBalance(会計方針の変更を反映した当期首残高)
               (title)jppfs_cor_ChangesOfItemsDuringThePeriodAbstract(当期変動額)
                    (number)jppfs_cor_IssuanceOfNewShares(新株の発行)
                    (number)jppfs_cor_DividendsFromSurplus(剰余金の配当)
                    (number)jppfs_cor_NetIncome(当期純利益)
                    (number)jppfs_cor_PurchaseOfTreasuryStock(自己株式の取得)
                    (number)jppfs_cor_NetChangesOfItemsOtherThanShareholdersEquity(株主資本以外の項目の当期変動額(純額))
                    (number)jppfs_cor_TotalChangesOfItemsDuringThePeriod(当期変動額合計)
               (number)jppfs_cor_NetAssets(当期末残高)

 

以下は実際の連結株主資本等変動計算書です。


竹本容器 第65期 有価証券報告書 p43より引用

 
まず、軸「(axis)jppfs_cor_ConsolidatedOrNonConsolidatedAxis(連結個別)」が連結なのか単体なのかを定義しています。この例だと軸の子としてメンバー「(member)jppfs_cor_ConsolidatedMember(連結)」が存在しているため連結のデータだとわかります。


次に、軸「 (axis)jppfs_cor_ComponentsOfEquityAxis(純資産の内訳項目)」が連結株主資本等変動計算書の横方向の項目を定義しています。この例だと軸の子要素から

  • 純資産合計
  • 株主資本合計
  • 資本金
  • 資本剰余金合計
  • 利益剰余金合計
  • 自己株式
  • その他の包括利益累計額合計
  • その他有価証券評価差額金
  • 為替換算調整勘定
  • 退職給付に係る調整累計額

が横方向の項目として存在しているとわかります。


最後に、ラインアイテム「(line_items)jppfs_cor_StatementOfChangesInEquityLineItems(連結株主資本等変動計算書)」が連結株主資本等変動計算書の縦方向の項目を定義しています。この例だとラインアイテムの子要素から

  • 当期首残高
  • 会計方針の変更による累積的影響額
  • 会計方針の変更を反映した当期首残高
  • 当期変動額
  • 新株の発行
  • 剰余金の配当
  • 当期純利益
  • 自己株式の取得
  • 株主資本以外の項目の当期変動額(純額)
  • 当期変動額合計
  • 当期末残高

が縦方向の項目として存在しているとわかります。


このようにしてディメンション要素はXRBLの多次元構造を表現しています。

おわりに

スキーマファイルを調べることで、各要素を分類することが出来ました。次回は各要素の日本語名称を取得します。


次回の記事です。
www.quwechan.com


今回はここまでです。