[PYTHON] Sammeln wir automatisch Unternehmensinformationen (XBRL-Daten) mithilfe der EDINET-API (4/10).

Im 4. Beitrag des Adventskalenders werde ich programmgesteuert die in XBRL beschriebenen Daten sammeln, die in EDINET veröffentlicht sind.

(Das Programm in diesem Artikel wird ohne Gewähr bereitgestellt. XBRL Japan übernimmt unabhängig von der Ursache die Verantwortung für alle Nachteile oder Probleme, die durch die Verwendung dieses Programms entstehen können. Ich werde es nicht ertragen.)

1. Was ist die EDINET API?

Die EDINET-API ist eine API, mit der Sie Daten (XBRL) effizient über das Programm `aus der EDINET-Datenbank abrufen können, nicht über den Bildschirm EDINET. Mit der EDINET-API können EDINET-Benutzer Offenlegungsinformationen effizient abrufen. Bevor Sie die API verwenden, überprüfen Sie bitte die ** Nutzungsbedingungen ** auf der EDINET-Seite.

スクリーンショット 2019-12-01 16.47.38.png

2. Sammeln Sie XBRL-Daten mit der EDINET-API

2.1 Programmübersicht

Dieses Programm ist ein Python-Sprachprogramm, das die XBRL-Daten herunterlädt, die dem in EDINET während dieses Zeitraums veröffentlichten Wertpapierbericht entsprechen, indem der Erfassungszeitraum über die EDINET-API angegeben wird. (Alle Codes sind in "3. Quellcode" beschrieben.) ** Detaillierte Spezifikationen der EDINET-API ** finden Sie auf der EDINET-Website. .. Quartals- / Halbjahresberichte und korrigierte Wertpapierberichte werden nicht unterstützt.

2.2 Vorbereitung

Bitte führen Sie die folgenden Aktionen aus, bevor Sie das Programm ausführen. Darüber hinaus müssen andere Bibliotheken (Anforderungen, Datum / Uhrzeit usw.) im Voraus installiert werden.

2.2.1 Endpunkteinstellungen

Endpunkte sind ab Dezember 2019. Bitte überprüfen Sie jedes Mal die neueste Version (z. B. V1). https://disclosure.edinet-fsa.go.jp/api/v1/documents.json

スクリーンショット 2019-12-01 18.01.14.png ### 2.2.2 Einstellen des XBRL-Erfassungszeitraums Ändern Sie die Daten von "start_date" (Startdatum der Sammlung) und "end_date" (Enddatum der Sammlung) entsprechend dem Zeitraum, für den Sie XBRL-Daten erfassen möchten. Für start_date können Sie ein Datum bis zu 5 Jahre vor dem Programmausführungsdatum angeben. `start_date = datetime.date(2019, 11, 1)` `end_date = datetime.date(2019, 11,30)`

2.2.3 Proxy-Einstellungen

Stellen Sie den Proxy basierend auf der Netzwerkumgebung ein. Wenn Sie keinen Proxy benötigen, entfernen Sie proxies = proxies. "http_proxy" : "http://username:[email protected]:8080" "https_proxy" : "https://username:[email protected]:8080"

2.2.4 Ermitteln des Ausgabeordners

Entscheiden Sie, wo die XBRL-Daten heruntergeladen werden sollen. C://Users//xxx//Desktop//xbrlReport//SR//

2.3 Ausführungsergebnis

Durch Festlegen des Startdatums und des Enddatums der Sammlung wird "day_list" erstellt.

Code1


start_date = datetime.date(2019, 11, 1)
end_date = datetime.date(2019, 11,30)

Result1


day_list [datetime.date(2019, 11, 1), datetime.date(2019, 11, 2), datetime.date(2019, 11, 3), datetime.date(2019, 11, 4), datetime.date(2019, 11, 5), datetime.date(2019, 11, 6), datetime.date(2019, 11, 7), datetime.date(2019, 11, 8), datetime.date(2019, 11, 9), datetime.date(2019, 11, 10), datetime.date(2019, 11, 11), datetime.date(2019, 11, 12), datetime.date(2019, 11, 13), datetime.date(2019, 11, 14), datetime.date(2019, 11, 15), datetime.date(2019, 11, 16), datetime.date(2019, 11, 17), datetime.date(2019, 11, 18), datetime.date(2019, 11, 19), datetime.date(2019, 11, 20), datetime.date(2019, 11, 21), datetime.date(2019, 11, 22), datetime.date(2019, 11, 23), datetime.date(2019, 11, 24), datetime.date(2019, 11, 25), datetime.date(2019, 11, 26), datetime.date(2019, 11, 27), datetime.date(2019, 11, 28), datetime.date(2019, 11, 29), datetime.date(2019, 11, 30)]
2

Durchlaufen Sie day_list, setzen Sie url (Endpunkt), params (Datumsinformationen) und optional Proxys (Proxy-Informationen) für jedes Datum, Anfragen. Holen Sie sich res (Antwortobjekt), indem Sie get (url, params = params, proxies = proxies) ausführen. url gibt den Endpunkt an, der der Dokumentlisten-API entspricht. Der Grund, warum die Liste der einzureichenden Dokumente durch Angabe von "Typ": 2 "in" Parametern "erhalten wird, besteht darin, den Wertpapierbericht in der nachfolgenden Verarbeitung zu identifizieren.

Code2



for index,day in enumerate(day_list):
    url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json"
    params = {"date": day, "type": 2}

    proxies = {
        "http_proxy" : "http://username:[email protected]:8080/",
        "https_proxy" : "https://username:[email protected]:8080/"
    }

  res = requests.get(url, params=params ,proxies=proxies)

Die Struktur von res wird durch die 2-1-2-1 Document List API (Metadata) in der EDINET API Specification.pdf definiert. Das Folgende ist der Inhalt von "res", der dem "Tag" von 2019.11.1 entspricht.

Result2




2019-11-01
{
    "metadata": {
        "title": "API zum Erfassen der eingereichten Dokumente",
        "parameter": {
            "date": "2019-11-01",
            "type": "2"
        },
        "resultset": {
            "count": 315
        },
        "processDateTime": "2019-12-05 00:00",
        "status": "200",
        "message": "OK"
    },
    "results": [
        {
            "seqNumber": 1,
            "docID": "S100H5LU",
            "edinetCode": "E12422",
            "secCode": null,
            "JCN": "4010001046310",
            "filerName": "Shinkin Asset Management Investment Trust Co., Ltd.",
            "fundCode": "G03385",
            "ordinanceCode": "030",
            "formCode": "07A000",
            "docTypeCode": "120",
            "periodStart": "2018-08-07",
            "periodEnd": "2019-08-06",
            "submitDateTime": "2019-11-01 09:00",
            "docDescription": "Wertpapierbericht (Domestic Investment Trust Beneficiary Securities) - 17. Laufzeit(7. August 2018 - 6. August 2018)",
            "issuerEdinetCode": null,
            "subjectEdinetCode": null,
            "subsidiaryEdinetCode": null,
            "currentReportReason": null,
            "parentDocID": null,
            "opeDateTime": null,
            "withdrawalStatus": "0",
            "docInfoEditStatus": "0",
            "disclosureStatus": "0",
            "xbrlFlag": "1",
            "pdfFlag": "1",
            "attachDocFlag": "1",
            "englishDocFlag": "0"
        },
        

Da die Liste der einzureichenden Dokumente durch "Ergebnisse" von res verwaltet wird, wird die Schleifenverarbeitung unter Verwendung von "Ergebnissen" durchgeführt. Danach erhalten Sie für jedes eingereichte Ergebnisdokument "ordinanceCode" (Präfektur-Verordnungscode) und "form_code" (Formularcode). Da wir dieses Mal auf Wertpapierberichte abzielen, werden nur die eingereichten Dokumente mit dem Verordnungscode 010 und dem Formcode 030000 verarbeitet. Erhalten Sie die "docID" (Dokumentenverwaltungsnummer) der relevanten eingereichten Dokumente und speichern Sie sie in der "Securities_report_doc_list" (Liste der Wertpapierberichte).

Code3



for num in range(len(json_data["results"])):
        ordinance_code= json_data["results"][num]["ordinanceCode"]
        form_code= json_data["results"][num]["formCode"]

        if ordinance_code == "010" and  form_code =="030000" :
            securities_report_doc_list.append(json_data["results"][num]["docID"])

Dadurch wurde eine Liste von "docIDs" erstellt, die dem Wertpapierbericht entsprechen.

Result3


number_of_lists: 77
get_list: ['S100H8TT', 'S100HE9U', 'S100HC6W', 'S100HFA0', 'S100HFBC', 'S100HFB3', 'S100HG9S', 'S100HG62', 'S100HGJL', 'S100HFMG', 'S100HGM1', 'S100HGMZ', 'S100HGFM', 'S100HFC2', 'S100HGNQ', 'S100HGS3', 'S100HGYR', 'S100HGMB', 'S100HGKE', 'S100HFJG', 'S100HGTC', 'S100HH1G', 'S100HH9I', 'S100HGTF', 'S100HHAL', 'S100HHC0', 'S100HFIB', 'S100HH1I', 'S100HH36', 'S100HHDF', 'S100HH9L', 'S100HHGB', 'S100HHGJ', 'S100HHCR', 'S100HHJJ', 'S100HHH0', 'S100HHLH', 'S100HHL6', 'S100HHD4', 'S100HHM7', 'S100HHL9', 'S100HHN6', 'S100HHO8', 'S100HHHV', 'S100HHE3', 'S100HGB5', 'S100HHQ0', 'S100HHP5', 'S100HHMK', 'S100HHE6', 'S100HHPR', 'S100HHDA', 'S100HHR7', 'S100HHSB', 'S100HHML', 'S100HH9H', 'S100HH2F', 'S100H8W1', 'S100HHRP', 'S100HHTM', 'S100HHAF', 'S100HHUD', 'S100HHK9', 'S100HHT4', 'S100HHCI', 'S100HHXQ', 'S100HHO8', 'S100HHSS', 'S100HHRL', 'S100HI19', 'S100HHXS', 'S100HI1W', 'S100HHSP', 'S100HHN4', 'S100HI3J', 'S100HI3K', 'S100HI4G']

Das Folgende ist der Code zum Herunterladen der XBRL-Daten mithilfe der Liste. Verwenden Sie "Securities_report_doc_list", um eine Schleife zu erstellen. url gibt den Endpunkt an, der der Dokumenterfassungs-API entspricht (beachten Sie, dass es sich nicht um die Dokumentlisten-API handelt). Durch Angabe von "Typ": 1 "in" Parametern "ist es möglich, das eingereichte Dokument und den Prüfbericht zu erhalten. Nur wenn der "Statuscode" von "res" 200 ist (wenn die Anforderung erfolgreich ist), werden XBRL-Daten heruntergeladen. Wenn Sie ein Datum und eine Uhrzeit angeben, die nicht von EDINET abgedeckt werden, z. B. vor 5 Jahren, wird möglicherweise der Statuscode 404 (Ressource existiert nicht) zurückgegeben.

Code4


for index,doc_id in enumerate(securities_report_doc_list):
    url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/" + doc_id
    params = {"type": 1}
    filename = "C:\\Users\\XXX\\Desktop\\xbrlReport\\SR\\" + doc_id + ".zip"
    res = requests.get(url, params=params ,stream=True)

    if res.status_code == 200:
        with open(filename, 'wb') as file:
            for chunk in res.iter_content(chunk_size=1024):
                file.write(chunk)

Nach der Ausführung wurden 77 Zip-Dateien in den angegebenen Ordner heruntergeladen. スクリーンショット 2019-12-01 17.52.36.png Entpacken Sie die Zip-Datei und Sie sehen die bekannten Ordner AuditDoc und PublicDoc. Damit ist der Download der XBRL-Daten abgeschlossen. スクリーンショット 2019-12-01 18.09.54.png

3. Quellcode

# -*- coding: utf-8 -*-
import requests
import datetime


def make_day_list(start_date, end_date):
    print("start_date:", start_date)
    print("end_day:", end_date)

    period = end_date - start_date
    period = int(period.days)
    day_list = []
    for d in range(period):
        day = start_date + datetime.timedelta(days=d)
        day_list.append(day)

    day_list.append(end_date)

    return day_list


def make_doc_id_list(day_list):
    securities_report_doc_list = []
    for index, day in enumerate(day_list):
        url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json"
        params = {"date": day, "type": 2}

        proxies = {
            "http_proxy": "http://username:[email protected]:8080",
            "https_proxy": "https://username:[email protected]:8080"
        }

        res = requests.get(url, params=params, proxies=proxies)
        json_data = res.json()
        print(day)

        for num in range(len(json_data["results"])):

            ordinance_code = json_data["results"][num]["ordinanceCode"]
            form_code = json_data["results"][num]["formCode"]

            if ordinance_code == "010" and form_code == "030000":
                print(json_data["results"][num]["filerName"], json_data["results"][num]["docDescription"],
                      json_data["results"][num]["docID"])
                securities_report_doc_list.append(json_data["results"][num]["docID"])

    return securities_report_doc_list


def download_xbrl_in_zip(securities_report_doc_list, number_of_lists):
    for index, doc_id in enumerate(securities_report_doc_list):
        print(doc_id, ":", index + 1, "/", number_of_lists)
        url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/" + doc_id
        params = {"type": 1}
        filename = "C://Users//xxx//Desktop//xbrlReport//SR//" + doc_id + ".zip"
        res = requests.get(url, params=params, stream=True)

        if res.status_code == 200:
            with open(filename, 'wb') as file:
                for chunk in res.iter_content(chunk_size=1024):
                    file.write(chunk)

def main():
    start_date = datetime.date(2019, 11, 1)
    end_date = datetime.date(2019, 11, 30)
    day_list = make_day_list(start_date, end_date)

    securities_report_doc_list = make_doc_id_list(day_list)
    number_of_lists = len(securities_report_doc_list)
    print("number_of_lists:", len(securities_report_doc_list))
    print("get_list:", securities_report_doc_list)

    download_xbrl_in_zip(securities_report_doc_list, number_of_lists)
    print("download finish")


if __name__ == "__main__":
    main()

4. Sammeln von anderen Berichten als Wertpapierberichten

Dieses Mal haben wir Wertpapierberichte als Ziel ausgewählt. Durch Ändern von "ordinanceCode" und "form_code" können Sie jedoch automatisch Berichtsdaten erfassen, die in anderen XBRLs geschrieben wurden. Im Fall eines vierteljährlichen Berichts können Sie beispielsweise den Mechanismus so ändern, dass nur die übermittelten Dokumente mit dem Verordnungscode 010 und dem Formularcode 043000 verarbeitet werden. Das Folgende ist eine kurze Zusammenfassung mit Korrekturen.

〇 Wertpapierbericht if ordinanceCode == "010" and formCode =="030000" :

〇Korrigierter Wertpapierbericht if ordinanceCode == "010" and formCode =="030001" :

〇 Quartalsbericht if ordinanceCode == "010" and formCode =="043000" :

〇Korrigierter Quartalsbericht if ordinanceCode == "010" and formCode =="043001" :

Den Präfekturverordnungscode und den Formularcode aller Formulare finden Sie unter EDINET API-bezogene Materialien (veröffentlicht am 17. März 2019). Weitere Informationen finden Sie in Anhang 1_Form Code List.xlsx, der in der von [API-Spezifikationen] heruntergeladenen Zip-Datei enthalten ist.

5. Kontakt

Bei Fragen zu diesem Artikel wenden Sie sich bitte an die folgende E-Mail-Adresse. e-mail:[email protected] (Natürlich sind auch Kommentare zu Qiita willkommen)

Diese E-Mail-Adresse ist die Kontaktstelle für Anfragen zum Entwicklungsausschuss von XBRL Japan, der den Artikel über Qiita schreibt. Ich werde. Aus diesem Grund können wir je nach Inhalt keine allgemeinen Anfragen zur Organisation beantworten. Bei technischen Fragen, Meinungen, Anfragen, Ratschlägen usw. zu XBRL können Sie sich jedoch gerne an uns wenden. Bitte beachten Sie, dass die Beantwortung einige Zeit dauern kann, da die Ausschussmitglieder Freiwillige sind.

Recommended Posts

Sammeln wir automatisch Unternehmensinformationen (XBRL-Daten) mithilfe der EDINET-API (4/10).
Lassen Sie uns automatisch Mitarbeiterinformationen wie das Durchschnittsgehalt aus den von EDINET (5/10) veröffentlichten XBRL-Daten extrahieren.
Sammeln Sie Produktinformationen und Prozessdaten mit der Rakuten-Produktsuch-API [Python].
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Lassen Sie uns die Super Resolution API mithilfe der Google Cloud Platform veröffentlichen
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Abrufen von Salesforce-Daten mithilfe der REST-API
Informationsextraktion aus der EDINET XBRL-Datei
Abrufen von Amazon-Daten mit Keep API # 1 Abrufen von Daten
Datenerfassungsnotiz mit der Backlog-API
Lassen Sie uns die Karte mit der Grundkarte anzeigen
Ich habe versucht, die checkio-API zu verwenden
Sammle Videoinformationen zu "Singen mit XX Personen" [Python] [Youtube Data API]