[PYTHON] Collectons automatiquement les informations de l'entreprise (données XBRL) à l'aide de l'API EDINET (4/10)

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.)

1. Qu'est-ce que l'API EDINET?

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.

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

2. Collectez des données XBRL avec l'API EDINET

2.1 Aperçu du programme

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.

2.2 Préparation préalable

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.).

2.2.1 Paramètres du point final

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

スクリーンショット 2019-12-01 18.01.14.png ### 2.2.2 Définition de la période de collecte XBRL Modifiez les dates de `start_date` (date de début de collecte) et de ʻend_date` (date de fin de collecte) en fonction de la période pour laquelle vous souhaitez collecter des données XBRL. Pour start_date, vous pouvez spécifier une date jusqu'à 5 ans avant la date d'exécution du programme. `start_date = datetime.date(2019, 11, 1)` `end_date = datetime.date(2019, 11,30)`

2.2.3 Paramètres proxy

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"

2.2.4 Détermination du dossier de sortie

Décidez où les données XBRL seront téléchargées. C://Users//xxx//Desktop//xbrlReport//SR//

2.3 Résultat de l'exécution

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) etproxies (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é. スクリーンショット 2019-12-01 17.52.36.png Décompressez le fichier zip et vous verrez les dossiers familiers AuditDoc et PublicDoc. Ceci termine le téléchargement des données XBRL. スクリーンショット 2019-12-01 18.09.54.png

3. Code source

# -*- 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. Comment collecter des rapports autres que les rapports sur les titres

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].

5. Contact

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

Collectons automatiquement les informations de l'entreprise (données XBRL) à l'aide de l'API EDINET (4/10)
Extrayons automatiquement les informations des employés telles que le salaire moyen des données XBRL divulguées par EDINET (5/10)
Collectez des informations sur les produits et traitez les données à l'aide de l'API de recherche de produits Rakuten [Python]
J'ai essayé d'utiliser l'API de Sakenowa Data Project
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Publions l'API de super résolution à l'aide de Google Cloud Platform
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API PeeringDB 2.0
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
Obtenir des données Salesforce à l'aide de l'API REST
Extraction d'informations à partir du fichier EDINET XBRL
Obtenez des données Amazon à l'aide de Keep API # 1 Obtenez des données
Mémo d'acquisition de données à l'aide de l'API Backlog
Affichons la carte en utilisant Basemap
J'ai essayé d'utiliser l'API checkio
Collectez des informations vidéo sur "Chanter avec XX personnes" [Python] [API de données Youtube]