以下は、自分が XBRL を読み込むために作成した Python ライブラリです。
米国証券取引委員会のエドガー (EDGAR) で公開されている XBRL を読み込むために作りました。
米国企業の決算書を読み込むためのものです。
企業の決算書を表すフォーム・タイプは 10-Q、10-K、10-Q/A、10-K/A です。これらの XBRL に対応しています。
このライブラリは、各勘定科目のタグ名・金額・日付・セグメント・単位といった情報を、XBRLファイルから一括で取得します。
要は、XBRLデータの中身をスクレイピングするライブラリです。
たとえば、以下のようなデータが取得できます。
コンテキストやユニットの定義をたどって、表形式に組み立てるのが主な機能です。
このデータから「時系列分析」をした時の記事がこちら
時系列から「重複の排除」や「四半期と累計の区別」などを行う手順がこちら
XBRLから抽出したデータをグラフ化できるように整える手順【EDGAR】
このライブラリに XBRL のファイルパスを渡すと、上の画像のような Python リストが返ってきますので、ある企業のXBRLを全て連結して、売上・利益の時系列グラフを描く、といったことに使えます。
(日本のEDINET XBRL用のライブラリも作りました)
もっと詳細なXBRLパーサーの作り方の記事も書きました。
以下、XBRL解析ライブラリの説明です。
Pythonライブラリのダウンロード
EDGAR XBRL を読み込む Python ライブラリ です。
(xbrl reader for edgar)
xbrl_reader_for_edgar_20180828-00.zip (zip形式 7.24 KB)
※ このライブラリは、当サイトの管理人が作成したものです。
EDGAR システムや米国証券取引委員会などは無関係です。
ライセンス (NYSL Version 0.9982)
このライセンスは、上記ライブラリの中の各Pythonファイルに対して適用します。
これらのPythonファイルの中でインポートしているその他のライブラリに関しては、それぞれのライセンスに従ってご利用ください。
NYSL Version 0.9982
A. 本ソフトウェアは Everyone’sWare です。このソフトを手にした一人一人が、
ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。A-1. フリーウェアです。作者からは使用料等を要求しません。
A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。
A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。
A-4. 変更したものや部分的に使用したものは、あなたのものになります。
公開する場合は、あなたの名前の下で行って下さい。B. このソフトを利用することによって生じた損害等について、作者は
責任を負わないものとします。各自の責任においてご利用下さい。C. 著作者人格権は シラベルノート はるかわ に帰属します。著作権は放棄します。
D. 以上の3項は、ソース・実行バイナリの双方に適用されます。
動作環境と必要なライブラリ
カッコ内は動作確認で使用したバージョンです。
極端に古くなければ、ほかのバージョンでも動くと思います。
- Python (3.5.2) 64bit版
- lxml (4.2.4)
- python-dateutil (2.7.3)
- pandas (0.21.1)
インストール手順
ダウンロードした zip の中身を、あなたが開発している Python ファイルと同じフォルダに展開します。
または、別のフォルダに展開して、そのフォルダへのパスを sys.path のリストに追加します。
"""あなたが開発しているPythonファイル.py"""
import sys
sys.path.append(r'ライブラリを展開したフォルダへのパス')
これで、あなたの Python ファイルからインポートできるようになりました。
アンインストール手順
インストール手順で展開した Python ファイルを削除してください。
これで、アンインストールは完了です。
あと、ライブラリを使用した場合は、「__pycache__」というフォルダに「.pyc」というキャッシュファイルが作られていると思います。展開した Python ファイルの名前が入ったキャッシュファイルは不要ですので、これも削除してください。
「.pyc」の説明は、以下の Python マニュアルをご覧ください。
Python ドキュメント – モジュール (module) “コンパイル” された Python ファイル
XBRLファイルを読み込む
複数の Python ファイルに分かれていますが、実際にインポートして使うのは「エックス・ビー・アール・エル・プロック(xbrl_proc.py)」にある、以下の関数です。
get_xbrl_datas(
xbrl_file=None, # XBRL ファイルパス
xbrl_file_data=None, # XBRL バイナリデータ
skip_textblock=False, # テキストブロックをスキップするか?
skip_text_len=None, # 指定した文字列より長いテキストをスキップするか?
strip_space=True, # テキストの先頭と末尾の空白文字を除去するか?
newline='\n', # 指定した改行コードで統一する。
)
戻り値:(ラベル行のリスト, データ行のリスト)
xbrl_file に XBRL のファイルパスを渡すと、ラベル行のリストと、データ行のリストがタプルになって返ってきます。
xbrl_file_data は、zip から読み込んだ XBRL ファイルのバイナリデータを受け取るための引数です。xbrl_file か xbrl_file_data のどちらか一方を指定します。
ほかのオプションは、デフォルトで全ての勘定科目タグを取得するようになっています。
strip_space と newline は、デフォルトの設定がお勧めです。
使用例
単純に、XBRL のファイルパスかバイナリデータを渡せば、すべての勘定科目が取得できるようになっています。
その他のオプションは、巨大なテキストをもつタグをスキップしたいときに使用します。
ファイルパスを指定して読み込む
xbrl_file にファイルパスを渡します。
# ファイルパスを指定して読み込む
from xbrl_proc import get_xbrl_datas
xbrl_file = r"*****\xxxx-20180331.xml"
(labels, datas) = get_xbrl_datas(xbrl_file=xbrl_file)
バイナリデータを渡して読み込む
zip ファイルから読み込んだバイナリデータを渡して読み込む場合です。バイナリデータ用の引数に渡します。
# バイナリデータを渡して読み込む
from xbrl_proc import get_xbrl_datas
xbrl_file_data = (zipから読み込んだXBRLのバイナリデータ)
(labels, datas) = get_xbrl_datas(xbrl_file_data=xbrl_file_data)
巨大なテキストをスキップする
XBRL の中には、10万字、100万字を超える巨大なテキストを持ったタグが存在します。
これを読み込むこと自体は問題ないのですが、1セルあたり 32767 文字を超えるようなテキストは、CSVにしたときに Excel で正しく読み込めません。表が崩れてしまいます。
この現象を回避するために、大きすぎるテキストを取り込まないようにするオプションを用意しました。
# 巨大なテキストをスキップして読み込む
from xbrl_proc import get_xbrl_datas
xbrl_file = r"*****\xxxx-20180331.xml"
(labels, datas) = get_xbrl_datas(
xbrl_file=xbrl_file,
skip_text_len=30000, # 3万字を超えるテキストをスキップ
)
一応、タグ名に TextBlock と付くものをスキップするオプションも用意したのですが、文字数でスキップするほうが確実でした。テキストブロックでなくても、巨大なテキストを持つタグが存在したんですね。
テキスト情報が不要なら、skip_textblock=True を設定して、かつ、skip_text_len も小さめに設定するとよいかもしれません。テキストを取り込まない分、読み込み速度も上がります。
データフレームに変換する
get_xbrl_datas() の戻り値を pandas.DataFrame に変換する関数も用意しました。
以下のように、ラベルとデータを conv_list_to_df() に渡すと、データフレームが返ってきます。
# ファイルパスを指定して読み込む
from xbrl_proc import get_xbrl_datas
from xbrl_proc import conv_list_to_df
xbrl_file = r"*****\xxxx-20180331.xml"
(labels, datas) = get_xbrl_datas(xbrl_file=xbrl_file)
# リストをデータフレームに変換する
df = conv_list_to_df(labels, datas)
なお、日付に関する列は、あえて Python の datetime 型に変換しています。Pandas の Timestamp 型では、西暦3000年といった日付が扱えなかったので、そのようにしています。
Pythonコードの解説
以下の記事で解説しています。ライブラリの構造を知りたい時にご覧ください。
EDGAR XBRLをリストやデータフレームに変換するコード例【Python】
プログラミングの参考になれば幸いです