EDINETの有価証券報告書や四半期報告書から、不正会計の兆候を検出するアプリを作成しています。現在、CSVファイルをダウンロードして分析するアプリは完成していますが、これだとまだ手動部分が残るので、できればさらに楽をしたいと考えています。
EDINETで開示されているCSVファイルは癖があって、そのままではPythonのPandasライブラリで読み込むことができません。
そこで、CSVファイルを扱うのではなく、APIを使用してXBRLを直接扱うことで、さらなる自動化を目指しています。
このような財務分析を行う上ではPythonが便利です。PythonでXBRLを扱う方法についていろいろ調べたのですが、かなりニッチな分野なので、情報がほとんど出てきません。そのため、備忘として残しておきたいと思います。
Arelleのインストール
XBRL(eXtensible Business Reporting Language)は、各種事業報告用の情報(財務・経営・投資などの様々な情報)を作成・流通・利用できるように標準化されたXMLベースのコンピュータ言語です。特に、組織における財務情報・開示情報(財務諸表や内部報告など)の記述に適しています。
XBRL Japanのサイトより
しかし、このXBRLはかなり難しく、これを読み解いて分析するためのコードを作成するのは容易ではありません。そこで、少しでも楽ができるツールが欲しいところですが、さすがは世界は広く、すでにそのような便利なツールが存在します。
せっかく便利な道具があるので、車輪の再発明をする必要はありません。
それが、「Arelle」というパッケージです。これをPython環境にインストールすれば、XBRLを解析することができます。
Arelleは、XBRL(eXtensible Business Reporting Language)ファイルを処理し、解析するためのオープンソースのツールです。以下は、Arelleの使い方について簡単に説明したものです。
Arelleのインストール
さて、まずはArelleをインストールする必要がありますが、他の環境に影響を及ぼさないように、インストール前に、XBRL解析用の仮想環境を構築しておくことをお勧めします。
さて、このArelleのインストール手続きですが、実は一手間必要です。
Pythonで使うパッケージは依存関係があり、そのパッケージが入っていないと動かない、ということが多いです。Arelleも同様で、まずArelleを作動させるためのパッケージをインストールしておきます。(condaコマンドで入るものは、できるだけcondaを使用します)
conda install lxml
conda install isodate
conda install regex
conda install pyparsing
- インストール: Arelleを使うには、まずArelleをインストールする必要があります。一般的には、pipを使ってArelleをインストールします。
続いて、Arelleをインストールします。これはcondaでは入りませんので、pipを使います。
pip install arelle
しかし、インストールされたArelleは旧型です。新型のArelleのインストールはかなり厄介なので、一旦旧型をインストールした後に手動でファイルを上書きします。まず、旧型のArelleがシステムのどこに入っているのかを知る必要があります。以下のコードを実行すると、ファイルパスが表示されます。
import arelle
print(arelle.__file__)
場所がわかったら、Arelleのファイルが公開されているGitHubに行き、「Code」をクリックし、「Download ZIP」をクリックします。ファイルがダウンロードできます。
zipファイルを解凍し、arelleフォルダの中身をすべて先ほど調べたarelleフォルダに上書きコピーします。これで環境構築は終わりです。
Arelleの動作確認
EDINETから、トヨタ自動車の最新の有価証券報告書のXBRLファイルをダウンロードし、解凍したらXBRL以下のフォルダをフォルダごと適当な場所に保存します。
Jupyter Labなどを使って、以下のコードを入力して、結果が正しく表示されればOKです。
from arelle import Cntlr, ModelManager
from arelle.ModelValue import qname
xbrl_file = "/Users/フォルダ名/XBRL/PublicDoc/jpcrp030000-asr-001_E02144-000_2023-03-31_01_2023-06-30.xbrl"
ctrl = Cntlr.Cntlr(logFileName='logToPrint')
model_xbrl = ctrl.modelManager.load(xbrl_file)
company = None
for fact in model_xbrl.facts:
if fact.concept.qname.localName == "FilerNameInJapaneseDEI":
company = fact.value
print("企業名:" + str(company))
企業名:トヨタ自動車株式会社