👻

『Python』EDINET上の財務情報を取得・アプリで可視化➀

2023/03/01に公開

はじめに

今回は、EDINETというサイトから上場企業の有価証券報告書を取得し、その情報をローカル環境のアプリで可視化する作業について記載していこうと思います。(➀から➂に分けて記載します。)

大まかな流れは下の図の通りです。

この記事では、EDINET APIで書類を取得し保存する工程をGoogle Colabで実行した時のコードを記載したいと思います。

EDINETについて

https://www.fsa.go.jp/search/20130917.html

EDINETは、ざっくり言えば様々な企業の決算情報を纏めた書類を縦覧できるサイトです。
それぞれの書類をPDFやXBRLなどの形式で取得することが出来るようになっています。

そして今回、APIで書類を取得するにあたり必要なものがあるので、このサイトから取ってくる方法を書いておきます。
必要なもの:EDINETコード
手順:上記URLからEDINETの閲覧サイトにアクセス
   ➡「EDINETタクソノミ及びコードリスト ダウンロード」を選択
   ➡下へスクロールしてEDINETコードリストのCSVをダウンロード
   ➡あとはこのCSVを開いて企業のEDINETコードを把握すればOK

黄色いマーカーを引いた箇所がEDINETコード、「E」が先頭についています。

また、APIについての仕様書も閲覧サイトからダウンロードできるのでその取り方も記載しておきます。
手順:EDINETの閲覧サイトにアクセス
   ➡左のトップメニューの「操作ガイド等」を選択
   ➡EDINET API関連資料の「EDINET API仕様書」をダウンロード

実行したコード

今回は一つの企業の過去5期分の有価証券報告書をXBRL・PDFでそれぞれ取得しました。
(PDFはホームページから直接取得できるので実際は必要ないですが、取り方を把握しておきたかったので記載しています。)
ライブラリのインポート、関数の読み込み、変数の定義、書類の取得・保存という形に分けて記載しています。

ライブラリのインポート
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/My Drive/スクレイピング/EDINET')
# pwd:/content/drive/My Drive/スクレイピング/EDINET

import zipfile
import pandas as pd
import requests
from tqdm import tqdm # これは別に無くても良い(ループの進捗状況を可視化するために使用しています。)
関数の読み込み
# 書類一覧の取得関数を作成
def get_submitted_summary(params):
    url = EDINET_API_URL + '/documents.json'    # https://disclosure.edinet-fsa.go.jp/api/v1/documents.json
    response = requests.get(url, params=params) # urlのパラメータを指定(?以降)、~documents.json?...
    assert response.status_code==200            # responseが200でなければエラーを出力
    return response.json()                      # jsonの形式で戻り値を返す
#-----------------------------------------------------------------------------------
# 提出された書類を取得する関数
def get_document(doc_id, params):
    url = EDINET_API_URL + '/documents/' + doc_id
    response = requests.get(url, params)
    return response
# 取得した書類をダウンロードする関数
def download_document(doc_id, save_path, date):
    params = {'type': number}
    doc = get_document(doc_id, params) # https://disclosure.edinet-fsa.go.jp/api/v1/documents/doc_id?type=number
    if number == 1: # XERLファイルを取得
        if doc.status_code == 200:
            # 保存用にzipファイル作成、'wb':バイナリファイルの書き込み
            with open(save_path + doc_id + '_' + date + '.zip', mode='wb') as f:
                # ファイルにWebからダウンロードしたファイルデータ書込
                for chunk in doc.iter_content(chunk_size=1024):
                    f.write(chunk)
    elif number == 2: #PDFを取得
        if doc.status_code == 200:
            with open(save_path + doc_id + '_' + date + '.pdf', mode='wb') as f:
                f.write(doc.content)
# zipファイルを解凍する関数
def open_zip_file(doc_id, save_path, date):
    if not os.path.exists(save_path):
        os.makedirs(save_path + doc_id + '_' + date)
    with zipfile.ZipFile(save_path + doc_id + '_' + date + '.zip') as zip_f: # zipファイルを読み込み
        zip_f.extractall(save_path + doc_id + '_' + date)                    # すべて解凍する
