【第1章】Python × EDINET API: 企業の財務情報を自動取得する方法

【第1章】PythonとEDINET APIを使って企業の財務情報を自動取得する方法のタイトル画像 投資

はじめに
EDINETは金融庁が運営する電子開示システムで、上場企業の財務情報を無料で閲覧できる便利なツールです。このガイドでは、Pythonプログラムを使ってEDINETから企業の決算情報を簡単に入手する方法を、初心者の方にも分かりやすく解説します。ここではJupyter Labを使ってPythonコードに実行結果を一つ一つ検証しながら企業の財務情報を取得するという目標に向けてプログラムを作りあげていきます。

EDINET APIキーを取得する

EDINET APIキーを取得するためには, 次のURLにアクセスしアカウントを作成してください。

Loading...

有価証券報告書を取得する


有価証券報告書は最も包括的な財務情報を含む書類で、以下の情報が含まれます:
・貸借対照表(BS)
・損益計算書(PL)
・キャッシュフロー計算書
・株主資本等変動計算書
・セグメント情報
・主要な経営指標等の推移
APIを使用してこれらの書類を取得する際は、書類一覧APIで対象の書類を特定し、その後書類取得APIを使用して実際の内容をダウンロードするという2段階のプロセスを踏むことになります

STEP1.書類一覧APIにリクエストを送信する

ここでは三菱商事の有価証券報告書をダウンロードしてローカルPCに保存します。

必要なライブラリをインポートします。

import os
from dotenv import load_dotenv
import requests
import pandas as pd
import openpyxl
import json

APIキーを記録した.envファイルを読み込みます。セキュリティの観点からコード内に直接APIキーを書かないように注意します。

load_dotenv()

True

api_key = os.getenv("API_KEY")
# APIのエンドポイント
url = "https://disclosure.edinet-fsa.go.jp/api/v2/documents.json"

# パラメータの設定(例: 2024年6月21日の書類を取得)
params = {
    'date': '2024-06-21',
    'type': 2,  # 2は提出書類一覧およびメタデータを取得
    'Subscription-Key': api_key
}

# APIリクエストを送信
response = requests.get(url, params=params)

if response.status_code == 200:
    # レスポンスのJSONデータを取得
    data = response.json()
else:
    print(f"Error: {response.status_code}")
    
#データフレームに変換
df = pd.DataFrame(data['results'])

print(df)

出力結果は以下のようになります。


seqNumber docID edinetCode secCode JCN /
0 1 S100TOVK E02931 26920 2120001077362
1 2 S100TEVV E12460 None 7010001054021
2 3 S100TLA0 E31678 None 9010601038669
3 4 S100TMO3 E12448 None 8010401040306
4 5 S100TMOC E12481 None 1010401025734
... ... ... ... ... ...
1105 1106 S100TPU0 E02505 80150 6180001031731
1106 1107 S100TPW9 E05466 37630 1010001073852
1107 1108 S100TQ16 E05466 37630 1010001073852
1108 1109 S100TQ1F E05466 37630 1010001073852
1109 1110 S100TQ15 E05694 38500 7010401040174

filerName fundCode ordinanceCode formCode docTypeCode /
0 伊藤忠食品株式会社 None 010 053000 180
1 野村アセットマネジメント株式会社 G08937 030 07A000 120
2 ちばぎんアセットマネジメント株式会社 G13221 030 07A000 120
3 明治安田アセットマネジメント株式会社 G13967 030 995000 180
4 フィデリティ投信株式会社 G11439 030 10A000 160
... ... ... ... ... ...
1105 豊田通商株式会社 None 010 113001 090
1106 株式会社プロシップ None 010 030000 120
1107 株式会社プロシップ None 015 010000 235
1108 株式会社プロシップ None 010 042000 135
1109 株式会社エヌ・ティ・ティ・データ・イントラマート None 010 053000 180

... opeDateTime withdrawalStatus docInfoEditStatus disclosureStatus \
0 ... None 0 0 0
1 ... None 0 0 0
2 ... None 0 0 0
3 ... None 0 0 0
4 ... None 0 0 0
... ... ... ... ... ...
1105 ... None 0 0 0
1106 ... None 0 0 0
1107 ... None 0 0 0
1108 ... None 0 0 0
1109 ... None 0 0 0

xbrlFlag pdfFlag attachDocFlag englishDocFlag csvFlag legalStatus
0 1 1 0 0 1 1
1 1 1 1 0 1 1
2 1 1 1 0 1 1
3 1 1 0 0 1 1
4 1 1 0 0 1 1
... ... ... ... ... ... ...
1105 0 1 0 0 0 1
1106 1 1 1 0 1 1
1107 1 1 0 0 1 1
1108 0 1 0 0 0 1
1109 1 1 0 0 1 1

[1110 rows x 29 columns]
#Excelファイルに保存
filename = f"edinet_data_{params['date']}.xlsx"
df.to_excel(filename, index=False)

print(f"Excelファイル'{filename}'にデータを保存しました。")

