XBRLで上場企業の決算分析する方法まとめ。EDINETやEDGARの決算データからチャートを作ったり指標を計算してスクリーニングするまでの流れとコード例。

XBRLの解説です。XBRLの取得方法から読み込み・作図・指標計算を行ってきた記事をまとめました。

XBRL解析では、主にPythonを使っています。

掲載しているプログラムのコードは自由にお使いください。

もくじから必要なところだけ拾い読みするのがおすすめです。

コードを色々載せていますが、こまかい内容は理解しなくて大丈夫です。参考になったところだけ拾ってください。

XBRLを利用した決算分析の参考になれば幸いです。

小さく作る

単機能なら簡単

全体を見ると果てしない感じですが、実際には単機能なプログラムの集まりです。XBRLの取得だけ、XBRLの読み込みだけ、勘定科目の抽出だけ、グラフ化だけ、時系列分析だけという感じです。私もひとつずつ小さく小さく作ってきました。それぞれのデータの受け渡しはCSVファイルやPickle(ピックル)ファイルで行いました。

デバッグが簡単になるので、Pythonはログを取るのがおすすめです。ロギング方法を書きました。また、Pythonプロセスの優先度を変更すると、たくさんのXBRLを解析しているときでもPCの操作が快適になります。どちらもコードはお決まりのパターンでしたので、おすすめです。

Pythonプログラムを開発するときは、例外クラスを自作しておくと、デバッグがはかどりました。自分の場合は、class XBRLParseError(Exception) のような例外クラスをひとつ作って使っています。例外クラスの作り方は決まりきっていて、わずか3行でした。一般のプログラム開発にもお勧めです。

自作の例外クラスで例外を発生させて、それをログファイルに記録する。おそらく、王道のアプローチだと思います。

全部を自分で作る必要はない

わたしは楽しかったので作ってしまいましたが、XBRLを取得して集計して、実際に銘柄分析に役立てるところまで持っていくのは、かなり大変です。難しいのではなくて、単純に分析までたどり着くのに時間がかかります。

自分で作らなくても、決算データや分析レポートを真面目に配信しているサービスはたくさんありますので、まずはそういった月額サービスやサブスクリプションをおすすめします。

スポンサーリンク

あくまで銘柄分析が目的であって、資料を見ながら売買するに納得のいく理由を見出す過程にこそ、意味があるのです。

しかしながら、自分でプログラムを書くのはかなり楽しいので、研究開発が好きならXBRLはおすすめです。

XBRLの取得方法

日本企業のXBRL

EDINETコードリストを使ってXBRLを取得します。このCSVはPythonのcsvモジュールpandasライブラリなどで読み込めます。

決算書のXBRLですが、有価証券報告書のものと決算短信のものがあります。

有報のXBRLは金融庁の「EDINET」から取得できます。

決算短信のXBRLは東証の「適時開示」と「基本情報」の2箇所から取得できます。

これらのXBRLは有報キャッチャーでも取得できます。

米国企業のXBRL

米国企業のXBRLは米国証券取引委員会のEDGARから取得できます。

EDGAR(エドガー)でEDINETコードにあたるのが『CIKコード』です。EDGARにあるCIKコードリストの取得方法とExcelでの開き方を書きました。

『カンマ区切りでないCSV』なので、読み込みに工夫が必要なんですね。LibreOfficeでカンマ区切りでないCSVを読み込む方法も一緒に書きました。

XBRLの読み込み方

XBRLデータのスクレイピング方法です。zipファイルのまま読み込む方法、BeautifulSoupを使う方法、lxml.etreeを使う方法などを紹介しています。

2種類のアプローチ

XBRLはBeautifulSoupやlxml.etreeで読み込めますが、勘定科目の抽出には2種類のアプローチがあります。

  • XBRLを解析しながら狙った科目だけ抽出するアプローチ
  • 一気に読み込んでしまってから抽出するアプローチ

お勧めは一気に読み込んでしまってから抽出するアプローチです。プログラムが簡単になりました。

仕様書があります(XBRLの解説資料)

XBRLは仕様書が公開されていますので、ファイル群の構造なども調べることができます。

ざっくりですが、一番上にXMLという便利な仕様があって、本家のXBRLはそれを使って定義しています。

日本のEDINET XBRLは、本家の仕様を改良したうえで、日本向けの定義を追加した感じのようです。

XBRL 2.1 の仕様書は、日本語翻訳されたものがあります

JIS規格(ジスきかく、日本産業規格)のサイトで、無料で閲覧できました(日本工業規格は、名前が2019年7月1日から日本産業規格に変わりました)。

zipファイルのまま読み込む

XBRLのファイル群はzipでひとつにまとめて公開されています。これは解凍せずに読み込むことができます。

PythonのzipモジュールにXBRLのzipファイルパスを渡すと読み込めます。するとバイナリデータが返ってきますので、それをそのままBeautifulSoup()やlxml.etree.fromstring()に渡せば解析してくれます。

