このブログ記事では、Pythonを使ってEDINET APIから過去5年間の有価証券報告書を自動で取得する方法を紹介します。この記事では、日付のループ処理と報告書のフィルタリング方法に焦点を当てて、初心者でも理解できるように丁寧に解説していきます。
必要なライブラリ
今回のコードでは、以下のPythonライブラリを使用します。コードを実行する前にインストールしておいてください。
pip install requests python-dotenv
- requests: APIリクエストを送信し、EDINETからデータを取得します。
- python-dotenv: 環境変数(APIキーなど)を
.env
ファイルから読み込むために使用します。
コードの全体像
import requests
import zipfile
import io
import os
from dotenv import load_dotenv
from datetime import datetime, timedelta
load_dotenv()
# APIキーを環境変数から取得
api_key = os.getenv("API_KEY")
def download_xbrl_file(doc_id):
download_url = f"https://api.edinet-fsa.go.jp/api/v2/documents/{doc_id}"
params = {"type": 1, "Subscription-Key": api_key}
download_response = requests.get(download_url, params=params)
if download_response.status_code == 200:
with open(f"./xbrl_files/{doc_id}.zip", "wb") as f:
f.write(download_response.content)
print(f"XBRLファイルを保存しました: ./xbrl_files/{doc_id}.zip")
else:
print(f"XBRLファイルのダウンロードに失敗しました: {doc_id}")
def get_reports_for_past_5_years(edinet_code):
current_year = datetime.now().year
for year in range(current_year - 5, current_year + 1):
print(f"年: {year} のデータを取得しています。")
period_start = datetime(year, 1, 1)
period_end = datetime(year, 12, 31)
current_date = period_start
while current_date <= period_end:
url = "https://disclosure.edinet-fsa.go.jp/api/v2/documents.json"
params = {'date': current_date.strftime('%Y-%m-%d'), 'type': 2, "Subscription-Key": api_key}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
for doc in data.get('results', []):
if doc['edinetCode'] == edinet_code and doc['docTypeCode'] == '120':
doc_id = doc['docID']
print(f"ドキュメントID: {doc_id}, 提出日: {doc['submitDateTime']}")
download_xbrl_file(doc_id)
else:
print(f"{current_date.strftime('%Y-%m-%d')} のデータ取得に失敗しました。")
current_date += timedelta(days=1)
edinet_code = "E02529"
get_reports_for_past_5_years(edinet_code)
コードの解説
- APIキーの設定
load_dotenv()
api_key = os.getenv("API_KEY")
まず、APIキーを安全に管理するために、.env
ファイルを使用して環境変数からAPIキーを取得しています。.env
ファイルには、次のようにAPIキーを記載しておきます。
API_KEY=your_edinet_api_key_here
2. 過去5年間の有価証券報告書を取得
def get_reports_for_past_5_years(edinet_code):
この関数は、指定された企業(この場合はEDINETコード “E02529″)の過去5年間の有価証券報告書を取得します。
current_year = datetime.now().year
で現在の年を取得し、過去5年間のデータを取得します。
3. 日付ごとのループ処理
current_date = period_start
while current_date <= period_end:
params = {'date': current_date.strftime('%Y-%m-%d'), 'type': 2, "Subscription-Key": api_key}
この部分が重要なポイントです。current_date.strftime('%Y-%m-%d')
を使って、日付をAPIが受け取れる「YYYY-MM-DD」の形式に変換しています。
このコードの仕組みは、指定した範囲の期間を1日ずつループし、その日に提出された有価証券報告書をチェックします。
4. 有価証券報告書のフィルタリング
if doc['edinetCode'] == edinet_code and doc['docTypeCode'] == '120':
APIから取得した結果をフィルタリングして、指定されたEDINETコード(この例では三菱商事 “E02529″)かつdocTypeCode
が120(有価証券報告書)であるドキュメントのみを対象にします。
5. XBRLファイルのダウンロード
download_xbrl_file(doc_id)
有価証券報告書が見つかると、そのドキュメントIDを使ってdownload_xbrl_file
関数でXBRLファイルをダウンロードします。
まとめ
この記事では、Pythonを使ってEDINET APIから過去5年間の有価証券報告書を自動的に取得する方法を紹介しました。日付ごとのループ処理とフィルタリングの仕組みを理解すれば、特定の企業の有価証券報告書を効率的に集めることができます。