🦁

EDINETからdocID(書類管理番号)を取得する(EDINET API version2対応)

2024/05/06に公開

EDINET(Electronic Disclosure for Investors' NETwork)は、金融庁が提供するオンラインシステムで、企業の有価証券報告書などを取得することが可能です。

EDINETは文書を一意のdocID(書類管理番号)で管理しています。
有価証券報告書を取得するためには、まず、このdocIDの取得が必要になってきます。

この記事では、EDINETのAPIを使用して、docIDを取得する方法を紹介します。
有価証券報告書を取得する方法は、別の記事でご紹介します。

なお、docIDを取得できると、有報のPDFファイルを閲覧できるURLも簡単に作成することができます。(さいごにご説明します)

事前準備

API_KEYの設定

GoogleコラボラトリーのシークレットにEDINETのAPI-KEYを保存しておきます。
具体的な保存の方法は以下を参照してください。
https://zenn.dev/robes/articles/04cc622f31c61b

# EDINETAPIのトークンを取得する
from google.colab import userdata

edinet_api_key = userdata.get('EDINET_API_KEY')

データ保存のためのBaseディレクトリを指定

base_dir = "/content/drive/MyDrive/directory/"

クラスの定義

GetDocidクラスを定義します

1 コンストラクタ・日付リストの作成

  • クラスの引数として、取得したい書類の提出日をスタート日とエンド日で指定します。

2 レポートリストの作成

  • 指定した期間中において提出された有価証券報告書の情報をリストで取得します。
  • formCode :030000が有価証券報告書を示します

3 データフレームの作成と保存

  • 提出者の業種情報を取得するため、EDINETから最新のEdinetCodelistをDLします。
  • 先ほどのレポートリストとmergeして、データフレーム化します。
import requests
import datetime
import pandas as pd
import time
import zipfile
import warnings
from tqdm.notebook import tqdm
import io

# 警告を特定のものに限定する
warnings.filterwarnings('ignore', category=DeprecationWarning)

class GetDocid:
    # 1 コンストラクタ・日付リストの作成
    def __init__(self, start_date, end_date):
        self.start_date = start_date
        self.end_date = end_date
        self.day_list = self.create_day_list()

    def create_day_list(self):
        day_list = []
        period = (self.end_date - self.start_date).days
        for d in range(period + 1):
            day = self.start_date + datetime.timedelta(days=d)
            day_list.append(day)
        return day_list

    # 2 レポートリストの作成
    def create_report_list(self):
        report_list = []
        for day in self.day_list:
            url = "https://api.edinet-fsa.go.jp/api/v2/documents.json"
            params = {"date": day, "type": 2, "Subscription-Key": edinet_api_key}
            try:
                res = requests.get(url, params=params)
                res.raise_for_status()
                json_data = res.json()
                time.sleep(3)  # APIのレート制限に従って調整
            except requests.RequestException as e:
                print(f"Request failed: {e}")
                continue

            for result in json_data.get("results", []):
                if result["ordinanceCode"] == "010" and result["formCode"] == "030000":
                    report_list.append({
                        '会社名': result["filerName"],
                        '書類名': result["docDescription"],
                        'docID': result["docID"],
                        '証券コード': result["secCode"],
                        'EDINETコード': result["edinetCode"],
                        '決算期': result["periodEnd"],
                        '提出日': day
                    })
        return report_list

    # 3 データフレームの作成と保存
    def create_docid_df(self, base_dir):
        # ファイルパスを動的に設定
        zip_path = "/content/Edinetcode.zip"
        extract_dir = "/content/Edinetcode"
        df_info_path = f"{extract_dir}/EdinetcodeDlInfo.csv"
        output_path = f"{base_dir}/csv/edinet_df.csv"

        #edinetcodelistを取得する
        !wget https://disclosure2dl.edinet-fsa.go.jp/searchdocument/codelist/Edinetcode.zip

        # zipファイルのダウンロードと展開
        try:
            with zipfile.ZipFile(zip_path) as zip_f:
                zip_f.extractall("Edinetcode")
        except zipfile.BadZipFile:
            print("Failed to unzip file")
            return None

        df_info = pd.read_csv(df_info_path, encoding="cp932", skiprows=[0])
        df_report = pd.DataFrame(self.create_report_list())
        df_info = df_info[["EDINETコード", "提出者業種"]]
        merged_df = pd.merge(df_report, df_info, how="inner", on="EDINETコード")
        merged_df.to_csv(output_path,index=False)

        return merged_df

docIDの取得

クラス変数を指定したうえで、クラスを実行していきます。

書類提出期間の指定

start_date = datetime.date(2024, 3,1)
end_date = datetime.date(2024,3,15)

クラスのインスタンス化

gd = GetDocid(start_date,end_date)

docIDのデータフレーム取得

%%time
edinet_df = gd.create_docid_df(base_dir)

取得したデータフレーム

以下のようなデータフレームが取得できれば成功です

docid_listの作成

有価証券報告書のXBRLファイル等の取得のためにdocid_listを作成しておきます

docid_list = edinet_df["docID"].tolist()

EDINETで有報PDFを閲覧できるURLの取得

  • EDINETで閲覧できる書類のURLには法則性があります。
  • 有価証券報告書に割り振られたdocIDを取得することで、URLのリンクを生成することができます。

Discussion