売上高のグラフを描くには金額データと日付データが要るのですが、この日付というのがなかなか厄介な存在です。
といいますのも、決算書の売上高には四半期ごとの金額と累計金額の2種類が載っているんですね。なので、累計金額なら累計金額のデータを選んで読み込む必要があります。
この2つの区別ですが、米国のEDGARに関してはとても苦労しました。そのあたりも含めて、どうやって処理したのか?その手順を紹介します。
売上高の整形手順
大まかな流れ
売上高としては、たとえばレベニュー (Revenue)と付くタグが該当します。Revenues や SalesRevenueNet などですね。それらの1つを抽出して整形する時の手順です。
狙うは累計金額です。
まず準備として、各決算書の「決算年度の開始日」を集合にしておきます。
次に、タグ名が「Revenues」のものを抽出。
その中で、単位が「USD」であるものを抽出。
そこから、コンテキストに「セグメント情報」を含むものを除外。
更にそこから、「金額」が空欄のものを除外。
いよいよ累計金額を選びます。
「開始日」が「決算年度の開始日」の集合にあるものを抽出。
その中で、「開始日」から「終了日」までの日数が1年以内であるものを抽出。
ここから重複処理です。
まず、「終了日」が重複しているものは、「開始日」から「終了日」までの日数が一番長いものを残す。
次に、「アメンドメント (Amendment)」がTrueのものを残す。
その次に、「報告書の提出日 (Date Filed)」が一番古いものを残す。
その中で、「金額」の絶対値が最大のものを残す。
最後に、まだ日付の重複があるときは、どれか1つを残す。
このような手順で、売上高のデータを整形しました。これでほとんどの場合は、重複データのないキレイなグラフが描けました。
それぞれの詳細を以下で紹介します。
決算年度の開始日取得とタグ抽出
「決算年度の開始日」を集合にする
これは、DEIの「EntityRegistrantName」タグの「開始日(start)」を使いました。
ほかのタグでも試したのですが、開始日の設定に誤りがあったりして、最終的にこのタグなら誤りが少なかったということで、これを使っています。
日付については、開始日の「月(month)」と「日(date)」のタプルを要素にして集合を作りました。「年(year)」を除外しています。
こうすることで、過去の年度についても月日さえ合えば拾えるようにしています。集合を作るときは、それぞれに前後3日間の日にちも生成・追加して、日にちが微妙に違っても引き込めるようにしました。
「Revenues」を抽出
狙ったタグを抽出するところですね。名前空間は無視して、「Revenues」というタグ名で抽出しました。もちろんこの Revenues は一例で、ほかの勘定科目を抽出するときは、そのタグ名で抽出します。
「USD」を抽出
通貨単位が「米国ドル (USD)」であるものを抽出しました。ときどきユーロ表示の金額もありましたので、USDを選んで抽出しています。
EDINETだと日本円以外の単位はほとんど見かけませんでしたが、EDGARでは他にも色々な単位が使われていました。
「セグメント情報」を含むものを除外
まずはサマリーに当たる金額がほしかったので、それ以外の、合計金額の内訳にあたるような金額を除外しました。
決算書の中には、全体の合計金額ではなく、報告セグメントごとの合計を列挙しているだけのものも結構ありました。そこから自前で合計金額を出すのはちょっと大変だったので、そういったデータは除外することにしました。
「金額」が空欄のものを除外
XBRLでは、表の空欄にあたる部分もタグ付けされていたりしますので、それを除外しました。
累計金額を選ぶ
「開始日」が「決算年度の開始日」であるものを抽出
これは「四半期ごとの金額」と「累計金額」から、「累計金額」を選ぶための処理です。累計金額の開始日が年度のはじめであることを利用しました。
EDINETの場合はコンテキストの文字列から判定できたのですが、EDGARでは各社バラバラの文字列だったので、このような方法になりました。
一応、EDGARでも四半期ごとなのか?累計なのか?を示す文字列は見受けられたのですが、各社フォーマットがバラバラだったので利用できなかったです。
日数が1年以内であるものを抽出
これは、超長期の累計金額を除外するために行っています。EDGARでは、「104 Months Ended」といった非常に長い期間の累計金額があったりしたので、それを除外しました。
EDGARの金額には「四半期ごと」、「1年の累計」、「超長期の累計」という3種類があったんですね。
さて、実際には、さらにもう1四半期分(=90日くらい)を加えた457日以内のものを累計金額として抽出しました。超長期を開示していない場合でも、1年を少し超えたものがありましたので、そうしました。
次は「終了日」の重複処理です。終了日がダブったままだと変なグラフができてしまったので、1つの日付に1つの金額が対応するよう、重複を排除します。
重複処理
日数が一番長いものを残す
「終了日」が重複しているものは、まず、「開始日」から「終了日」までの日数が一番長いものを残しました。
決算書の中には、ときどき半端な日付のデータがありまして、その為に重複データとなっている場合があったんですね。なので、これを排除しました。
「Amendment」がTrueのものを残す
これは、訂正報告書の内容を使うか否かです。Trueを残せば訂正版の金額が拾えますが、これは良し悪しの部分がありました。
どういうことかといいますと、数年間のグラフを描いていている所で部分的に訂正すると、グラフがへこんだり出っ張ったりしちゃったんですね。
しかしながら、一応、訂正版があればそちらを採用する感じでグラフを描きました。訂正版を使うかどうかは、自身の目的に照らして考えるところだと思います。
提出日が一番古いものを残す
ある年度の金額は、前年同期比などとして、翌年度の決算書でも登場します。それを除外するために、「報告書の提出日 (Date Filed)」が一番古いものを残すようにしました。最初に開示された金額ですね。
それで、最初に開示された金額を残すのには理由がありまして、決算書の金額って、なぜか変わったりしてたんですね。
てっきり翌年度でも同じ金額が載ってるものだと思っていたんですが、そうじゃない感じでした。別に、訂正版が出ていたとか、そういうこともなさそうでした。そのあたり、理由はわかりませんでした。
初めは新しいほうの金額を残すようにしていたのですが、グラフにしたらやはり少し変でした。売上高の累計なのに金額が減っていたりと、そんな感じでした。
なにか私の知らない会計ルールがあるのかもしれませんが、古いほうを残したほうがもっともらしいグラフが描けたので、これで行くことにしました。
「金額」の絶対値が最大のものを残す
これは何かといいますと、決算書の説明文章の中で登場する金額を除外しています。
EDGARでは、文章の中の金額についてもタグ付けしてる場合があったんですね。タグには別に「これは文章中の金額です」とか、そういう情報はないのですが、1000以下の端数を切り捨てた金額になっていたので、本文中の金額だとわかりました。
どうせなら端数のあるほうを残したかったので、絶対値が最大であるものを残すようにしました。端数を切り捨てると金額が小さくなるので、これでうまくいきました。さらに絶対値をとれば、マイナスの金額でもうまく判定できます。マイナスは主に利益の科目で登場します。
ここまでやっても、まだ重複が残る場合があります。
どれか1つを残す
まだ日付の重複があるときは、どれでもいいので1つを残すことにしました。たいていは、全く同一のタグが2つも3つもある場合でした。
これらはもうどうしようもないので、適当に最初の要素を残すようにしました。
長くなりましたが、一つ一つの勘定科目をこのような手順で整形してグラフを描きました。
プログラミングの参考になれば幸いです。