K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

EDINET

05.4.2

EDINET

最終更新 2024-06-27 読了時間 4 分
まとめ
EDINET は金融庁が運営する開示書類の電子システムで、有価証券報告書や四半期報告書を API 経由で取得できます。このページでは API v2 の書類一覧エンドポイント documents.json に日付 2024-02-09 と type=2 を渡して、その日に提出された全書類のメタデータを requests で受け取り、pd.DataFrame にして docDescription に「四半期報告書」を含む行、さらに filerName に「商船三井」を含む行へと絞り込みます。見つかった docID(S100STH6)を documents/{docID} に type=2 で渡すと PDF のバイナリが返るので、open(..., "wb") で保存して表示します。読み終えると、「日付で一覧 → 条件で絞る → docID で本体を取る」という EDINET API の 3 段階の使い方が分かり、CSV や XBRL を取る次のページにそのまま進めます。

直感 #

EDINET の書類は 1 件ごとに S100STH6 のような docID で管理されていて、本体(PDF・XBRL・CSV)は docID が分からないと取れません。docID を知る唯一の入口が「ある日に提出された書類の一覧」を返す documents.json で、2024 年 2 月 9 日のように日付を指定すると、その日の提出分が数百件まとめて返ります。その中から書類の種類(docDescription)と提出者名(filerName)で目的の 1 件を見つけ、docID で本体を取りに行く、という 3 段階が EDINET API の基本の流れです。

EDINET の API を使用してみる #

Python で四半期報告書の PDF を取得するために EDINET を使います。以下のコンテンツでは EDINET閲覧サイト から取得できる情報をもとにデータを加工して作成しています。コードの実行や取得したデータの利用については EDINET の利用規約を確認し理解した上で行ってください。Version 2 の API を使う際はログイン認証と API キーの発行が必要で、発行したキーは環境変数 EDINET_API_KEY に入れておきます。

使用時には必ず利用規約(PDF・web)を確認した上で常識の範囲内での使用にとどめてください。

1
2
3
4
5
import os
import requests
import pandas as pd

API_ENDPOINT = "https://disclosure.edinet-fsa.go.jp/api/v2"  # v2を使用する

書類一覧 API のリクエスト URL #

「11_EDINET_API仕様書」に従い、2024 年 2 月 9 日に提出された書類の一覧を取得します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
request_params = {
    "date": "2024-02-09",
    "type": 2,  # 1=メタデータのみ、2=提出書類一覧及びメタデータ
    "Subscription-Key": os.environ.get(
        "EDINET_API_KEY"
    ),  # v1を使用する場合は不要, 2024年3月29日(金)まで利用可能
}

docs_submitted_json = requests.get(
    f"{API_ENDPOINT}/documents.json", request_params
).json()

取得データの確認 #

返ってきた JSON の results には、その日の全書類が 1 件 1 行で入っています。四半期報告書だけが欲しいので、文書の説明(docDescription)に「四半期報告書」を含む行だけを抽出します。

1
2
3
sd_df = pd.DataFrame(docs_submitted_json["results"])
sd_df = sd_df[sd_df["docDescription"].str.contains("四半期報告書", na=False)]
sd_df.head()

seqNumberdocIDedinetCodesecCodeJCNfilerNamefundCodeordinanceCodeformCodedocTypeCode
12S100SSMQE04505950709470001001933四国電力株式会社None010043000140
23S100SSHRE01441597305122001016280株式会社トーアミNone010043000140
56S100SQAHE30982717509220001001223今村証券株式会社None010043000140
67S100SPH6E03562836003090001002315株式会社 山梨中央銀行None010043000140
1011S100SRF2E00783409107010701015826日本酸素ホールディングス株式会社None010043000140

5 rows × 29 columns

DocID の確認 #

提出者名(filerName)に「商船三井」を含む行に絞ると 1 行だけ残り、その docID 列が次の取得に使う ID です。

1
sd_df[sd_df.filerName.str.contains("商船三井")]

seqNumberdocIDedinetCodesecCodeJCNfilerNamefundCodeordinanceCodeformCodedocTypeCode
13071308S100STH6E04236910404010401082896株式会社商船三井None010043000140

1 rows × 29 columns

四半期報告書の取得 #

見つけた docID(S100STH6)を書類取得 API に渡します。type で取得する形式を選び、PDF なら仕様書どおり type=2 です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
docID = "S100STH6"
pdf_response = requests.get(
    f"{API_ENDPOINT}/documents/{docID}",
    {
        "type": 2,
        "Subscription-Key": os.environ.get("EDINET_API_KEY"),
    },
)

with open("sample.pdf", "wb") as f:
    f.write(pdf_response.content)

ダウンロードした PDF を表示する #

保存した sample.pdf をノートブックの中に埋め込んで表示します。

1
2
3
4
from IPython.display import display_pdf

with open("sample.pdf", "rb") as f:
    display_pdf(f.read(), raw=True)

(PDF の表示は省略します)

使いどころと落とし穴 #

documents.json は 1 回の呼び出しで 1 日分しか返さないので、過去 1 年分の四半期報告書を集めたいときは日付を 1 日ずつ回して呼ぶ必要があり、1 リクエストごとに数秒待つのが礼儀です。type=2 の PDF は人が読むための形式で、売上高や配当の数値を機械的に取り出すには向きません。数値が欲しい場合は同じ documents/{docID} に type=5(CSV)や type=1(XBRL)を指定します(EDINET② で扱います)。Subscription-Key をコードに直書きして公開リポジトリに上げると第三者に使われるので、必ず環境変数から読みます。

まとめ #

EDINET API v2 の使い方は、documents.json に日付と type=2 を渡して一覧を取り、pd.DataFrame にして docDescription と filerName で 1 件に絞り、その docID を documents/{docID} に渡して本体を取る、という 3 段階です。PDF は type=2 でバイナリとして返るので open("sample.pdf", "wb") に書き出すだけで保存できます。API キーは環境変数 EDINET_API_KEY に置き、利用規約の範囲で呼び出し回数を抑えて使ってください。