Dans le 4ème article du Calendrier de l'Avent, je collecterai par programme les données décrites dans XBRL divulguées dans EDINET.
(Le programme de cet article est fourni tel quel sans aucune garantie, et XBRL Japan assumera toute la responsabilité de tout inconvénient ou problème pouvant survenir à la suite de l'utilisation de ce programme, quelle qu'en soit la cause. Je ne le supporterai pas.)
L'API EDINET est une API qui vous permet de récupérer efficacement les données (XBRL) de la base de données EDINET via le programme `, et non depuis l'écran EDINET. L'API EDINET permet aux utilisateurs d'EDINET d'acquérir efficacement des informations de divulgation. Avant d'utiliser l'API, veuillez consulter les ** Conditions d'utilisation ** sur la page EDINET.
Ce programme est un programme en langage Python qui télécharge les données XBRL correspondant au rapport titres divulgué dans EDINET pendant cette période en spécifiant la période de collecte via l'API EDINET. (Tous les codes sont décrits dans "3. Code source") ** Spécifications détaillées de l'API EDINET **, veuillez vérifier sur le site EDINET. .. Les rapports trimestriels / semestriels et les rapports sur les titres corrigés ne sont pas pris en charge.
Veuillez prendre les mesures suivantes avant d'exécuter le programme. De plus, il est nécessaire d'installer au préalable d'autres bibliothèques (requêtes, datetime, etc.).
Les points de terminaison datent de décembre 2019. Veuillez vérifier à chaque fois la dernière version (ex. V1).
https://disclosure.edinet-fsa.go.jp/api/v1/documents.json
Définissez le proxy en fonction de l'environnement réseau. Si vous n'avez pas besoin de Proxy, supprimez proxies = proxies
.
"http_proxy" : "http://username:[email protected]:8080"
"https_proxy" : "https://username:[email protected]:8080"
Décidez où les données XBRL seront téléchargées.
C://Users//xxx//Desktop//xbrlReport//SR//
En définissant la date de début et la date de fin de la collecte, day_list
est créé.
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
Traitement en boucle en utilisant day_list
, définissez ʻurl (endpoint),
params(informations de date) et
proxies (informations de proxy) pour chaque date et
requêtes. Obtenez res
(objet de réponse) en exécutant get (url, params = params, proxies = proxies). ʻUrl
spécifie le point de terminaison correspondant à l'API de liste de documents. La raison pour laquelle la liste des documents à soumettre est obtenue en spécifiant «type»: 2 »dans« params »est d'identifier le rapport de titres dans le traitement ultérieur.
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)
La structure de res
est définie par l'API de liste de documents 2-1-2-1 (métadonnées) dans EDINET API Specification.pdf. Voici le contenu de "res" correspondant au "jour" de 2019.11.1.
Result2
2019-11-01
{
"metadata": {
"title": "API pour saisir les documents soumis",
"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": "Rapport sur les titres (titres des bénéficiaires de fiducies nationales de placement) - 17e terme(7 août 2018 - 6 août 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"
},
Puisque la liste des documents à soumettre est gérée par les «résultats» de res, le traitement en boucle est effectué à l'aide des «résultats». Après cela, obtenez le «Code d'ordonnance» (code d'ordonnance préfectorale) et «form_code» (code de formulaire) pour chaque document de résultats soumis. Depuis cette époque, nous ciblons les rapports sur les titres, nous avons décidé de ne traiter que les documents soumis avec un «code d'ordonnance» de 010 et «form_code» de 030000. Obtenez le «docID» (numéro de gestion des documents) des documents soumis pertinents et stockez-le dans la «liste des rapports sur les titres» (liste des rapports sur les titres).
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"])
Cela a créé une liste de «docID» correspondant au rapport sur les titres.
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']
Voici le code pour télécharger les données XBRL à l'aide de la liste. Utilisez securite_report_doc_list
pour boucler. ʻUrl` spécifie le point de terminaison qui correspond à l'API d'acquisition de documents (notez qu'il ne s'agit pas de l'API de liste de documents). En spécifiant «« type »: 1» dans «params», il est possible d'obtenir le document soumis et le rapport d'audit. Ce n'est que lorsque le "code d'état" de "res" est de 200 (lorsque la demande est réussie), les données XBRL sont téléchargées. Si vous spécifiez une date et une heure qui ne sont pas couvertes par EDINET, comme il y a 5 ans, le code d'état 404 (la ressource n'existe pas) peut être renvoyé.
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)
Après l'exécution, 77 fichiers zip ont été téléchargés dans le dossier spécifié. Décompressez le fichier zip et vous verrez les dossiers familiers AuditDoc et PublicDoc. Ceci termine le téléchargement des données XBRL.
# -*- 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()
Cette fois, nous avons ciblé les rapports sur les titres, mais en changeant ʻordinanceCode et
form_code, vous pouvez collecter automatiquement des données de rapport écrites dans d'autres XBRL. Par exemple, dans le cas d'un rapport trimestriel, vous pouvez modifier le mécanisme pour traiter uniquement les documents soumis avec ʻordinanceCode
de 010 et form_code
de 043000. Ce qui suit est un bref résumé comprenant des corrections.
〇 Rapport titres
if ordinanceCode == "010" and formCode =="030000" :
〇Rapport titres corrigés
if ordinanceCode == "010" and formCode =="030001" :
〇 Rapport trimestriel
if ordinanceCode == "010" and formCode =="043000" :
〇Rapport trimestriel corrigé
if ordinanceCode == "010" and formCode =="043001" :
Pour le code d'ordonnance préfectorale et le code de formulaire de tous les formulaires, voir Documents relatifs à l'API EDINET (publié le 17 mars 2019). Veuillez vous référer à ʻAttachment 1_Form Code List.xlsx` inclus dans le fichier zip téléchargé depuis [Spécifications API].
Pour toute demande concernant cet article, veuillez contacter l'adresse e-mail suivante. e-mail:[email protected] (Bien sûr, les commentaires sur qiita sont également les bienvenus)
Cette adresse e-mail sera le point de contact pour les demandes de renseignements concernant le Comité de développement de XBRL Japan, qui rédige l'article sur qiita. Je vais. Par conséquent, nous ne pouvons pas répondre aux demandes générales sur l'organisation en fonction du contenu, mais n'hésitez pas à nous contacter pour toutes questions techniques, opinions, demandes, conseils, etc. concernant XBRL. Veuillez noter que la réponse peut prendre un certain temps car les membres du comité sont des bénévoles.
Recommended Posts