前回は、EDINET APIを使って、有価証券報告書をダウンロードする方法を紹介しました。
これで有価証券報告書のファイル一式は手に入りましたが、これだけでは正直何を見ていいのかわからないと思います。
今回は、この解凍したファイルからデータを取り出す方法を紹介していきます。
まだ、データの取得ができていない場合は、先に前回の記事を確認してください。
今回使用したコードはこちらのGoogleColabで確認できます。
有価証券報告書のファイル構造
前回の記事では API を使って 有価証券報告書の ZIP ファイルをダウンロードし、中身を解凍するところまで行いました。
フォルダーの中にはいくつかファイルが入っていますが、一部のファイルはHTML 形式のためブラウザで開くと内容を目で確認することができます。
その他に拡張子が.xbrlとなっているファイルが存在すると思います。これが xbrl 形式のファイルであり、このファイルに開示情報の基本的な内容が全て記載されています。この xbrl ファイルは コンピューターが文書の中身を構造的に把握することができるように作られた形式のファイルになります。
今回は詳細は割愛しますが、このファイルをうまく読み込んで必要なデータを抽出することが、Python で有価証券報告書のデータを分析するためには、重要な第一歩となります。
XBRLファイルはどういった情報なのかを区別するラベルが存在していますが、そのラベルが同じ意味でも異なるIDが使われていたりするため、解析が難しいというところがあります。
例えば同じ売上高という意味の内容でも様々な ID が使用されているケースがあります。
沢山のXBRLファイルを解析することによってそのタグがどの内容を示しているのか、日本語の意味を取得することができますが、これらを自力で全て解析しようとするのはかなり手間がかかります。
そこで、様々な情報を探したところ、Pythonで使えるArelleというライブラリがXBRLの解析に非常に便利であることが分かりました。このライブラリはXBRLを解析して、それに付随するラベル定義のファイルを読み込んでくれるので、どういった項目が含まれているのかを取得することができます。
今回はこのArelleを使った解析方法を紹介していきます。
Arelleを使った解析
まずは Python でArelleを使えるようにインストールします。
! pip install arelle-release
続いて前回ダウンロードしたドキュメントの中から xbrl ファイルを取り出して読み込みます。
from arelle import Cntlr
import pandas as pd
from arelle import Cntlr
import glob
from arelle import Cntlr, ViewFileFactTable, XbrlConst, ViewFile, ModelDtsObject, XmlUtil
doc_id = 'S100TL**'#ダウンロードしたドキュメントのdocID
xbrl_file = glob.glob(f'{doc_id}/XBRL/PublicDoc/*.xbrl')[0]
xbrl_file
ctrl = Cntlr.Cntlr(logFileName='logToPrint')
modelXbrl = ctrl.modelManager.load(xbrl_file)
xbrl ファイルにはそれぞれ項目を区別するためにqnameと呼ばれるものが存在しています。
このqnameがわかれば必要なデータを簡単に取り出すことができます。
例えば、資産の項目を意味する'jppfs_cor:Assets'
のコンテンツを取得してみましょう。
ここで注意したいのは、Arelleのqnameは文字列ではなくオブジェクトとして扱われているので、factsByQname
がありますが文字列を入力するとうまく動きません。
qname = 'jppfs_cor:Assets'
modelXbrl.factsByQname['jppfs_cor:Assets']
代わりに下記のようにする必要があります。
for fact in modelXbrl.facts:
# コンセプトの値を取得
if str(fact.qname) == qname:
print(fact.qname)
print(fact.contextID)
print(fact.xValue)
全体としてどのような項目があるのか全てを取得したい場合は以下のように取得することができます。
解析した全ての要素はfacts
に含まれます。この中身を一つずつ取り出してID や値を取得することができます。
from arelle import Cntlr
import pandas as pd
from arelle import Cntlr
import glob
fact_datas = []
for fact in modelXbrl.facts:
label_ja = fact.concept.label(preferredLabel=None, lang='ja', linkroleHint=None)
x_value = fact.xValue
if fact.context.startDatetime:
start_date = fact.context.startDatetime
else:
start_date = None
if fact.context.endDatetime:
end_date = fact.context.endDatetime
else:
end_date = None
if fact.unit is not None:
unit = fact.unit.value,
else:
unit = None
fact_datas.append([
fact.qname,
label_ja,
x_value,
start_date,
end_date,
fact.contextID,
])
if fact.getparent().getparent():
print(label_ja)
df = pd.DataFrame(fact_datas,
columns=['qname', '項目', 'value', '期首', '期末', 'contextID','unit'] )
df
実は、このようなことを自分で行わなくてもArelleには、XBRLのコンテンツをファイルに書き出す機能があります。
全ての要素を書き出すためのコードが以下になります。
from arelle import ViewFileFactList
list_cols = ['Concept', 'Label', 'Name', 'LocalName', 'Namespace', 'contextRef', 'unitRef', 'Dec', 'Value', 'Period', 'ID', 'Type', 'PeriodType']
ViewFileFactList.viewFacts(modelXbrl, "test-list.csv",lang='ja',cols=list_cols)
df = pd.read_csv('test-list.csv',engine='python')
df
xbrl 形式のファイルには、親子関係という関係性が記入されている場合があります。
例えば資産を親要素として、子要素に流動資産や純資産があるといったイメージです。
このような関係性を反映したファイル構造で出力するためには、ViewFileFactTable
が便利です。
cols = ['Concept', 'Facts', 'Label', 'Name', 'LocalName', 'Namespace', 'ParentName', 'ParentLocalName', 'ParentNamespace', 'ID', 'Type', 'PeriodType', 'Balance', 'StandardLabel', 'TerseLabel', 'Documentation', 'LinkRole', 'LinkDefinition', 'PreferredLabelRole', 'Depth', 'ArcRole']
ViewFileFactTable.viewFacts(modelXbrl, 'test.csv', arcrole=XbrlConst.summationItem,cols=cols , lang='ja')
df = pd.read_csv('test.csv')
df
今回は、Arelleを使って、有価証券報告書の xbrl ファイルを読み込んで必要な情報を抽出する方法を紹介しました。次回はもう少し、Arelleの使い方を踏み込んで説明し、貸借対照表や損益計算書などに記載される財務数値を、年ごとにまとめた表を出力したいと思います。