Excelファイル’edinet_data_2024-06-21.xlsx’にデータを保存しました。

次に、保存したEXCELファイルを読み込んで求める書類管理番号(docID)を特定する。
書類取得APIにリクエストを送信するためにはdocIDは不可欠なパラメータです。

# Excelファイルを読み込む
date = "2024-06-21"    #任意の書類提出日を変数に格納
filename = f"edinet_data_{date}.xlsx"
df = pd.read_excel(filename)
# 特定の企業のedinetCodeでフィルタリング
target_edinet_code = "E02529" #三菱商事のEDINETコードを変数に格納
filtered_data = df[df['edinetCode'] == target_edinet_code]
# 抽出したデータを表示
print(filtered_data)

出力結果は以下のようになります。


seqNumber docID edinetCode secCode JCN filerName fundCode /
747 748 S100TL6G E02529 80580 5.010001e+12 三菱商事株式会社 NaN
834 835 S100TKXD E02529 80580 5.010001e+12 三菱商事株式会社 NaN
979 980 S100TNM5 E02529 80580 5.010001e+12 三菱商事株式会社 NaN

ordinanceCode formCode docTypeCode ... opeDateTime withdrawalStatus /
747 10.0 030000 120.0 ... NaN 0
834 10.0 042000 135.0 ... NaN 0
979 15.0 010000 235.0 ... NaN 0

docInfoEditStatus disclosureStatus xbrlFlag pdfFlag attachDocFlag \
747 0 0 1 1 1
834 0 0 0 1 0
979 0 0 1 1 0

englishDocFlag csvFlag legalStatus
747 0 1 1
834 0 0 1
979 0 1 1

[3 rows x 29 columns]

docID(書類管理番号)とdocDescription(提出書類概要)を抽出します。

doc_ids = filtered_data['docID'].tolist()
document_names = filtered_data['docDescription'].tolist()
print(doc_ids, document_names)

出力結果は以下のようになります。

['S100TL6G', 'S100TKXD', 'S100TNM5'] ['有価証券報告書', '確認書', '内部統制報告書']
data = {"書類管理番号(docID)": doc_ids, "書類名": document_names}
df_output = pd.DataFrame(data)
print(df_output)

出力結果は以下のようになります。

  書類管理番号(docID)      書類名
0 S100TL6G 有価証券報告書
1 S100TKXD 確認書
2 S100TNM5 内部統制報告書

三菱商事の有価証券報告書のdocIDはS100TL6Gになります。

STEP2.特定したdocIDで書類取得APIにリクエストを送信する

新しいJupyter Labノートブックを開く。

import os
from dotenv import load_dotenv
import requests
import pandas as pd
load_dotenv()

True

# APIキーを環境変数から取得
api_key = os.getenv("API_KEY")
# ダウンロードしたファイルを保存するディレクトリ
SAVE_DIR = "edinet_data"
#変数doc_idsに書類管理番号(docID)を格納
doc_ids = "S100TL6G" #三菱商事の有価証券報告書のdocID

#書類取得APIのエンドポイント
url = f"https://api.edinet-fsa.go.jp/api/v2/documents/{doc_ids}"

# パラメータの設定
params = {
    'type': 1, # type1はzipファイル, type2はPDF, type5はCSVを取得
    'Subscription-Key': api_key
}
# APIリクエストを送信
response = requests.get(url, params=params)

print(response)
print(response.headers)

出力結果は以下のようになります。


<Response [200]>
{'Date': 'Wed, 11 Sep 2024 07:52:21 GMT', 'Content-Type': 'application/octet-stream', 'Content-Length': '2340866', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Expires': '-1', 'Access-Control-Expose-Headers': 'Request-Context', 'Request-Context': 'appId=cid-v1:a42a45a6-2a53-4bc2-a205-2030a56ff2d3', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Security-Policy': "img-src 'self' data:;object-src 'self' data: blob:;frame-src 'self' data: blob:;script-src 'self' 'unsafe-inline' 'unsafe-eval',style-src 'self' 'unsafe-inline',connect-src 'self',frame-ancestors 'self',font-src 'self',media-src 'self',manifest-src 'self',worker-src 'self',prefetch-src 'self',form-action 'self'", 'X-Content-Type-Options': 'nosniff', 'Content-Disposition': 'inline; filename="S100TL6G_1.zip"', 'x-azure-ref': '20240911T075216Z-r19b9f6fdbd5f7f8gfm5mg6f1s0000000vug00000000rzvs', 'X-Cache': 'CONFIG_NOCACHE', 'Accept-Ranges': 'bytes'}
#ZIPファイルを保存
filename = f"{doc_ids}.zip"
filepath = os.path.join(SAVE_DIR, filename)

with open(filepath, mode="wb") as file:
    file.write(response.content)

これで三菱商事の有価証券報告書のXBRLファイルをPCのディレクトリに保存することができました。
お疲れさまでした。

タイトルとURLをコピーしました