👋

EDINETからデータを取得する方法

2022/09/30に公開

EDINETからデータを取得する方法

EDINETとは、有価証券報告書をはじめとする開示書類を電子的に公開するシステムである。このシステムを活用することで、最大で過去3年分の有価証券報告書 (6年分の会計情報) を入手することが出来る。本資料では、まずEDINETを利用したデータのダウンロード方法について説明する。最終的に、XBRLファイルから企業の財務情報を入手する方法について説明する。

※ このドキュメントは、github上で公開しています: https://github.com/ys-fr/edinet_howto 。コメント・校正していただけるありがたいです

有価証券報告書とは:

まず、有価証券報告書から得られる情報について説明しよう。有価証券報告書とは、上場企業に各年度ごとに開示が義務付けられている書類の名称である。この書類は、企業の資産や負債をはじめとする企業の財務情報や役員の情報などの企業の経営情報を多く含む。そのため、投資家が企業の状態を把握する上で重要な書類の一つであると言える。

データのダウンロード方法

本章では、EDINETからデータをダウンロードする方法について説明する。EDINETからデータをダウンロードする方法は2つある:

  1. GUIからダウンロードする方法
    • プログラミングの知識はいらない
    • データをマニュアルで入力する必要がある
  2. APIを活用してダウンロードする方法
    • プログラミングの知識が必要
    • データを自動で取得可能
      • 一番面倒なデータの加工はある程度私がやっておきました
      • 私のサンプルコードの設定を変更すれば、簡単に財務データを取得できると思います

本章では以上の方法を用いたデータのダウンロード方法を説明する。最終的に、XBRLファイルから財務情報を取得する方法について説明する。

※ 本ドキュメントでは、Pythonを利用した例を紹介します. また、コードの動作確認はLinux (Ubuntu20.04) 上で行なっています。windowsやmacで動くかどうかは知りません (多分動くと思う...)。

GUI からダウンロードする方法

まず、GUIからダウンロードする方法について説明しよう(image/EDINET_GetData.webm の動画の内容を説明する)。to be written...

APIを活用してダウンロードする方法

次に、APIを活用してダウンロードする方法について説明しよう。EDINETは、有価証券報告書を始めとするう開示書類を取得するためのアプリケーションインターフェース (application interface, API) を提供している。そのAPIレスポンスを利用することで、有価証券報告書を始めとする開示書類をダウンロードすることが出来る:

import requests
import glob
import os
from pathlib import Path
import edinet
from edinet.xbrl_file import XBRLDir
import pandas as pd
# DOC_ID に取得したいドキュメントのDOC_IDを入力する
# DOC_ID は、AboutAPI/ProcessedData/AvailableData_0927/AvailableData.csv のファイルから調べる
DOC_ID = "***"
# データをダウンロードする
# データの保存先をpathに入力する
path = "***"
xbrl_path = edinet.api.document.get_xbrl(
            DOC_ID, save_dir=path,
            expand_level="dir")

XBRLファイルからデータを取得する

XBRLファイルとは、有価証券報告書などの開示文書と同時に提出されるファイルである。また、そのファイルに記述されている内容は、PDF版の有価証券報告書と等価なものが記載されている。しかし、そのファイルのフォーマットは機械フレンドリーに作られている。そのため、人間が読むには適さない。本章では、そのxbrlファイルを適切に処理し、財務データを取得する方法について解説する。

※ここでの解説は公式サイトに準拠します。

XBRLファイルのフォーマットについて

XBRLファイルは、html言語のようなタグの集合として構成される:

  <jpcrp_cor:CashAndCashEquivalentsIFRSSummaryOfBusinessResults contextRef="CurrentYearInstant" unitRef="JPY" decimals="-6">29367000000</jpcrp_cor:CashAndCashEquivalentsIFRSSummaryOfBusinessResults>

XBRLファイルに記述されている内容を適切に理解するために、``<...>text</...>''のフォーマットで書かれるタグの読み方を一つ一つ説明しよう。

``<...>text</...>''の第一要素: 要素名

まず、``<...>''に含まれる第一要素である「jpcrp_cor:CashAndCashEquivalentsIFRSSummaryOfBusinessResults 」について説明しよう。この第一要素は、タグで囲まれるtextの内容を表す識別子である。この識別子が指す財務指標はは、タクソノミ対応表を確認することで調べることが出来る。また、このディレクトリ にもその対応表を配置した。

``<...>text</...>''の第二要素: コンテキストID

次に、``<...>''に含まれる第二要素である「contextRef="CurrentYearInstant"」について説明しよう。この第二要素は、そのデータがいつのものかを表す指標である:

