XBRLの解説です。XBRLの取得方法から読み込み・作図・指標計算を行ってきた記事をまとめました。
XBRL解析では、主にPythonを使っています。
掲載しているプログラムのコードは自由にお使いください。
もくじから必要なところだけ拾い読みするのがおすすめです。
コードを色々載せていますが、こまかい内容は理解しなくて大丈夫です。参考になったところだけ拾ってください。
XBRLを利用した決算分析の参考になれば幸いです。
EDINET API を使用して XBRL を取得する方法を書きました。
⇒ 【EDINET API】Python で XBRL を取得する方法【決算分析】
XBRL の読み込みは Arelle(アレル)という Python ライブラリを使ってみるのが良いと思います。Arelle の使い方を書きました。
⇒ 【Python】Arelle のインストール方法【XBRL 読み込みライブラリ】
小さく作る
単機能なら簡単
全体を見ると果てしない感じですが、実際には単機能なプログラムの集まりです。XBRLの取得だけ、XBRLの読み込みだけ、勘定科目の抽出だけ、グラフ化だけ、時系列分析だけという感じです。私もひとつずつ小さく小さく作ってきました。それぞれのデータの受け渡しはCSVファイルやPickle(ピックル)ファイルで行いました。
デバッグが簡単になるので、Pythonはログを取るのがおすすめです。ロギング方法を書きました。また、Pythonプロセスの優先度を変更すると、たくさんのXBRLを解析しているときでもPCの操作が快適になります。どちらもコードはお決まりのパターンでしたので、おすすめです。
Pythonプログラムを開発するときは、例外クラスを自作しておくと、デバッグがはかどりました。自分の場合は、class XBRLParseError(Exception) のような例外クラスをひとつ作って使っています。例外クラスの作り方は決まりきっていて、わずか3行でした。一般のプログラム開発にもお勧めです。
自作の例外クラスで例外を発生させて、それをログファイルに記録する。おそらく、王道のアプローチだと思います。
全部を自分で作る必要はない
わたしは楽しかったので作ってしまいましたが、XBRLを取得して集計して、実際に銘柄分析に役立てるところまで持っていくのは、かなり大変でした。難しいのではなくて、単純に分析までたどり着くのに時間がかかりました。
自分で作らなくても、証券会社によっては、無料サービスのひとつとして、長期の決算グラフを表示してくれるところがありました。
まだ証券口座を持っていない方は、そういったサービスを提供している証券会社で、証券口座を開設するのがおすすめです。
株式投資でプログラミングがぶっちゃけ必要ない理由という記事を書きました。
証券口座を開設したからといって、実際に株式を売買する必要はないです。
証券口座にログインするだけで、すでにツールはそろっている時代なのです。
そういった証券口座の画面です。自分は、その画面を見て、凄くいい刺激を受けました。証券口座は、維持費が無料のところも、たくさんありました。
まずは、証券口座を作って活用するべきです。
どのみち、株式を買うためには証券口座が必要になります。
しかしながら、自分でプログラムを書くのはかなり楽しかったです。研究開発が好きなら、XBRLはおすすめです。
上場企業の財務分析をおすすめする4つの理由を書きました。未開拓の領域が、まだまだたくさんありました。
XBRLの取得方法
日本企業のXBRL
EDINETコードリストを使ってXBRLを取得します。このCSVはPythonのcsvモジュールやpandasライブラリなどで読み込めます。
決算書のXBRLですが、有価証券報告書のものと決算短信のものがあります。
決算短信のXBRLは東証の「適時開示」と「基本情報」の2箇所から取得できます。
米国企業の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を読み込むコード例と解説を書きました。
スキーマファイルはたとえば以下のケースで必要です。
- PDFに載ってるような日本語名や英語名をつけたい
- 連結財務諸表の有無を調べたい
- ティッカーシンボルを取得したい
ラベルファイル(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のウォッチ式の画面です)。
勘定科目タグリスト(タグ集約で企業比較を可能にする)
決算分析にあたっては、同じ企業の時系列を見るにしても、他社との比較をするにしても、勘定科目のバラつきが問題になります。
それを統一するためのリストを作りました。
日本のエディネットに関しては、全科目のリストが年度ごとに公開されています。場所は『操作ガイド』というページです。
『タクソノミ要素リスト』と『勘定科目リスト』のエクセルファイルが、全科目のリストになります。
自分がどうやって企業の決算を比較可能な状態に持っていったのか?という話も書きました。
異なる業種・業態の企業を比べることに意味があるのか?ということに関しては、いろいろな意見があると思います。しかしながら、金額そのものではなくて、金額の変化とか、業績の方向感を比べるのであれば有用であると、自分は思いました。
セグメント情報の取得方法(事業別売上高など)
有報には事業別の売上高といった情報がセグメント情報として載っています。
これを取得する方法を書きました。大株主トップ10なども同じ方法で取得できます。
グラフ化のためにデータを整える手順
EDGAR XBRLの決算データをグラフ化できるように整える手順を書きました。
一括で抽出した決算データには、同じ科目の金額であってもさまざまな日付や条件のものが混在しています。このままではグラフも指標も正しく出せないので、きれいにする必要があるんですね。
このあたり、EDINETでは比較的簡単に整理できたのですが、EDGARについては色々と判定の手掛かりが少なくて苦労しました。
決算グラフの作り方
決算データからグラフを作るコード例を書きました。
セグメント情報のグラフでは、凡例の中にセグメント名を入れると見やすかったです。matplotlibで凡例の中に日本語タイトルを入れるコード例を書きました。
グラフ画像を圧縮(減色)して高速化する方法
上場企業は約3700社あります。これらについて、売上から資産までグラフを描くと、簡単にギガバイト単位の量になります。matplotlib の PNG 保存でこのサイズです。
ピンクォワント (pngquant.exe) で色を減らせば、同じ見た目で4分の1くらいになります。なので、1枚描くたびに減色していくのがお勧めです。pngquant は Pythonから呼び出せます。
PNGのファイルパスを渡して減色する方法と、標準入力にPNGデータを渡して減色する方法を書きました。
PNG よりも新しい WebP で保存したら、さらに小さくできた話も書きました。減色までして、もうこれ以上は減らせないだろうと思っていたところから、さらに小さくできました。
時系列分析の自動化
数年分の決算をグラフにできて、ようやく1社1社見ていけるようになりました。しかし、どうせなら伸びてる企業を自動で抽出したいですよね?総当たりで見ていくよりも効率的です。
そこで、時系列に直線を引いて右肩上がりの企業ランキングを作る方法を書きました。
計算結果をExcelで開く
Pythonの計算結果をExcelで開くにはCSVがおすすめです。BOM付きのUTF-8で作ると文字化けせずに開けます。
文字化けするCSVはExcelのテキストインポート機能で開けます。Excelの標準機能です。いろいろなサイトで公開されているCSVに有効です。
ですが、ときどきその機能が押せなくなってることがあります。Excelでテキストインポート機能が使えないときは、クエリのチェックを外すと復活します。
CSVに数式で=hyperlink("サイトURL")
と書いておくと、Excelでハイパーリンクになります。そのままでも機能するのですが、リンクの書式を一括で青色下線付きにすることもできます。
利益剰余金が増え続けている企業はどこか?
金額の大小ではなく、利益剰余金の金額が『増え続けている』企業です。
グラフの形は数値化しづらいところですから、なかなか掲載しているサイトがありません。
株価チャートであれば、チャートの形から探せるサービスが結構ありますよね?今後はおそらく、業績についても『右肩上がりから探す』とか、いろいろなサービスが出てくると思います。
グラフの形を数値化する方法の一例を時系列分析の自動化に書きました。単なる直線近似で、それもライブラリにデータを渡すだけなので簡単です。
面倒でむずかしいのは、綺麗な時系列データを準備するところですね。とりあえずざっくり作って、使いながら改善していくアプローチが王道だと思います。
XBRL読み込みライブラリ
(2022年3月31日 追記)
Python で XBRL を読み込むなら、まずは Arelle の使用をおすすめします。上記の画像のようなデータが取得できました。
(追記終わり)
決算データを一括で抽出するPythonライブラリを公開しました。
EDINET XBRL用 エディネット
EDGAR XBRL用 エドガー
開発経験談 やればできる!
金融庁のEDINET、東証のTDnet、米国証券取引委員会のEDGAR。これらのXBRLを集計して決算分析システムを作った時の経験談です。
日本の決算は有報(ゆうほう)と短信(たんしん)で2種類ありましたので、ふたつを組み合わせたらグッと完成度が上がりました。有報のXBRLで空欄になったところを短信のデータで補う感じですね。
EDGARのXBRLは大変でしたね。日付を表すコンテキストがうまく処理できなくて、一度はあきらめましたが、アプローチを変えて完成させました。日付のほかにも、四半期と累計を分けて読み込むところが難しくて凄い時間かけて乗り越えました。
個人的な感想では、エドガーがいちばん難しくて、次に東証。エディネットは一番取り組み易かったと思います。
さて、決算分析がラクになったら次は文章情報です。上場企業のニュースをたくさん集めて投資判断に役立てようとした試みを書きました。結論は『適度に受信して読めば良さそう』です。
HTMLからテキストを抽出するには、lxml.htmlがお勧めです。BeautifulSoupよりも高速に処理できます。lxml.htmlでテキストを抽出するコード例を書きました。
EDINETや適時開示のPDFを正規表現で検索するシステムの開発経験談も書きました。PythonでPDFを検索するコード例も載せました。PDFをテキストファイルにしてから検索するという王道のアプローチですが、仕組みが簡単で作りやすかったです。