株式銘柄紹介ブログ

主に日本の株式を紹介しています

pythonで決算短信のXBRLを分析する その5「決算短信XBRLからのデータ取得 XBRLの構造から値を取得する」

はじめに

前回は決算短信のインラインXBRLからデータを読み込む方法について説明しました。

www.quwechan.com


インラインXBRLにはコンテキスト定義と各要素の値が記載されており、それぞれXMLパーサを用いて構造を解析しデータを読み込みました。あとは要素の名称とコンテキストを決定すればXBRLから要素の値を取得することが出来るようになります。


今回はXBRLの構造から取得対象となる要素の名称とコンテキストを決定し、実際に要素の値を取得してみたいと思います。


ここでは四半期業績予想を例に説明します。
 

 

XBRLの構造から要素名とコンテキストを決定し、値を取得する

方針

構造データの取得

決算短信のサマリーの場合はXBRLの構造は定義リンクベースファイルに記載されています。有価証券報告書(EDINET)の場合は表示リンクベースファイルに記載されており、そちらを読み込むことでXBRLの構造を取得していました。表示リンクベースファイルと定義リンクベースファイルの作りは共通点が多く、ほとんど同じ方法で構造を読み込むことが出来ます。


したがって、構造の読み込み方の詳細は有価証券報告書(EDINET)の例について書いたこのページをご覧になってください。ここでは詳細を理解されている前提で話を進めていきます。


XBRLの構造は木構造なので木構造を実装するか、各言語の既存の木構造ライブラリを用いて定義リンクベースファイルを読み込みます。続いて各要素の定義が書かれたスキーマファイル、日本語名称が書かれた名称リンクベースファイルを順次読み込みます。すると以下のような構造を取得できます。これは四半期業績予想の構造です。

(None)RoleQuarterlyForecasts(None)
     (title)tse-ed-t_QuarterlyForecastsHeading(四半期業績予想)
          (table)tse-ed-t_QuarterlyForecastsTable(四半期業績予想)
               (axis)tse-ed-t_ConsolidatedNonconsolidatedAxis(連結・個別又は非連結)
                    (member)tse-ed-t_NonConsolidatedMember(個別又は非連結)
               (axis)tse-ed-t_ResultForecastAxis(実績・予想)
                    (member)tse-ed-t_ForecastMember(予想)
                    (member)tse-ed-t_UpperMember(上限)
                    (member)tse-ed-t_LowerMember(下限)
          (line_items)tse-ed-t_QuarterlyForecastsLineItems(四半期業績予想)
               (text)tse-ed-t_TitleForForecasts(業績予想タイトル名称)
               (title)tse-ed-t_PreambleToForecastsAbstract(業績予想に関する事項)
                    (text)tse-ed-t_PreambleToForecasts(業績予想に関する事項)
               (title)tse-ed-t_MainTableOfForecastsAbstract(業績予想本表)
                    (title)tse-ed-t_NetSalesForecastAbstract(売上高)
                         (number)tse-ed-t_NetSales(売上高)
                         (number)tse-ed-t_ChangeInNetSales(増減率)
                    (title)tse-ed-t_OperatingIncomeForecastAbstract(営業利益)
                         (number)tse-ed-t_OperatingIncome(営業利益)
                         (number)tse-ed-t_ChangeInOperatingIncome(増減率)
                    (title)tse-ed-t_OrdinaryIncomeForecastAbstract(経常利益)
                         (number)tse-ed-t_OrdinaryIncome(経常利益)
                         (number)tse-ed-t_ChangeInOrdinaryIncome(増減率)
                    (title)tse-ed-t_NetIncomeForecastAbstract(当期純利益)
                         (number)tse-ed-t_NetIncome(当期純利益)
                         (number)tse-ed-t_ChangeInNetIncome(増減率)
                    (title)tse-ed-t_NetIncomePerShareForecastAbstract(1株当たり当期純利益)
                         (number)tse-ed-t_NetIncomePerShare(1株当たり当期純利益)
               (title)tse-ed-t_NoteToForecastsAbstract(業績予想に関する事項)
                    (text)tse-ed-t_NoteToForecasts(業績予想に関する事項)
               (title)tse-ed-t_CorrectionOfFinancialForecastInThisQuarterAbstract(直近に公表されている業績予想からの修正の有無)
                    (bool)tse-ed-t_CorrectionOfFinancialForecastInThisQuarter(直近に公表されている業績予想からの修正の有無)

 
