RでEDINETから財務データを入手・分析する~導入編~
記事一覧
はじめに
このブログは、未来の自分のために、Rを使ってEDINETから有報を入手、加工と分析を行った記録を残すものである。想定する読者は「Rを使って上場企業の財務諸表のデータを分析してみたい者」である。このブログに従うことで、以下のようなデータが得られる*1。
docID | labelString | fact | startDate | endDate | elementId | contextId | roleId | filerName | secCode | jpx_33 |
---|---|---|---|---|---|---|---|---|---|---|
S100G3QX | 現金及び預金 | 5174000000 | NA | 2018-03-31 | CashAndDeposits | Prior1YearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 現金及び預金 | 5639000000 | NA | 2019-03-31 | CashAndDeposits | CurrentYearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 受取手形及び売掛金 | 7121000000 | NA | 2018-03-31 | NotesAndAccountsReceivableTrade | Prior1YearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 受取手形及び売掛金 | 7144000000 | NA | 2019-03-31 | NotesAndAccountsReceivableTrade | CurrentYearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 電子記録債権 | 1067000000 | NA | 2018-03-31 | ElectronicallyRecordedMonetaryClaimsOperatingCA | Prior1YearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 電子記録債権 | 494000000 | NA | 2019-03-31 | ElectronicallyRecordedMonetaryClaimsOperatingCA | CurrentYearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 商品及び製品 | 3191000000 | NA | 2018-03-31 | MerchandiseAndFinishedGoods | Prior1YearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 商品及び製品 | 3454000000 | NA | 2019-03-31 | MerchandiseAndFinishedGoods | CurrentYearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 仕掛品 | 22000000 | NA | 2018-03-31 | WorkInProcess | Prior1YearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
S100G3QX | 仕掛品 | 41000000 | NA | 2019-03-31 | WorkInProcess | CurrentYearInstant | ConsolidatedBalanceSheet | 電響社 | 81440 | 卸売業 |
なお、ブログの執筆にあたって以下の点に注意を払った。
- tidyverse系統の関数を多用しているが、稀なものでない限り「それらの関数の機能は何か」を説明はしない。
- 会計の用語に関する説明も行わない。
- 長文になることが予想されるため、文章量を最小にしつつ情報量を最大にすることを心掛ける。冗長な言い換え、理解に資さない例え、不要な強調は行わない。
- 現在わかっていないことは、ごまかさずにわからないと明記する。
手順
大まかな手順は以下の通りである。
- 書類の提出日を指定し、各書類に紐づけられたdocIDを入手する。
- APIを通じて有報のXBRLデータのzipファイルを入手する。
- zipファイルを解凍し、中身のうち財務諸表の数値データを取り出して分析可能な形に整える。
- 整頓したデータを分析する。
なお、一つの記事に一つの手順が収まらない可能性がある。
注意点
読者の時間を無駄にしないために、予め注意しておくべき点を列挙する。
もし使いたい財務データがIRBANKにて入手できるようなものならば、本ブログに従うことは無駄骨となる。BS項目であれば総資産、株主資本などの合計項目がそれにあたる。そうではなく、棚卸資産や売掛金といった細かい勘定科目を扱いたいときには意義がありうる*2。
日経Financial QUESTなど企業が有償で提供するデータを使えるならば、その方が良い。本記事で得られるデータは、前処理にひどく時間をとられるからである。
ブログ執筆時点において、5年以上の分析が可能な企業は日本基準を採用している企業に限られる。IFRSは数年前に対応されたためデータの蓄積が少なく、米国基準にいたっては対応がなされていない*3からである。
事前準備
以下、事前に準備を推奨する点を列挙する。
1. packageのインストール
手順1~3において、少なくとも以下のpackageを使用する。予めインストールすることを勧める。
library(RCurl) library(tidyverse) library(jsonlite) library(XML) library(rvest) library(lubridate) library(XBRL)
2. フォルダ構造
多くのデータを入手し、かつ、加工したものを保存する必要がある。効率的に分析等を行うために、フォルダ構造を以下に定める。
- Data
- label
- YYYY-MM-DD_dl(データの入手日)
- YYYY-MM-DD_filing(書類の提出日)
- zip
- tidyup
- YYYY-MM-DD_filing(書類の提出日)
流れとして、たとえばまず"2019-06-28"などを指定し、その日提出された書類に関するデータを入手してから、そのデータにあるdocIDを用いて実際の有報のzipデータを入手することとなるので、このような構造にした。1番上の"Data"フォルダがあることを前提としたうえで、上記のフォルダ構造を作る関数が以下である。
date_filing <- "2019-06-28" create_file_structure <- function(date_filing, dl_date = today()) { path <<- str_c("Data/", dl_date, "_dl") # use <<- if(!file.exists(path)) { # create file if NOT exists dir.create(path) } ## path_label <<- str_c("Data/label") if(!file.exists(path_label)) { dir.create(path_label) } ## path_filing <<- str_c(path, "/", date_filing, "_filing") if(!file.exists(path_filing)) { dir.create(path_filing) } ## path_zip <<- str_c(path_filing, "/zip") if(!file.exists(path_zip)) { dir.create(path_zip) } ## path_tidyup <<- str_c(path_filing, "/tidyup") if(!file.exists(path_tidyup)) { dir.create(path_tidyup) } ## return all path } create_file_structure(date_filing)
関数の実行によって得られたpathに関する変数は後に使うのでとっておく。
3. EDINETの操作ガイド
データの入手先であるEDINETにて、APIの仕様書やXBRLの形式に関する説明書が公開されている。その利用にあたっては、負担をかけないためにも最低限『EDINET API仕様書』を読んでおくべきである。
おわりに
次の記事では、手順の1にあたる「書類の提出日を指定し、各書類に紐づけられたdocIDを入手」を行う。執筆の励みになるため、starや記事の拡散をしていただけると嬉しい。