EXCELで決算短信XBRLを使った独自の財務DBを作る 〜簡単で実用的なXBRLの活用のすすめ〜

このエッセイでは、決算短信サマリのXBRLを使って、上場企業の財務情報のデータベースを作成するという問題に取り組む。
XBRLの専用ソフトを使わずとも、EXCELだけで十分実用的なデータベースを作れるということがわかる。

XBRLの予備概念

最初に必要な概念をいくつか確認しておこう。
XBRLの正確な仕様はびっくりするほど複雑で難しいが、利用者が理解しなければいけない概念はたった2つしかない。「コンテキスト」と「要素」だ。

XBRLでは、すべての事実がコンテキストと要素の組み合わせで記述されていることを理解しよう。要素は測定される概念で、コンテキストは期間やシナリオのことだ。例えば『X社の2012年3月期の売上高100万円』という事実がXBRLで記述されていたとしよう。この場合「X社の2012年3月期」がコンテキストで、「売上高」が要素となる。

事実 = コンテキスト × 要素

ここで重要なのは、事実はコンテキストと要素の組み合わせでユニーク(一意)になっている、ということだ。

決算短信サマリ

決算短信とは、一般的に決算発表と呼ばれている。現在、上場企業は四半期ごとの決算発表が義務付けられている。決算短信は、東証TDnetで公表することになっていて、直近の31日分ならだれでも自由に閲覧することができる。 その決算短信の冒頭2ページに、重要な係数(売上・利益・配当金など)がまとめられているが、その部分のことを特に「決算短信サマリ」といっている。 TDnetでは決算短信サマリに対していち早くXBRLが適用され、2008年7月から従来のPDFの開示に加えて、XBRLでも開示されるようになった。(現在もPDFとXBRLの2重開示)

決算短信サマリのXBRLには、以下の特長がある。

  • スクリーニングなどに必要十分な、重要な財務データがそろっている
  • 実質的に企業拡張がなく、適切に集約された項目で記述されているため比較しやすい
  • 比較的単純で、データ不正が少ない

では、このような決算短信サマリのデータを使って、財務データベースを作ろう。

ワークシート関数

VBAを使ってXBRLから必要な項目を抜き出すためのワークシート関数を作成する。定義するワークシート関数は、以下の3つだ。

sm_Fact

事実(ファクト)の値を取得する。見つからなかった場合には、xlErrValueを返す。

Function sm_Fact(path, elementName, Optional contextId = "", Optional attr = "VALUE")

'[引数]
'path XBRLインスタンスのパス(URLまたはファイルパス)
'elementName 要素名
'contextID コンテキストID(省略するとすべてのコンテキスト)
'attr 取得する属性を指定する(大文字・小文字は区別しない)
' "Value": 値を取得する(デフォルト)
' "ContextID": コンテキストIDを取得する

sm_Context

コンテキストの情報を取得する。見つからなかった場合には、xlErrValueを返す。

Function sm_Context(path, contextId, Optional attr = "ID")

'[引数]
'path XBRLインスタンスのパス(URLまたはファイルパス)
'contextID コンテキストID
'attr 取得する属性を指定する(大文字・小文字は区別しない)
' "ID": コンテキストIDを取得する(デフォルト)
' "startDate": 開始日を返す
' "endDate": 終了日を返す
' "instant": 基準日を返す
' "consolidate": 連結かどうかを返す

sm_FindElement

複数の要素から、XBRLにファクト存在する要素を返す。見つからなかった場合には、xlErrValueを返す。

Function sm_FindElement(path, elementName As Range, Optional contextId = "")

'[引数]
'path XBRLインスタンスのパス(URLまたはファイルパス)
'elementName 要素が入力されているセルの範囲
'contextID コンテキストID(省略するとすべてのコンテキスト)

完全なコードはここにある(コメント行を含めても200行未満だ)。

ワークシート関数を使う

これらのワークシート関数の使い方を説明しよう。

最初にもっとも単純なケースを考えてみることにする。 XBRLデータに1つしか事実が記述されないことがわかっている要素の値を取得したい場合がある。 決算短信サマリなら、企業名(CompanyName)、証券コード(SecuritiesCode)、事業年度終了日(FiscalYearEnd)などだ。 これらの要素のファクトの値を取得するときは、ファクトのコンテキストがなんであるかは気にする必要はない(まともなXBRLデータなら適切なコンテキストで記述されているはずだ)。
この場合は、sm_Factを使う。コンテキストは気にしないので3番目の引数のContextIDは省略してよい。
例えば、以下の数式で、XBRLデータ「C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl」から、企業名(CompanyName)の値を取得できる。

