Pythonでファンダメンタル投資のデータを集められないものかと思い, 調べてみたらUFOキャッチャーからXBRLをダウンロードしていろいろやっている記事がいくつか見つかりましたが, どれもスクラッチで面倒そうだなぁと思ったのでXBRLをサクッと取得&解析できるモジュールを作ってみました. 作ってみたばかりなのでおかしいところがあればご連絡いただけるとうれしいです.
Gitリポジトリからインストールします.
pip install git+https://github.com/sawadyrr5/UfoDataReader
XBRLの取得はDataReaderクラスを使います. symbol, start, endを指定すると合致する文書をすべて表示します. titleに「有価証券報告書」または「四半期報告書」と付くものはis_yuho=Trueとなっています. fetch_xbrl=Trueとすると, XBRLデータをダウンロードします.(概ね数MBあるので注意)
In [1]:
# 1. getting xbrl
from UfoDataReader.io.data import DataReader
from datetime import datetime
start = datetime(2017, 6, 23)
end = datetime(2017, 6, 23)
ufos = DataReader('7203', 'ufo', start, end, fetch_xbrl=False) # if fetch_xbrl=True, download xbrl files.
ufos
Out[1]:
[{'docid': 'S100AKEX',
'id': 'ED2017062301177',
'is_yuho': True,
'title': '【E02144】トヨタ自動車株式会社 有価証券報告書-第113期(平成28年4月1日-平成29年3月31日)',
'updated': datetime.datetime(2017, 6, 23, 0, 0),
'url': 'http://resource.ufocatch.com/data/edinet/ED2017062301177'},
{'docid': 'S100AI3I',
'id': 'ED2017062301247',
'is_yuho': False,
'title': '【E02144】トヨタ自動車株式会社 内部統制報告書-第113期(平成28年4月1日-平成29年3月31日)',
'updated': datetime.datetime(2017, 6, 23, 0, 0),
'url': 'http://resource.ufocatch.com/data/edinet/ED2017062301247'}]
XBRLのパースはUfoXBRLParserクラスを使います. parse()メソッドにXBRLファイルを渡すと, パース済みのXBRLドキュメントが返ってきます. XBRLドキュメントをparseDEI()に渡すと, ドキュメントの基本情報を取得することができます.
In [2]:
# 2.1 parse xbrl (US GAAP)
from UfoDataReader.util.parser import UfoXBRLParser
ufoparser = UfoXBRLParser()
toyota = 'jpcrp030000-asr-001_E02144-000_2015-03-31_01_2015-06-24.xbrl' # US GAAP
xbrl = ufoparser.parse(toyota)
dei = ufoparser.parseDEI(xbrl)
dei.__dict__
Out[2]:
{'accounting_standards': 'US GAAP',
'company_name': 'トヨタ自動車株式会社',
'current_fy_end': '2015-03-31',
'current_fy_start': '2014-04-01',
'edinet_code': 'E02144',
'trading_symbol': '72030'}
XBRLドキュメントをparseGAAP()に渡すと, 基本的な財務指標などを取得することができます. なお, 有価証券報告書の作成にあたっては会計基準はUS GAAP, IFRS, Japan GAAPの3種類があり, それぞれパースするための要素名などが微妙に違いますが, とりあえずparseGAAP()に突っ込んだら内部でUS GAAPとJapan GAAPを判別してパースするようにしています. IFRSには未対応です. (要素名など詳しくは金融庁公開の以下ファイル参照)
トヨタ自動車の場合はUS GAAP基準で作成されています.
In [3]:
gaap = ufoparser.parseGAAP(xbrl)
gaap.__dict__
Out[3]:
{'assets': '15128623000000',
'basic_eps': '688.02',
'cashflow_from_financing': '306045000000',
'cashflow_from_investing': '-3813490000000',
'cashflow_from_operation': '3685753000000',
'comprehensive_income': '3294275000000',
'current_assets': '6000524000000',
'current_liabilities': '3571917000000',
'diluted_eps': '687.66',
'liabilities': '4944351000000',
'net_assets': '10184271000000',
'net_income_loss': '2173338000000',
'non_current_assets': '9128099000000',
'non_current_liabilities': '1372433000000',
'operating_income_loss': 0,
'per': '12.2',
'profit_loss_before_tax': '2892828000000',
'revenues': '27234521000000',
'shares_outstanding': '3417997000'}
国内基準のJapan GAAPで作成されている会社の場合はこのようになります.
In [4]:
# 2.2 parse xbrl (Japan GAAP)
amiyaki = 'jpcrp030000-asr-001_E03398-000_2017-03-31_01_2017-06-23.xbrl' # Japan GAAP
xbrl = ufoparser.parse(amiyaki)
dei = ufoparser.parseDEI(xbrl)
dei.__dict__
Out[4]:
{'accounting_standards': 'Japan GAAP',
'company_name': '株式会社あみやき亭',
'current_fy_end': '2017-03-31',
'current_fy_start': '2016-04-01',
'edinet_code': 'E03398',
'trading_symbol': '27530'}
In [5]:
gaap = ufoparser.parseGAAP(xbrl)
gaap.__dict__
Out[5]:
{'assets': '23304000000',
'basic_eps': '315.96',
'bps': '2769.14',
'cashflow_from_financing': '-744000000',
'cashflow_from_investing': '-1339000000',
'cashflow_from_operation': '3100000000',
'comprehensive_income': '2163000000',
'current_assets': '11004000000',
'current_liabilities': '3538000000',
'diluted_eps': '',
'equity_to_asset_ratio': '0.814',
'liabilities': '4339000000',
'net_assets': '18965000000',
'netsales': '30564000000',
'non_current_assets': '12299000000',
'non_current_liabilities': '800000000',
'ordinary_income_loss': '3053000000',
'per': '13.1',
'profit_loss': '2163000000',
'roe': '0.119',
'shares_outstanding': '6848800',
'total_assets': '23304000000'}
投資するための財務分析step1「財務情報XBRLを取得する」 投資するための財務分析step2「XBRLファイルをDBに取り込む」 有報のXBRLの項目メモ