【第3章】EDINET APIを活用したPythonプログラムで過去5年分の有価証券報告書を自動取得しよう

EDINET APIを使用してPythonプログラムで過去5年分の有価証券報告書を自動取得する手順を示す画像 投資

このブログ記事では、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)

コードの解説

  1. 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年間の有価証券報告書を自動的に取得する方法を紹介しました。日付ごとのループ処理とフィルタリングの仕組みを理解すれば、特定の企業の有価証券報告書を効率的に集めることができます。

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