line_itemsよりも上が四半期業績予想のディメンション、下が四半期業績予想に存在する要素をそれぞれ表しています。
 

コンテキストを決定する

ディメンションとは簡単に言うと四半期業績予想の奥行情報のことで、どんな軸があって、そのうちのどのメンバーが選択されうるのかを定義しています。そしてディメンションがコンテキストの一部分を決定します。


コンテキストは要素が使われる文脈を表しています。例えば売上という要素が連結の売上なのか非連結なのか、実績なのか予想なのかを表すのがコンテキストです。今期非連結期間の予想売上を示すコンテキストは「CurrentYearDuration_NonConsolidatedMember_ForecastMember」となります。


コンテキストの命名規則は「[相対年度][期間・時点]_[ディメンション]」となっており、この[ディメンション]の部分をディメンション定義から決定します。


先述したディメンション定義の「連結・個別又は非連結」軸には「個別又は非連結」メンバーしか存在していません。したがって、四半期業績予想では非連結を示すコンテキストだけが選択されます。一方で「実績・予想」軸には「予想」「上限」「下限」メンバーが存在しており、それぞれのメンバーに対応するコンテキストが選択される可能性があります。

つまり、上記の例では

  • NonConsolidatedMember_ForecastMember
  • NonConsolidatedMember_UpperMember
  • NonConsolidatedMember_LowerMember

の3パターンのコンテキストがディメンションから選択されうるということになります。


しかし、予想の上限値や下限値を公表している例はあまりないこと、基本的には予想値そのものを取得したいので上記の例では「NonConsolidatedMember_ForecastMember」を使えばよいでしょう。


このように軸のどのメンバーを選択するかは自身で決めることが出来ます。ただし、ディメンションに存在しない軸とメンバーを使うことは出来ません。


[期間・時点]は各要素のスキーマ定義にperiodType属性というものはあり、ここから決定します。periodType属性がdurationならDuration、instantならInstantのように一意に決まります。


[相対年度]はコンテキストがいつのものかを表しています。例えばCurrentYearであれば今年、Prior1Yearであれば去年を表します。決算短信のXBRLのどの項目がどの相対年度を取りうるのかはJPXが公表している決算短信サマリー企業拡張タクソノミ作成要領によって定められています。具体的にはドキュメントの「選択可能項目数及び選択可能領域等について」という項を参照してください。こちらのページにドキュメントのリンクがあります。


このドキュメントによると四半期業績予想において選択されうる相対年度は

  • CurrentAccumulatedQ1
  • CurrentAccumulatedQ2
  • CurrentAccumulatedQ3
  • CurrentYear

の4つがあります。今回は年次業績予想を取得できれば良いので「CurrentYear」を使用することになります。


一方で四半期決算短信の業績予想ではなく、通期決算短信の業績予想では

  • NextAccumulatedQ1
  • NextAccumulatedQ2
  • NextAccumulatedQ3
  • NextYear

の4つになるため、「NextYear」を使用します。


四半期決算短信では「今期」の業績予想、通期決算短信では「来期」の業績予想ではあるため、このような違いが生じます。自身が取得したい項目ごとにどの[相対年度]を使用するかはあらかじめ調べておく必要があります。



実際に存在するコンテキストの一覧はインラインXBRL中に存在するため、以下の流れで使うコンテキストを絞り込み決定するのが望ましいです。

  1. ディメンションから使用されうるコンテキストを絞り込む
  2. 要素のperiodType属性から更にコンテキストを絞り込む
  3. 相対年度から使用するコンテキストを決定する

 

命名規則からコンテキストを生成しても問題はないです。実装は簡単になると思います。ここでは有価証券報告書(EDINET)の記事で説明した方法でコンテキストを決定します。
 

要素名を決定する

line_itemsよりも下が四半期業績予想に存在する要素です。その中の

  • 数値
  • 文字列
  • 真偽値

を取得する要素とします。

要素名は構造が取得されているなら自明であるため、取得方法については特に説明はしません。
 