BeautifulSoupで読み込む方法

「タグ名が100文字を超えると切り捨てられる」という制限がありますが、構文が簡単です。HTMLパーサーとXMLパーサーの2つのモードがあります。

lxml.etreeで読み込む方法

おすすめです。BeautifulSoupよりも高速なライブラリです。巨大なテキストを持ったタグを連続で読み込んでいると不具合を起こす場合がありましたが、huge_tree=Trueを設定すると回避できました

コンテキストタグを読み込む方法

コンテキストタグには色々な情報が入っていて、日付・連結の有無・セグメント情報などが取得できます

これに勘定科目タグを組み合わせることで、日付と金額の表ができあがります。コンテキストのid属性と勘定科目のcontextRef属性でくっつけます。

EDINET(エディネット)XBRLを読み込む

リストやデータフレームに変換するまでのコード例と解説を書きました。EDINET XBRLには2014年以降のバージョン2008年から2013年までの旧バージョンがあります。

名前空間やコンテキストタグに仕様変更がありましたので、読み込みコードも新・旧に対応したものをそれぞれ書きました。

EDGAR(エドガー)XBRLを読み込む

XBRLから決算データを抽出するコード例と抽出したデータをリストやデータフレームに変換するコード例を書きました。

スキーマファイル(XSD)を読み込む

無視しても決算分析はできます。XBRLインスタンス(.xbrl)に関係するその他ファイルへのリンクが載っています。

zipに同梱されているXSDを読み込むコード例と解説を書きました。

スキーマファイルはたとえば以下のケースで必要です。

ラベルファイル(LAB)を読み込む(日本語ラベル)

勘定科目などの名称が載っています。ラベルファイルは複数あって、それらはスキーマファイルからたどれます。

ラベルファイルを読み込むコード例と解説を書きました。

詳細なXBRLパーサーを作る

詳細なXBRLパーサーの作り方と、詳細なXBRLパーサーのコード例(実装例)を書きました。

『詳細な』とは、XBRLから以下のファイルを読み込んで、XBRLデータの全体像を詳細にパースする試みのことです。

  • マニフェスト (manifest)
  • 各種スキーマ (schema、xsdファイル)
  • プレゼンテーションリンク (presentationLink、表示リンク)
  • デフィニションリンク (definitionLink、定義リンク)
  • カルキュレーションリンク (calculationLink、計算リンク)
  • ラベルリンク (labelLink、名称リンク)
  • レファレンスリンク (referenceLink、参照リンク)

これらを、XBRLのzipやzipを展開したフォルダ(解凍したフォルダ)から読み込みます。

読み込んだデータは、XBRLインスタンスごとに、『XBRLインスタンスのデータ』と『発見可能なタクソノミ集合 (DTS: Discoverable Taxonomy Set) のデータ』の2つにまとめます。

読み込み結果のスクリーンショットも掲載しました(Visual Studio codeのウォッチ式の画面です)

勘定科目タグリスト(タグ集約で企業比較を可能にする)

決算分析にあたっては、同じ企業の時系列を見るにしても、他社との比較をするにしても、勘定科目のバラつきが問題になります。それを統一するためのリストを作りました。

EDINET(エディネット)のタグリスト

TDnet(ティーディーネット)のタグリスト

EDGAR(エドガー)のタグリスト

日本のエディネットに関しては、全科目のリストが年度ごとに公開されています。場所は『操作ガイド』というページです。

『タクソノミ要素リスト』と『勘定科目リスト』のエクセルファイルが、全科目のリストになります。

スポンサーリンク

セグメント情報の取得方法(事業別売上高など)

有報には事業別の売上高といった情報がセグメント情報として載っています

これを取得する方法を書きました。大株主トップ10なども同じ方法で取得できます。

グラフ化のためにデータを整える手順

EDGAR XBRLの決算データをグラフ化できるように整える手順を書きました。

一括で抽出した決算データには、同じ科目の金額であってもさまざまな日付や条件のものが混在しています。このままではグラフも指標も正しく出せないので、きれいにする必要があるんですね。

このあたり、EDINETでは比較的簡単に整理できたのですが、EDGARについては色々と判定の手掛かりが少なくて苦労しました。

決算グラフの作り方

決算データからグラフを作るコード例を書きました。

セグメント情報のグラフでは、凡例の中にセグメント名を入れると見やすかったです。matplotlibで凡例の中に日本語タイトルを入れるコード例を書きました。

グラフ画像を圧縮(減色)して高速化する方法

上場企業は約3700社あります。これらについて、売上から資産までグラフを描くと、簡単にギガバイト単位の量になります。matplotlibのPNG保存でこのサイズです。

ピンクォワント(pngquant.exe)で色を減らせば、同じ見た目で4分の1くらいになります。なので、1枚描くたびに減色していくのがお勧めです。pngquantはPythonから呼び出せます。

