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 卸売業

なお、ブログの執筆にあたって以下の点に注意を払った。

  1. tidyverse系統の関数を多用しているが、稀なものでない限り「それらの関数の機能は何か」を説明はしない。
  2. 会計の用語に関する説明も行わない。
  3. 長文になることが予想されるため、文章量を最小にしつつ情報量を最大にすることを心掛ける。冗長な言い換え、理解に資さない例え、不要な強調は行わない。
  4. 現在わかっていないことは、ごまかさずにわからないと明記する。

手順

大まかな手順は以下の通りである。

  1. 書類の提出日を指定し、各書類に紐づけられたdocIDを入手する。
  2. APIを通じて有報のXBRLデータのzipファイルを入手する。
  3. zipファイルを解凍し、中身のうち財務諸表の数値データを取り出して分析可能な形に整える。
  4. 整頓したデータを分析する。

なお、一つの記事に一つの手順が収まらない可能性がある。

注意点

読者の時間を無駄にしないために、予め注意しておくべき点を列挙する。

  1. もし使いたい財務データがIRBANKにて入手できるようなものならば、本ブログに従うことは無駄骨となる。BS項目であれば総資産、株主資本などの合計項目がそれにあたる。そうではなく、棚卸資産売掛金といった細かい勘定科目を扱いたいときには意義がありうる*2

  2. 日経Financial QUESTなど企業が有償で提供するデータを使えるならば、その方が良い。本記事で得られるデータは、前処理にひどく時間をとられるからである。

  3. ブログ執筆時点において、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

流れとして、たとえばまず"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や記事の拡散をしていただけると嬉しい。

*1:示したのはストック情報であるためstartDate(期首日)がNAになっているが、フロー情報なら埋まっている。

*2:本ブログの手順で入手できるのは有価証券報告書内の【経理の状況】に記載される財務諸表の数値データである。本ブログで例示した電響社ならば、会社のHPにおける有報を見比べるとよい。

*3:詳細タグ付けがされておらず、1つのセルにhtmlのテーブルが直書きされている