値を取得する

値を取得するのは簡単です。前回の記事でインラインXBRLから要素名とコンテキストに対応する値の一覧を取得しているので、そこから検索するだけです。
 

実装

実装の方針については前述したとおりです。詳細についてはソースコードを読んでください。


ソースコードはここにあります。


実行結果

(None)RoleQuarterlyForecasts(None)
     (title)tse-ed-t_QuarterlyForecastsHeading(四半期業績予想)
          (table)tse-ed-t_QuarterlyForecastsTable(四半期業績予想)
               (axis)tse-ed-t_ConsolidatedNonconsolidatedAxis(連結・個別又は非連結)
                    (member)tse-ed-t_NonConsolidatedMember(個別又は非連結)
               (axis)tse-ed-t_ResultForecastAxis(実績・予想)
                    (member)tse-ed-t_ForecastMember(予想)
                    (member)tse-ed-t_UpperMember(上限)
                    (member)tse-ed-t_LowerMember(下限)
          (line_items)tse-ed-t_QuarterlyForecastsLineItems(四半期業績予想)
               (text)tse-ed-t_TitleForForecasts(業績予想タイトル名称),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '3. 2024年 7月期の業績予想(2023年 8 月 1日~2024年 7月31日)'}
               (title)tse-ed-t_PreambleToForecastsAbstract(業績予想に関する事項)
                    (text)tse-ed-t_PreambleToForecasts(業績予想に関する事項),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': ''}
               (title)tse-ed-t_MainTableOfForecastsAbstract(業績予想本表)
                    (title)tse-ed-t_NetSalesForecastAbstract(売上高)
                         (number)tse-ed-t_NetSales(売上高),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '3225000000'}
                         (number)tse-ed-t_ChangeInNetSales(増減率),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '0.030'}
                    (title)tse-ed-t_OperatingIncomeForecastAbstract(営業利益)
                         (number)tse-ed-t_OperatingIncome(営業利益),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '560000000'}
                         (number)tse-ed-t_ChangeInOperatingIncome(増減率),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '-0.105'}
                    (title)tse-ed-t_OrdinaryIncomeForecastAbstract(経常利益)
                         (number)tse-ed-t_OrdinaryIncome(経常利益),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '580000000'}
                         (number)tse-ed-t_ChangeInOrdinaryIncome(増減率),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '-0.115'}
                    (title)tse-ed-t_NetIncomeForecastAbstract(当期純利益)
                         (number)tse-ed-t_NetIncome(当期純利益),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '400000000'}
                         (number)tse-ed-t_ChangeInNetIncome(増減率),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '-0.096'}
                    (title)tse-ed-t_NetIncomePerShareForecastAbstract(1株当たり当期純利益)
                         (number)tse-ed-t_NetIncomePerShare(1株当たり当期純利益),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': '60.32'}
               (title)tse-ed-t_NoteToForecastsAbstract(業績予想に関する事項)
                    (text)tse-ed-t_NoteToForecasts(業績予想に関する事項),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': ''}
               (title)tse-ed-t_CorrectionOfFinancialForecastInThisQuarterAbstract(直近に公表されている業績予想からの修正の有無)
                    (bool)tse-ed-t_CorrectionOfFinancialForecastInThisQuarter(直近に公表されている業績予想からの修正の有無),{'CurrentYearDuration_NonConsolidatedMember_ForecastMember': 'False'}

 

要素の値が取得できているとわかります。あとは煮るなり焼くなりして各々の欲しい形式のデータに加工して使ってください。
 

 

おわりに

今回は実際に決算短信のサマリー構造から取得対象となる要素名とコンテキストを決定し、値を取得しました。

実際にやってみたのは四半期業績予想についてだけですが、他の項目や決算短信の添付資料のXBRLについても同様の手順で値を取得できるはずです(おそらく)。

ただし、添付資料のXBRLの場合はコンテキストの相対年度については別途検討が必要です。基本的は添付資料のXBRLはEDINETの仕様に則っているようなので金融庁が公開している仕様書を読んで各項目ごとにどの相対年度を使う必要があるか考えたらよいです。


加筆が必要な点があれば随時更新するつもりです。


今回はここまでです。