PNGのファイルパスを渡して減色する方法と、標準入力にPNGデータを渡して減色する方法を書きました。

時系列分析の自動化

数年分の決算をグラフにできて、ようやく1社1社見ていけるようになりました。しかし、どうせなら伸びてる企業を自動で抽出したいですよね?総当たりで見ていくよりも効率的です。

そこで、時系列に直線を引いて右肩上がりの企業ランキングを作る方法を書きました。実際に計算した指標データのCSVも公開しています。Excelで売上高が右肩上がりの企業や右肩下がりの企業を抽出できます

計算結果をExcelで開く

Pythonの計算結果をExcelで開くにはCSVがおすすめです。BOM付きのUTF-8で作ると文字化けせずに開けます。

文字化けするCSVはExcelのテキストインポート機能で開けます。Excelの標準機能です。いろいろなサイトで公開されているCSVに有効です。

ですが、ときどきその機能が押せなくなってることがあります。Excelでテキストインポート機能が使えないときは、クエリのチェックを外すと復活します

CSVに数式で=hyperlink("サイトURL")と書いておくと、Excelでハイパーリンクになります。そのままでも機能するのですが、リンクの書式を一括で青色下線付きにすることもできます。

業績チャートを公開しました

XBRLから作成した業績のグラフをサブサイトで公開しました。XBRLの決算データを独自に整理して描いたものです。

日本企業

米国企業

企業の良し悪しや業績の勢いを見るには、やはりグラフだと思います。グラフ化は大変な作業ですが、企業の勢いがひと目でわかりますよね。前年同期比だけでは見えないところが見えてきます。

利益剰余金が増え続けている企業はどこか?

金額の大小ではなく、利益剰余金の金額が『増え続けている』企業です。

グラフの形は数値化しづらいところですから、なかなか掲載しているサイトがありません。そこで、業績チャートに利益剰余金を積み上げていってる企業の一覧を作りました。売上や自己資本比率などの一覧(科目別ランキング)も作りました。

株価チャートであれば、チャートの形から探せるサービスが結構ありますよね?今後はおそらく、業績についても『右肩上がりから探す』とか、いろいろなサービスが出てくると思います。

業績チャートのランキングは、その先駆けをめざしてつくりました。

グラフの形をどうやって数値化したのかは、時系列分析の自動化のところで紹介しています。単なる直線近似で、それもライブラリにデータを渡すだけなので簡単です。

面倒でむずかしいのは、綺麗な時系列データを準備するところですね。とりあえずざっくり作って、使いながら改善していくアプローチが王道だと思います。

XBRL読み込みライブラリ

決算データを一括で抽出するPythonライブラリを公開しました。

EDINET XBRL用 エディネット

EDGAR XBRL用 エドガー

開発経験談 やればできる!

金融庁のEDINET、東証のTDnet、米国証券取引委員会のEDGAR。これらのXBRLを集計して決算分析システムを作った時の経験談です。

日本の決算は有報(ゆうほう)と短信(たんしん)で2種類ありましたので、ふたつを組み合わせたらグッと完成度が上がりました。有報のXBRLで空欄になったところを短信のデータで補う感じですね。

EDGARのXBRLは大変でしたね。日付を表すコンテキストがうまく処理できなくて、一度はあきらめましたが、アプローチを変えて完成させました。日付のほかにも、四半期と累計を分けて読み込むところが難しくて凄い時間かけて乗り越えました。

個人的な感想では、エドガーがいちばん難しくて、次に東証。エディネットは一番取り組み易かったと思います。

さて、決算分析がラクになったら次は文章情報です。上場企業のニュースをたくさん集めて投資判断に役立てようとした試みを書きました。結論は『適度に受信して読めば良さそう』です。

HTMLからテキストを抽出するには、lxml.htmlがお勧めです。BeautifulSoupよりも高速に処理できます。lxml.htmlでテキストを抽出するコード例を書きました。

EDINETや適時開示のPDFを正規表現で検索するシステムの開発経験談も書きました。PythonでPDFを検索するコード例も載せました。PDFをテキストファイルにしてから検索するという王道のアプローチですが、仕組みが簡単で作りやすかったです。

Excelは便利ですが、ブラウザの右クリックからExcelファイルを検索できればさらに便利です。Firefoxの右クリックから検索するしくみChromeの右クリックから検索するしくみを開発した時の経験談を書きました。

Excel上のテキストから直接Google検索できると便利です。証券コードや社名のセルを選択してChromeやFirefoxに渡すマクロを書きました(Excel VBA)。

あわせて、LibreOffice用のGoogle検索マクロも書きました(LibreOffice Basic)。リブレオフィスで作りましたが、OpenOfficeでも使えると思います。

株式投資をされてる方であれば、ExcelやLibreOfficeで銘柄リストを作っていらっしゃると思います。職人が道具を作ったり磨いたりしていくように、Excelファイルに磨きをかけていくのもまた楽しいですよね。

タイトルとURLをコピーしました