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.)
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.
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.
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.
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
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"
Entscheiden Sie, wo die XBRL-Daten heruntergeladen werden sollen.
C://Users//xxx//Desktop//xbrlReport//SR//
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. Entpacken Sie die Zip-Datei und Sie sehen die bekannten Ordner AuditDoc und PublicDoc. Damit ist der Download der XBRL-Daten abgeschlossen.
# -*- 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()
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.
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