=sm_Fact("C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl", "CompanyName")

次に、最も一般的なケースを考えてみよう。
多くの要素は、いくつかのコンテキストでいくつかのファクトとして記述されている。 例えば、連結企業の通期の決算短信サマリでは、4種類の売上高(NetSales)が記述されている。今期の連結売上高・売上高(単独)、前期の連結売上高・売上高(単独)だ。

  • 今期の連結売上高=今期連結コンテキスト(CurrentYearConsolidatedDuration) × 売上高(NetSales)
  • 今期の売上高(単独)=今期単独(CurrentYearNonConsolidatedDuration) × 売上高(NetSales)
  • 前期の連結売上高=前期連結(PriorYearConsolidatedDuration) × 売上高(NetSales)
  • 前期の売上高(単独)=前期単独(PriorYearConsolidatedDuration) × 売上高(NetSales)

このようなケースでは、3番目の引数のContextIDを省略せずにsm_Factを使う。
例えば、今期の連結売上高を抜き出すなら以下の数式をセルに記述する。

=sm_Fact("C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl", "NetSales", "CurrentYearConsolidatedDuration")

今期の連結売上高の金額を取得することはできた。では、その「今期」とはいつからいつまでだろうか。
それを知るには sm_Context を使えばよい。

=sm_Context("C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl", "CurrentYearConsolidatedDuration", "startDate")

=sm_Context("C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl", "CurrentYearConsolidatedDuration", "endDate")

第3引数に"startDate"を指定すると、そのコンテキストの開始日を取得できる。"endDate"を指定すればコンテキストの終了日になる。

最後に、売上高に複数の要素を集約するケースを考えてみよう。

各社の決算短信サマリを見ていくと、「売上高」にもいろいろな種類があることがわかる。
一般的に売上高(NetSales)のほかに、営業収入(OperatingRevenues)、営業総収入(GrossOperatingRevenues)などが使われている。これらは厳密には異なる勘定科目だが、同じ項目に集約したい。

このような場合には、sm_FindElement と sm_Fact を組み合わせて使えばよい。
今期の連結売上高として、NetSalesとOperatingRevenuesとGrossOperatingRevenuesのいずれかの要素のファクトを取得する場合、以下のようにすればよい。(セルA1〜セルA3に"NetSales", "OperatingRevenues", "GrossOperatingRevenues"とそれぞれ入力されているものとする)

=sm_Fact("C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl", sm_FindElement("C:\xbrl\tdnet-qcedjpsm-91010-20130123068307.xbrl", A1:A3, "CurrentYearConsolidatedDuration") ,"CurrentYearConsolidatedDuration")

決算短信サマリから財務DBの項目を取得するワークシートを作成する

ここまで説明したことを使えば、決算短信サマリのXBRLデータから財務DBの項目を取得するワークシートを作成することができる。
完成した財務DB作成ツール(Excelファイル)はここにある。

会社情報

まず「会社情報」を取得する。
会社情報は、そのデータを提出した企業やそのデータそのものの情報(メタ情報)で、具体的には「文書名(DocumentName)」「上場会社名(CompanyName)」「URL(URL)」などがある(その他にも要素がある。詳しくは東証が開示している決算短信サマリー企業拡張タクソノミ作成要領(PDF)の49/124ページなどを参照)。

直感的にわかるとおり、会社情報は1つのXBRLデータに1つずつしか情報を持たない。よって、sm_Fact関数を使って簡単に取得できる。たとえば、上場会社名なら以下のように記述すればよい。

=sm_Fact(XBRLインスタンス, "CompanyName")

会社情報から6項目(上場会社名(CompanyName),文書名(DocumentName),証券コード(SecuritiesCode),提出日(FilingDate),決算期(FiscalYearEnd),URL(URL))を取得する。提出日と決算期の値は日付なので DATEVALUE 関数を使って変換しておくとよい。

コンテキストID

次に、データを取得するコンテキストIDを取得する。コンテキストIDは、後に経営状況(売上、各利益など)や財政状態(総資産など)を取得するために利用する。 このツールでは、決算短信から連結優先で直近のデータを取得したい。そこで、そのデータの「最新時点コンテキスト」「最新期間コンテキスト」「今年度期間コンテキスト」の3コンテキストのIDを取得する。

コンテキストIDの命名ルールによって、「最新時点コンテキスト」がわかれば、「最新期間コンテキスト」と「今年度期間コンテキスト」は機械的に決まる。「最新期間コンテキスト」は〜Instantを〜Durationに置き換えればよい。「今年度期間コンテキスト」はCurrentYearConsolidatedDuration(連結)かCurrentYearNonConsolidatedDuration(非連結)の2択だが、「最新期間コンテキスト」から連結か非連結か判別できる。

