0.1秒で次世代TDnetのサンプルデータを作成する方法

このエントリでは、次世代TDnetのサンプルデータを素早く簡単に大量に作成する方法を説明する。

目的
目的は、簡単にたくさんの次世代TDnetのサンプルデータを作ることだ。サンプルデータは、次世代TDnetのデータ利用者のシステム開発ではいずれ必要になるものだが、データ作りは退屈で面倒な作業だ。少なくとも私が自分でやりたい仕事ではない。
東証から提供されたサンプルに設定された金額が不適切(連結売上高が100万円で、営業利益が200万円だったりする)なのを見ても、適切な金額を設定するのが難しいことがわかる。

作戦
以下の処理を行うプログラムを作ることにしよう。

  • 現行タクソノミで作成されているインスタンスを、次世代タクソノミ版に変換する。(変換処理)
  • 事前にテンプレートを作成し、データをテンプレートに流し込んで出力ファイルを作成する。(レンダリング処理)

変換処理
XBRLインスタンスには、ファクト(報告項目)とユニットとコンテキストの情報がある。ユニットは変更なしなので、変換処理では、ファクト(報告項目)とコンテキストをそれぞれ以下の通り変換する。

ファクト(報告項目)の変換
東証によれば、現在のXBRLインスタンスの報告項目と次世代の報告項目が1対1で対応する。対応関係はマッピングリストとして提供されている。よって、報告項目の変換はマッピングリストに従って機械的にやればよい。
例えば、年次決算短信(様式=acedjpsm)の連結(Consolidated)の売上高(NetSales)であれば、実績メンバー(ResultMember)で連結メンバー(ConsolidatedMember)の売上高(NetSales)という具合に機械的に決まる。

コンテキストの変換
コンテキストは、必要なディメンション分増幅させる。

現行のコンテキストは、相対年度×期間時点×連結非連結の組み合わせ分存在する。次世代では、連結非連結がディメンション軸となり、さらに3つの軸(業績予想軸、配当スケジュール軸、前回今回軸)が新たに追加されるため、相対年度×期間時点×連結非連結×業績予想×配当スケジュール×前回今回の組み合わせ分存在することになる。

例えば、今年度(CurrentYear)の期間(Duration)のコンテキストは、現行では、CurrentYearConsolidatedDuration(連結)とCurrentYearNonCosolidatedDuration(非連結)の2つだけだ。しかし、次世代では、連結非連結軸が3種類(2メンバー+軸なし)×業績予想軸5種類(4メンバー+軸なし)×配当スケジュール軸6種類(5メンバー+軸なし)×前回今回軸3種類(2メンバー+軸なし)で270パターン存在しうることになる。もちろん、インスタンスにこれらすべてのコンテキストが定義されるわけではなく、必要なのはファクトが存在するコンテキストだけだ。ファクトのコンテキストは、前述のファクトの変換で決まる。

レンダリング処理
次世代TDnetでは、XBRLデータは、InlineXBRLとスキーマファイルと定義リンクベースの3ファイルが1セットだ。事前にこれら3ファイルのテンプレートを作成し、現行インスタンスから変換した情報を流し込む。

InlineXBRLテンプレート
InlineXBRLはベースがXHTMLなので、XHTMLでレイアウトを作成しておく。ファクトを埋めたいところにはプレースホルダを置いておき、レンダリング処理時にファクトに置き換えるようにする。

スキーマテンプレート
スキーマは、参照するファイルが固定で決まるので、特に問題なくテンプレートを作れる。

定義リンクベーステンプレート
標準タクソノミの taxonomy\jp\tse\tdnet\ed\r\2013-01-21 にあるものから該当する様式のファイルをコピーして、相対パスで記述されているhref属性を絶対パスに変更すればよい。

実装例
Pythonで作成したツールの実装は、ここからダウンロードできる。(実際にツールで変換して作成したサンプルデータも同封)

応用
テンプレート方式でInlineXBRLを作る仕組みは、とても簡単に実装できることがわかったが、一般的なインラインXBRL作成ツールに比べて、柔軟性に欠ける。
逆に言うと、柔軟性が必要ない、拡張がなく様式がある程度固定的なXBRLの場合には、テンプレート方式の作成ツールが簡単に作れる可能性が高い、ということだ。例えば、今回変換ツールを作成した次世代TDnetの決算短信サマリや業績予想・修正予想、また、次世代EDINETの大量保有報告書などの作成ツールに応用することができるだろう。