Python
xbrl

EDINETからXBRLファイルをダウンロード(個人的メモ)

More than 1 year has passed since last update.

参考資料に記載した書籍を読んでPythonで作ってみました。

当初はXBRLファイルから有価証券報告書の項目と数値を取得するところまで書くつもりでしたが、提出者別タクソノミ作成ガイドラインなどを読んで理解しないと難しそうでしたので一旦断念しました。他の優先事項が片付き次第続きを進めたいと思います。


参考資料

XBRLについて上の書籍に詳細な記述がありますので、書籍をご覧頂きたく。

当該書籍にはXBRLについてだけでなく、R言語を使って効果的にデータ分析を行うためのノウハウや時系列分析についても記述があり、非常に良い書籍だと思います。

なお、XBRLファイルの取得について書籍ではAPIのURLが

"http://resource.ufocatcher.com/atom/edinetx/query/"

となっていますが、

"http://resource.ufocatch.com/atom/edinetx/query/"

が現在のAPIのURLになっています。

サービスの名前が『有報キャッチャー』のようですので、以前はufocatcherだったのかもしれません。


参考コード

ただファイルをダウンロードするだけなので特に面白みはありませんが、一応メモしておきます。

# coding: utf-8

import requests
import xml.etree.ElementTree as ET
from collections import defaultdict
import json
import os
from zipfile import ZipFile
from StringIO import StringIO

def get_link_info_str(ticker_symbol, base_url):
url = base_url+ticker_symbol
response = requests.get(url)
return response.text

def get_link(tree, namespace):
#print ET.tostring(tree)
yuho_dict = defaultdict(dict)
for el in tree.findall('.//'+namespace+'entry'):
title = el.find(namespace+'title').text
if not is_yuho(title): continue
print 'writing:',title[:30],'...'
_id = el.find(namespace+'id').text
link = el.find('./'+namespace+'link[@type="application/zip"]')
url = link.attrib['href']
yuho_dict[_id] = {'id':_id,'title':title,'url':url}
return yuho_dict

def is_yuho(title):
if u'有価証券報告書' in unicode(title):
return True
else:
return False

def write_download_info(ofname):
with open(ofname,'w') as of:
json.dump(dat_download, of, indent=4)

def download_all_xbrl_files(download_info_dict,directory_path):
for ticker_symbol, info_dicts in download_info_dict.items():
save_path = directory_path+ticker_symbol
if not os.path.exists(save_path):
os.mkdir(save_path)

for _id, info_dict in info_dicts.items():
_download_xbrl_file(info_dict['url'],_id,save_path)

def _download_xbrl_file(url,_id,save_path):
r = requests.get(url)
if r.ok:
#print url
path = save_path+'/'+_id
if not os.path.exists(path):
os.mkdir(path)
r = requests.get(url)
z = ZipFile(StringIO(r.content))
z.extractall(path) # unzip the file and save files to path.

if __name__=='__main__':
base_url = 'http://resource.ufocatch.com/atom/edinetx/query/'
namespace = '{http://www.w3.org/2005/Atom}'
t_symbols = ('1301','2432',)

for t_symbol in t_symbols:
response_string = get_link_info_str(t_symbol, base_url)
ET_tree = ET.fromstring( response_string )
ET.register_namespace('',namespace[1:-1])

dat_download = defaultdict(dict)
# get download file info
info_dict = get_link(ET_tree,namespace)
dat_download[t_symbol] = info_dict

ofname = os.getcwd()+'/downloaded_info/dat_download_'+t_symbol+'.json'
write_download_info(ofname)

directory_path = os.getcwd()+'/xbrl_files/'
download_all_xbrl_files(dat_download,directory_path)

多少引っかかった部分としては、XBRLファイル(群)がzipファイルで提供されているため


  • バイナリデータを扱うためにStringIOを使用する必要があったこと

  • ZipFileを展開した状態で保存するためにzipfileを使用した
    ことです。

requestsではなくurllib2を使用する場合はStringIOの使用は必要ないみたいなんですが。。


コメント

有報の内容抽出については出来次第うpしたいと思います。

おかしな点にお気づきの方がおられましたらコメント頂けますと大変助かります。