では「最新時点コンテキスト」はどうやってとればよいか。命名ルールによると、四半期か年次か、連結か非連結かがわかれば一意に定まることになっている。したがって、その情報をXBRLからとればよいのだが、ここではもっと簡単でうまい方法がある。

決算短信サマリの場合、連結優先の「最新時点コンテキスト」を簡単に取得できる暗黙のルール(明文化されているかもしれないけど)がある。すなわち、会社情報のファクトは連結優先の最新時点コンテキストで定義されているのだ。つまり、会社情報(上場会社名や文書名など)のファクトのContextIDを見ればよい。

=sm_Fact(XBRLインスタンス, "CompanyName",,"ContextID")

これでターゲットのコンテキストがわかった。では、実際にデータベース化する値を集めていこう。

経営成績

経営成績の各出力項目(「売上高」「営業利益」「経常利益」「純利益」とそれぞれの増減率)は、「最新期間コンテキスト」に属する要素を集約して取得する。たとえば、「売上高」には「NetSales」「OperatingRevenues」など22種類の要素を集約している。(実際になんの要素を集約しているかはツールを見れば一目瞭然なので、ツールを見ながら読んでほしい)

財政状態

財政状態の各出力項目(「総資産」「純資産」「自己資本比率」)は、「最新時点コンテキスト」に属する要素を集約して取得する。

配当金

配当金の状況の各出力項目(「配当金1Q」「配当金2Q」「配当金3Q」「期末配当金」「通期配当金」)は、「今年度期間コンテキスト」に属する要素を取得している。集約はしていない。

集約の難しさ

このツールで行っている集約は、一つの実装例に過ぎない。XBRL上の要素を、データベース上の項目にどうやって当てはめていくか。たとえば、日本基準の売上高と米国基準の売上高を別々の項目に集約するか、それとも、同じ項目に集約するか。営業収益はどうか。完成工事高(一部の建設業で利用されている)は。経常収益(銀行業で利用されている)は売上なのか。

答えはデータベースを利用する人(あなた)がどう考えるかだ。唯一正しい答えはない。集約する要素を決めることはすなわち、データをモデル化することだ。モデルは利用目的によって変わる。

あなたが次にやるべきこと

完成したツールは、1つのXBRLから財務DBの1レコード分のデータを作成するものだ。
このツールを使ってデータベースを作るには、まず決算短信サマリのXBRLを集め、そして各XBRLデータごとに、ツールのセルA2にXBRLファイルのパスを入力して計算結果を別ファイル(別シート)に保存、という作業を繰り返せばよい。

これらはいずれも手作業でやるのは大変だ。だが、データさえ集めてしまえば、あとの作業は簡単にVBAで自動化できるだろう。

ではどうやってデータを集めるか。残念ながら、データを集める作業には苦労するだろう。
米国SECは、提出されたXBRLデータはFTPサーバにすべてまとめられ、自由に簡単に大量に自動的にダウンロードできるようになっている。 一方、TDnetを運営する東証は、一般的な利用者がXBRLデータをまとめて集める手段は提供していない。必要なものは一つ一つダウンロードする、1ヶ月で消す、というのがTDnetのやり方だ(ワイルドだろう?)。

そこで、あなたのような人件費を削減したい利用者は、XBRLデータを集めるには手か頭を使わなくてはいけない。
もしかしたら、有報キャッチャーウェブサービスTeCAProが役に立つかもしれない。

実装例をアップしておくので、興味がある人はダウンロードして使ってみてほしい。

なぜこの記事を書いたか

運営しているサイトで開示していた(今はやめてしまった)財務データベースの復活の要望があった。この要望を出してくれた方に感謝の意をこめて、(サービスの復活は難しいので)エッセイという形でデータベースそのものの作り方を示した。

2008年に日本で先頭を切って導入されたXBRLは、いまだに一般的な有報や決算短信の閲覧者が気軽に使うようにはなっていない。このエッセイでは、XBRLを簡単に使えて役に立つ具体的なソフトを提示できたのではないかと思う。

XBRLのデータを利用する難しさは、XBRLそのものの複雑さにあるのではない(EXCELでも簡単にXBRLを利用できる)。
XBRLデータの利用で難しいのは、データにどのように要素やコンテキストが使われているかを理解することだ。データのくせやノウハウに属するこのような情報は特定のコアな利用者だけが握っていて、ほとんど表に出てきてないように思われる。決算短信サマリのXBRLについて、本稿が少しでも理解の助けになっていたら幸いだ。