No contextRef 意味
1 CurrentYear 当年度を意味します。
2 Interim 中間期を意味します。
3 Prior1Year 前年度を意味します。
4 Prior1Interim 前中間期を意味します。
5 Prior2Year 前々年度を意味します。
6 Prior2Interim 前々中間期を意味します。
7 Prior{n}Year {n}年度前を意味します。
8 Prior{n}Interim {n}年度前中間期を意味します。
9 CurrentYTD 当四半期累計期間を意味します。
10 CurrentQuarter 当四半期会計期間を意味します。
11 Prior{n}YTD {n}年度前同四半期累計期間を意味します。
12 Prior{n}Quarter {n}年度前同四半期会計期間を意味します。
13 FilingDate 提出日を意味します。
14 RecordDate 議決権行使の基準日を意味します。※1
15 RecentDate 最近日を意味します。※2、3
16 FutureDate 予定日を意味します。※3
17 Instant 時点を意味します。
18 Duration 期間を意味します。
19 メンバーの要素名 メンバーの要素名を意味します。

``<...>text</...>''の第三要素: ユニットID

次に、``<...>''に含まれる第三要素である「unitRef="JPY"」について説明しよう。この第三要素は、そのデータに記載されている価格の単位を表す。日本の企業のであれば、多くの場合は日本円 (JPY) で単位が記述される。その他の単位に関しては、このサイト を参照

``<...>text</...>''の第四要素: 数値の精度

次に、``<...>''に含まれる第四要素である「decimals="-6"」について説明しよう。この第四要素は、そのデータに記載されている価格の精度を表す(100万単位など)。

その他の要素について

この画像を参照してください:

https://www.fsa.go.jp/search/20211109/2b-1_InstanceGuide.pdf より2022年9月30日時点の画像を引用.

データの取得方法

ここでは、XBRLを読み込むためのパッケージである'xbrl'を使用したデータの取得例を説明しよう。xbrlファイルは下記のようにして読み込むことが出来る:

import edinet
from edinet.xbrl_file import XBRLDir
import pandas as pd
# DOC_IDにダウンロードしてきたファイルのディレクトリを入力する
DOC_ID = "***"
# xbrl_dirがxbrlファイルを読み込んだ
xbrl_dir = XBRLDir("./"+DOC_ID)

次に、xbrlファイルを読み込んだxbrl_dirがどのようなオブジェクトを持っているかについて説明しよう

# ある財務指標に関して、当年の情報を取得する(対応するタクソノミを引数として入力する)
tag = xbrl_dir.xbrl.find(タクソノミ名)
# <...>text</...> のフォーマットで読み込まれているtagからtext (財務情報) を抽出する
tag.text
# <...>text</...> のフォーマットで読み込まれているtagから ... に記述されている情報を辞書形式で抽出する:
element = tag._element
# contextRefの情報を取り出す場合:
element["contextRef"]
# unitRefの情報を取り出す場合:
element["unitRef"]
# decimalsの情報を取り出す場合:
element["decimals"]


# ある財務指標に関して、入手可能なすべての年のデータを取得する (同一のタクソノミを含むすべてのタグを読み込む). また、読み込んだデータはリストで格納される
tags = xbrl_dir.xbrl.find_all(タクソノミ名)

例:

XBRLファイルに含まれるタクソノミ要素リストの確認

まず、XBRLファイルに含まれるタクソノミ要素リスト(取得可能なデータリスト)を検索する方法について説明しよう:

# pathには、XBRLファイルの絶対パスを入力する
path = "***"
data = pd.read_csv(path,sep="\n",header=None)
# Tagsに利用可能なタクソノミを格納する
Tags = []
for i in data[0].values:
    i = i.split(" ")
    n = 0
    dic = {}
    N = len(i)
    for j in i:
        if len(j)==0:
            continue
        j = j.strip("<")
        # 第一要素名が「j」から始まるものが、財務情報のタグ名
        if j[0]=="j":
            Tags.append(j)
        break
    pass

分析に必要なデータを抽出する

上のコマンドを実行して、Tagsに利用可能なデータの一覧を取得した。次に、そのTagsの中に含まれるデータの中から必要なデータを選択し、取得する方法について説明しよう:

import edinet
from edinet.xbrl_file import XBRLDir
import pandas as pd
# DOC_IDにダウンロードしてきたファイルのディレクトリを入力する
DOC_ID = "***"
xbrl_dir = XBRLDir("./"+DOC_ID)
# 例: 補助金収入を確認する
for i in xbrl_dir.xbrl.find_all("jpcrp_cor:AuditFeesConsolidatedSubsidiaries"):
    print(i._element["contextRef"], i.text)
    # Prior1YearDuration 23000000
    # CurrentYearDuration 23000000

この一連の分析手続きは、リンクを確認してください。

具体例

参考

Discussion