変数の定義・フォルダの作成
csv_path, zip_path, pdf_path = 'submitted_summary_csv', 'zip', 'pdf'
EDINET_API_URL = "https://disclosure.edinet-fsa.go.jp/api/v1"
docTypeCode = 120 # 欲しい書類に応じて数字を変更する

save_path = './rakus/'
if not os.path.exists(save_path):
    os.makedirs(save_path + csv_path)
    os.makedirs(save_path + zip_path)
    os.makedirs(save_path + pdf_path)
edinetCode = 31878
date = ['2018-06-25', '2019-06-24', '2020-06-29', '2021-06-28', '2022-06-27']

docTypeCodeは上記の仕様書に書類種別コードとして書いてあるのでそれを見れば書類の種類の変更が出来ます。
dateは企業の報告書提出日時をリストにしたものなので調べれば簡単に纏められるはず。

書類の取得・保存 ➀
# 書類一覧API(日付ごとに提出書類情報等を把握できる)
column1, column2 = 'results', 'docID'
index = 0
id = []
for d in tqdm(date):
    SUMMARY_TYPE = 2                                # 取得情報のタイプを指定(1:メタデータのみ、2:提出書類一覧及びメタデータ)
    params = {'date':d, 'type': SUMMARY_TYPE}
    doc_summary = get_submitted_summary(params)     # https://disclosure.edinet-fsa.go.jp/api/v1/documents.json?date=date&type=SUMMARY_TYPEにアクセス、jsonで取得
    results_df = pd.DataFrame(doc_summary[column1]) # jsonデータから'results'の箇所を取り出しデータフレームにする
    doc_id = results_df.query(f'edinetCode=="E{edinetCode}" and docTypeCode=="{docTypeCode}"')[column2].values[index]
    id.append(doc_id)
    results_df.to_csv(f'{save_path + csv_path}/{d}_summary.csv', index=False)

書類一覧APIから取得した一覧表のデータフレーム(results_dfの一部)

黄色のマーカーを引いた箇所が書類一覧APIから抽出したい情報。
過去5期分を纏めると下のようになる。
id = ['S100DA3F', 'S100G5M1', 'S100J399', 'S100LS9P', 'S100OHBV']

水色のマーカーを引いた箇所は変数で予め定義しており、事前に調べておく必要があります。

書類の取得・保存 ➁
# 書類取得API(EDINETに提出された書類を取得する)
# XBRLを取得・保存
number = 1
path = save_path + zip_path + '/'
for (id_, date_) in tqdm(zip(id, date)):
    download_document(doc_id=id_, save_path=path, date=date_)
    open_zip_file(doc_id=id_, save_path=path, date=date_)
# PDFを取得・保存
number = 2
path = save_path + pdf_path + '/'
for (id_, date_) in tqdm(zip(id, date)):
    download_document(doc_id=id_, save_path=path, date=date_)

以上のコードを実行した場合google drive上に次のような状態で書類が保存されるはず。

EDINET
 └─ rakus
     ├─ pdf
     │    └─ S100DA3F_2018-06-25.pdf ~ S100OHBV_2022-06-27.pdf
     ├─ submitted_summary_csv
     │    └─ 2022-06-27_summary.csv ~ 2022-06-27_summary.csv
     └─ zip
          ├─ S100DA3F_2018-06-25
	  .   └─ XBRL
	  .       ├─ AuditDoc
	  .       │   └── jpaud-aai-cc-001_E31878-000_2018-03-31_01_2018-06-25_ixbrl.htm
	          └─ PublicDoc
		      └── 0101010_honbun_jpcrp030000-asr-001_E31878-000_2018-03-31_01_2018-06-25_ixbrl.htm

これで、書類を取得できたので次回は実際に財務諸表の数値をデータフレームに纏める工程について記載しようと思います。

Discussion