Supposons que vous souhaitiez télécharger un rapport sur les titres pour une société. Si vous connaissez le code EDINET du rapport titres remis par la société, vous pouvez obtenir le rapport titres rédigé au format XBRL à partir de l'API EDINET. Le rapport titres au format XBRL peut être consulté avec un navigateur. Une fois le fichier XBRL disponible, il est par exemple possible d'obtenir automatiquement les ratios de capital de centaines d'entreprises en utilisant la technologie du scraping. Cependant, comme les informations qui mappent le numéro de titres et EDINET ne sont pas publiées sur le net, j'ai créé un code pour les mapper.
En passant, ce qu'est XBRL est expliqué ici d'une manière facile à comprendre.
Flux de traitement </ b>
Ce site (Japan Exchange Group) fournit une liste des numéros de titres des sociétés cotées à la Bourse de Tokyo. Téléchargez au format de fichier csv. Faites ceci manuellement.
Le code EDINET est lié au rapport titres. En d'autres termes, différents codes EDINET sont attribués aux déclarations de titres de la même société mais à des années différentes. De plus, l ’ API EDINET est une spécification qui vous permet d’obtenir un rapport titres soumis un certain jour </ b>. Par conséquent, si vous pouvez obtenir le "CODE EDINET" et le "nom de la société" soumis tous les jours à partir d'aujourd'hui jusqu'à l'année écoulée, vous pouvez créer un tableau de correspondance du "CODE EDINET" et du "nom de la société" de toutes les sociétés cotées.
Tableau de mappage du "Numéro de valeur" et du "Nom de la société" </ b> et Tableau de correspondance de "EDINET" et "Nom de la société" </ b> En utilisant "Nom de la société" comme clé, les deux mappages ci-dessus Fusionner les tables pour générer une table de mappage pour «Numéro de valeur», «Nom de la société» et «CODE EDINET».
Vous trouverez ci-dessous le code python qui mappe le «numéro de titre», le «CODE EDINET» et le «nom de la société» expliqués ci-dessus.
Veuillez définir les conditions constantes suivantes avant d'exécuter le code </ b> ・ START_DATE Définissez la date et l'heure de début de la collecte des données de la société qui a soumis le rapport sur les titres. ・ END_DATE #Définissez la date et l'heure de fin de collecte des données de la société qui a soumis le rapport sur les titres -FPATH = 'Entrez ici le chemin du fichier csv de la table de mappage du "numéro de sécurité" et du "nom de la société". ' -SPATH = 'Entrez ici le chemin pour stocker le fichier csv de la table de mappage de "EDINET CODE" et "nom de la société". ' -OPATH = 'Livraison (Table de mappage du "Numéro de valeur", "Nom de la société" et "CODE EDINET") Entrez ici le chemin pour stocker le fichier csv. '
test.py
# -*- coding: utf-8 -*-
import requests
import datetime
import time
import pandas as pd
import os.path
import math
import numpy as np
#Définition de classe
class YUHO_GET():
#Constructeur ... Ici, la variable est lue.
def __init__(self,start_date, end_date,spath,fpath,sel):
self.start_date=start_date
self.end_date=end_date
self.spath=spath
self.fpath=fpath
self.sel=sel
#Obtenez le nom de la société, l'heure et le code EDIET du rapport de titres pour chaque date.
def mainproc(self):
day_list = self.make_day_list() #Une fonction qui génère une date entre le début et la fin d'une date
securities_report_doc_list = self.make_doc_id_list(day_list) #Obtenez le nom de la société, l'heure et le code EDIET du rapport de titres pour chaque date.
number_of_lists = len(securities_report_doc_list)
print("number_of_lists:", len(securities_report_doc_list))
print("get_list:", securities_report_doc_list)
#Une fonction qui génère une date entre le début et la fin d'une date
def make_day_list(self):
print("start_date:", self.start_date)
print("end_day:", self.end_date)
period = self.end_date - self.start_date
period = int(period.days)
day_list = []
for d in range(period):
day = self.start_date + datetime.timedelta(days=d)
day_list.append(day)
day_list.append(self.end_date)
return day_list
#Obtenez le nom de la société et le code EDIET du rapport de titres pour chaque date.
def make_doc_id_list(self,day_list):
securities_yuho_list = []
securities_4hanki_list = []
com_edi=[]
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"
}
#Vous avez accédé à l'API EDINET et obtenu le type de document soumis à la date indiquée.
res = requests.get(url, params=params, proxies=proxies)
json_data = res.json()
print(day)
for num in range(len(json_data["results"])):
#Obtenir des informations sur le type de document renvoyé par l'API EDINET.
ordinance_code = json_data["results"][num]["ordinanceCode"]
form_code = json_data["results"][num]["formCode"]
#S'il s'agit d'un rapport sur les valeurs mobilières, «ordonnance»_code == "010" and form_code == "030000""Fait référence au rapport sur les titres.
if ordinance_code == "010" and form_code == "030000":
print('★★★★★★★★★★★★ Rapport sur les valeurs mobilières ★★★★★★★★★★★★★★★')
#Stocker le nom de l'entreprise dans comname
comname=json_data["results"][num]["filerName"]
#de comname"Co., Ltd."Supprimer. Il correspond à la crosse avant et à la crosse arrière.
comname=comname.split('Co., Ltd.')[0] if comname.split('Co., Ltd.')[0] != '' else comname.split('Co., Ltd.')[-1]
#S'il y a un espace dans comname, supprimez-le
comname=comname.split(' ')[-1] if comname.split(' ')[0]=='' else comname
com_edi={ 'Nom de la compagnie':comname,
'saison':json_data["results"][num]["docDescription"],
'EDINET':json_data["results"][num]["docID"],
'Date de dépôt':day
}
securities_yuho_list.append(com_edi)
securities_report=securities_yuho_list if self.sel==0 else securities_4hanki_list
securities_report=pd.DataFrame(securities_report,columns=['Nom de la compagnie','saison','EDINET','Date de dépôt'])
securities_report.to_csv(self.spath)
return securities_report
#Fonction qui associe EDINET au numéro de valeur
def edinet_syoken_mapping(self):
df_all_syokennum = pd.read_csv(self.fpath) #Obtenez les numéros de titres de toutes les actions cotées sur le TSE.
df_all_editnum = pd.read_csv(self.spath) #Nom de la compagnie,Lire le code EDINET
df_edi_syo=df_all_editnum.loc[:,['Nom de la compagnie','EDINET']]
df_edi_syo=pd.DataFrame(df_edi_syo,columns=['Nom de la compagnie','EDINET','code'])
df_syoken=df_all_syokennum.loc[:,['code','Nom de la compagnie']]
for i in range(len(df_edi_syo)):
#(3)"Nom de la compagnie",「証券番号」表と"Nom de la compagnie"「EDINETコード」表から"Nom de la compagnie"「証券番号」「EDINETコード」のマッピング表を得る。
code=self.get_syouken_num(df_syoken,df_edi_syo.iloc[i]['Nom de la compagnie'])
df_edi_syo['code'][i]=code
#Vers le numéro de valeur".0"Est donnée".0"Supprimer.
df_edi_syo.set_index("code",inplace=True)
df_edi_syo.to_csv(OPATH)
df_edi_syo = pd.read_csv(OPATH, index_col=0)
df_edi_syo.reset_index("code",inplace=True)
df_edi_syo['code'] = df_edi_syo.apply(lambda x:self.bunri(x),axis=1)
df_edi_syo.set_index("code",inplace=True)
#df_edi_Écrivez syo dans un fichier csv.
#print(df_edi_syo)
df_edi_syo.to_csv(OPATH)
#Une fonction qui sépare la partie entière et la partie fractionnaire
def bunri(self,x):
return x.code.split(".")[0]
#(3)Obtenez le numéro de valeur du nom de la société.
def get_syouken_num(self,df,company_name):
flag=0
try:
df1=df[df.Nom de la compagnie==str(company_name)]
meigara_num=df1.iloc[0][0].astype(str)
return meigara_num
#Si le nom de la société et le numéro de titre ne peuvent pas être mappés, NONE est renvoyé.
except Exception as e:
flag='NONE'
return flag
################## MAIN ##################
START_DATE= datetime.date(2019,8,7) #Définissez la date et l'heure de début de la collecte des données de la société qui a soumis le rapport sur les titres.
END_DATE= datetime.date(2020,8,6) #Définissez la date et l'heure de fin de collecte des données de la société qui a soumis le rapport sur les titres.
SEL=0 # SEL=0:Acquérir un rapport sur les titres.
FPATH='Entrez ici le chemin du fichier csv de la table de mappage "Numéro de valeur" et "Nom de la société".'
SPATH='Entrez ici le chemin pour stocker le fichier csv de la table de mappage de "EDINET CODE" et "nom de l'entreprise".'
OPATH='Livrables(Tableau de correspondance «Numéro de valeur», «Raison sociale» et «CODE EDINET»)Saisissez ici le chemin pour stocker le fichier csv.'
def main():
yuho=YUHO_GET(START_DATE,END_DATE,SPATH,FPATH,SEL) #(1)Créez une instance. Réglez les paramètres.
yuho.mainproc() #(2)Extraire le nom de la société et EDINET ayant soumis le rapport titres
yuho.edinet_syoken_mapping() #(3)Mappez le numéro de titre et le numéro EDINET.
if __name__ == "__main__":
main()
Recommended Posts