EDGARからXBRLデータを自動で集めるパッケージを試してみた

はじめまして、XBRLJapanの開発委員会のメンバーAです。昨年と異なり、今年は、より自由度を高めるために個人での執筆・投稿の形式をとりました。最終的には、Tipsレベルの記事になってしまいましたが、楽しんでいただければ幸いです。

私は、EDGARを取り上げてみました。EDGAR（Electronic Data Gathering, Analysis, and Retrieval system）は、アメリカの証券取引委員会（SEC: Securities and Exchange Commission）が管理・運営する法定開示書類の電子媒体を利用した開示システムの事です。EDGARを利用することで、AmazonやAppleといった米国の証券市場に上場している企業の財務諸表を閲覧・取得することができます。米国版EDINETのような位置づけであり、米国企業への投資や、日本と米国の企業比較などを行う投資家の方々には、必須のシステムとなっています。今回は、EDGARで開示されているXBRLデータを、世の中にあるパッケージを使って、簡単に集める方法がないかを模索してみました。（結論から言うと、失敗しましたが・・・）

# 1. EDGARからXBRLデータを集めてみる
## 1.1 パッケージ概要
[sec_edgar_download](https://pypi.org/project/sec_edgar_download/)と呼ばれるパッケージで、EDGARで開示されているXBRLデータの収集を試してみました。こちらのパッケージは、SECのEDGARWebサイトから、企業の10-K[^1]および10-Q[^2]のファイリングをダウンロードするPythonライブラリです。EDGARは、各ファイリングを説明するRSSフィードを月毎などで管理しています。`sec_edgar_download`と呼ばれるCLIツールは、10-Kおよび10-Qについて、ローカル環境のSQlite3データベースでのRSSファイルのダウンロードとインデックス作成をサポートしてくれます。（カスタマイズ無しだと、直近の最新情報を取得できないパッケージだったのでご注意ください、また本記事ではカスタマイズまでは行っておりません）

[^1]: 日本の有価証券報告書に相当するもの
[^2]: 日本の四半期報告書に相当するもの

>A small python library which downloads companies 10-K and 10-Q filings from the SEC’s Edgar website. The Edgar site maintains monthly RSS feeds describing each of the filings. A cli tool called sec_edgar_download supports downloading and indexing, in a local sqlite3 database, the RSS files; as well as downloading specific 10-K and 10-Q filings.

## 1.2 事前に知っておきたい知識
EDGARは、EDINETのようにAPIを提供していませんが、各ファイリングを説明するRSSフィードを、様々な形式で定期的に提供しています。フィードの中には、メタデータ（会社名、CIK番号、提出日、フォームタイプ）、EDGAR提出のリンク、および圧縮（.zip）形式のインタラクティブな構造化データファイルへのリンクが記載されています。そのため、EDGARから自動でXBRLデータを収集するプログラムを自作する場合は、RSSフィードを解析する方法が手っ取り早いと思います。RSSの概要は、次のEDGARのサイト[[Structured Disclosure RSS Feeds]](https://www.sec.gov/structureddata/rss-feeds-submitted-filings)を参照ください。特定のフィードは10分ごとに更新されるため、それらフィードを用いて最新情報をリアルタイムで取得することも可能です。

RSSフィードについて、もう少し具体的に、ある企業のRSSフィードを用いて説明しておきます。使用するフィードは[こちら](https://www.sec.gov/Archives/edgar/monthly/xbrlrss-2020-12.xml)から抜粋しています。

まず、`guid`要素のURLにアクセスすると、XBRLデータがzip形式で取得可能です。また、`formType`要素、`CompanyName`要素、`cikNumber`要素、そして`period`要素などを利用すれば、自分が取得したい企業の必要な財務情報を判断し取得することができます。加えて、`xbrlFile`要素を使うと、zip形式ではなく、インスタンスやタクソノミスキーマを直接取得することも可能です。XBRLデータの種別の判断は、`type`要素を確認すれば、「基本的に」可能になります。`type`要素の内容は、[EDGAR Filer Manual vol2-v14](https://www.sec.gov/info/edgar/edgarfm-vol2-v14.pdf)や、[EDGAR Filer Manual vol2-v55](https://www.sec.gov/info/edgar/specifications/edgarfm-vol2-v55.pdf)に記載があります。

■vol2-v14(April 2010 )
![スクリーンショット 2020-12-20 13.30.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500494/44b1a58b-b7b9-5d6e-4ec2-2a3c9bb7252f.png)

■vol2-v55(November 2020)
![スクリーンショット 2020-12-20 17.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500494/8ee89fac-ae6e-2232-29cf-2d95f49f8494.png)

```html

<item>
<title>PETROTEQ ENERGY INC. (0001561180) (Filer)</title>
<link>https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/0001213900-20-042837-index.htm</link>
<guid>https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/0001213900-20-042837-xbrl.zip</guid>
<enclosure url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/0001213900-20-042837-xbrl.zip" length="262859" type="application/zip"/>
<description>10-K</description>
<pubDate>Tue, 15 Dec 2020 17:29:50 EST</pubDate>
<edgar:xbrlFiling xmlns:edgar="https://www.sec.gov/Archives/edgar">
<edgar:companyName>PETROTEQ ENERGY INC.</edgar:companyName>
<edgar:formType>10-K</edgar:formType>
<edgar:filingDate>12/15/2020</edgar:filingDate>
<edgar:cikNumber>0001561180</edgar:cikNumber>
<edgar:accessionNumber>0001213900-20-042837</edgar:accessionNumber>
<edgar:fileNumber>000-55991</edgar:fileNumber>
<edgar:acceptanceDatetime>20201215172950</edgar:acceptanceDatetime>
<edgar:period>20200831</edgar:period>
<edgar:assistantDirector>Office of Energy & Transportation</edgar:assistantDirector>
<edgar:assignedSic>1381</edgar:assignedSic>
<edgar:fiscalYearEnd>0831</edgar:fiscalYearEnd>
<edgar:xbrlFiles>
<edgar:xbrlFile edgar:sequence="1" edgar:file="f10k2020_petroteqenergy.htm" edgar:type="10-K" edgar:size="1230125" edgar:description="ANNUAL REPORT" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020_petroteqenergy.htm"/>
<edgar:xbrlFile edgar:sequence="2" edgar:file="f10k2020ex10-33_petroteq.htm" edgar:type="EX-10.33" edgar:size="93093" edgar:description="MANAGEMENT AND OPERATIONS SERVICES AGREEMENT DATED AS OF MAY 1, 2020 BETWEEN PET" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex10-33_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="3" edgar:file="f10k2020ex10-34_petroteq.htm" edgar:type="EX-10.34" edgar:size="130562" edgar:description="DEBT CONVERSION AGREEMENT DATED AS OF JULY 20, 2020 BETWEEN PETROTEQ ENERGY INC." edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex10-34_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="4" edgar:file="f10k2020ex10-35_petroteq.htm" edgar:type="EX-10.35" edgar:size="113186" edgar:description="TECHNOLOGY LICENSE AGREEMENT DATED NOVEMBER 14, 2020 BETWEEN PETROTEQ ENERGY INC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex10-35_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="5" edgar:file="f10k2020ex10-36_petroteq.htm" edgar:type="EX-10.36" edgar:size="72657" edgar:description="SHORT-TERM MINING AND MINERAL SUBLEASE DATED AS OF AUGUST 20, 2020 BETWEEN VALKO" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex10-36_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="6" edgar:file="f10k2020ex31-1_petroteq.htm" edgar:type="EX-31.1" edgar:size="11755" edgar:description="CERTIFICATION" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex31-1_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="7" edgar:file="f10k2020ex31-2_petroteq.htm" edgar:type="EX-31.2" edgar:size="11660" edgar:description="CERTIFICATION" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex31-2_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="8" edgar:file="f10k2020ex32-1_petroteq.htm" edgar:type="EX-32.1" edgar:size="3853" edgar:description="CERTIFICATION" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex32-1_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="9" edgar:file="f10k2020ex32-2_petroteq.htm" edgar:type="EX-32.2" edgar:size="4049" edgar:description="CERTIFICATION" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/f10k2020ex32-2_petroteq.htm"/>
<edgar:xbrlFile edgar:sequence="10" edgar:file="image_001.jpg" edgar:type="GRAPHIC" edgar:size="66224" edgar:description="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/image_001.jpg"/>
<edgar:xbrlFile edgar:sequence="11" edgar:file="image_002.jpg" edgar:type="GRAPHIC" edgar:size="7456" edgar:description="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/image_002.jpg"/>
<edgar:xbrlFile edgar:sequence="12" edgar:file="image_003.jpg" edgar:type="GRAPHIC" edgar:size="61450" edgar:description="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/image_003.jpg"/>
<edgar:xbrlFile edgar:sequence="13" edgar:file="ex10-33_001.jpg" edgar:type="GRAPHIC" edgar:size="131767" edgar:description="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/ex10-33_001.jpg"/>
<edgar:xbrlFile edgar:sequence="14" edgar:file="ex10-34_001.jpg" edgar:type="GRAPHIC" edgar:size="7578" edgar:description="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/ex10-34_001.jpg"/>
<edgar:xbrlFile edgar:sequence="15" edgar:file="ex10-36_001.jpg" edgar:type="GRAPHIC" edgar:size="9374" edgar:description="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/ex10-36_001.jpg"/>
<edgar:xbrlFile edgar:sequence="16" edgar:file="pqeff-20200831.xml" edgar:type="EX-101.INS" edgar:size="1446565" edgar:description="XBRL INSTANCE FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/pqeff-20200831.xml"/>
<edgar:xbrlFile edgar:sequence="17" edgar:file="pqeff-20200831.xsd" edgar:type="EX-101.SCH" edgar:size="154382" edgar:description="XBRL SCHEMA FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/pqeff-20200831.xsd"/>
<edgar:xbrlFile edgar:sequence="18" edgar:file="pqeff-20200831_cal.xml" edgar:type="EX-101.CAL" edgar:size="60212" edgar:description="XBRL CALCULATION FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/pqeff-20200831_cal.xml"/>
<edgar:xbrlFile edgar:sequence="19" edgar:file="pqeff-20200831_def.xml" edgar:type="EX-101.DEF" edgar:size="480829" edgar:description="XBRL DEFINITION FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/pqeff-20200831_def.xml"/>
<edgar:xbrlFile edgar:sequence="20" edgar:file="pqeff-20200831_lab.xml" edgar:type="EX-101.LAB" edgar:size="905353" edgar:description="XBRL LABEL FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/pqeff-20200831_lab.xml"/>
<edgar:xbrlFile edgar:sequence="21" edgar:file="pqeff-20200831_pre.xml" edgar:type="EX-101.PRE" edgar:size="497767" edgar:description="XBRL PRESENTATION FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1561180/000121390020042837/pqeff-20200831_pre.xml"/>
</edgar:xbrlFiles>
</edgar:xbrlFiling>
</item>
```

月毎で管理しているRSSはこちらの[リンク](https://www.sec.gov/Archives/edgar/monthly/)から取得できるので、各月のRSS（XML形式）を解析し、`guid`要素記載のXBRLデータのzipリンクを用いたり、`xbrlFile`要素の`url`属性リンクを用いれば、簡単にXBRLデータをダウンロードできます。

## 1.3 環境構築
sec_edgar_downloadパッケージを利用するには、[github](https://github.com/robren/sec_edgar_download)からzip(sec_edgar_download-master)をダウンロードし、`python setup.py install`で`sec-edgar-download   0.1.2 `をインストールします。
その際に、パッケージで必要なライブラリ群[^3]も合わせてインストールされます。

[^3]: requests 2.25.0 ,pandas 1.1.4 ,lxml ,docopt 0.6.2 ,bs4 0.0.1 ,urllib3 1.26.2 ,idna 2.10 ,chardet 3.0.4 ,certifi 2020.12.5 ,Adding ,python-dateutil 2.8.1 ,Adding pytz 2020.4 ,Adding numpy 1.19.4m, beautifulsoup4 4.9.3 ,six 1.15.0 ,soupsieve 2.0.1

`pip install sec_edgar_download`でのセットアップも可能です。(https://pypi.org/project/sec_edgar_download/#description)

## 1.4  RSSフィードのダウンロード及び解析処理
ターミナル上のsec_edgar_download-masterフォルダで、`sec_edgar_download getrss 2017 2017`を実行することで、sec_edgar_download-master/edgar/rss-archivesフォルダに、月毎に管理しているxbrlrssファイルを2017年分一括でダウンロードが可能です。（並行して、裏でparse処理が走っています）

■実行結果
 xbrlrss-2017-01.xml
 xbrlrss-2017-02.xml
 xbrlrss-2017-03.xml
 xbrlrss-2017-04.xml
 xbrlrss-2017-05.xml
 xbrlrss-2017-06.xml
 xbrlrss-2017-07.xml
 xbrlrss-2017-08.xml
 xbrlrss-2017-09.xml
 xbrlrss-2017-10.xml
 xbrlrss-2017-11.xml
 xbrlrss-2017-12.xml

使い方は、RSSファイルをダウンロードしたい開始年と終了年を指定するだけでOKです。（詳細は、https://github.com/robren/sec_edgar_download 参照）

```
sec_edgar_download getrss <from-year> <to-year> 
[--fm <from-month>][--tm <to-month] [--wd <dir>]
```

## 1.5 XBRLデータ（インスタンス）のダウンロード
（事前に、ダウンロードしたい年のRSSファイルをダウンロードしておき）`sec_edgar_download getxbrl 2017 2017 -t AAPL`を実行することで、 sec_edgar_download-master/edgar/filingsフォルダに、appleの2017年のXBRLデータ（インスタンス）をダウンロードすることができます。

■実行結果
 aapl-20161231.xml
 aapl-20170401.xml
 aapl-20170701.xml
 aapl-20170930.xml


使い方は、XBRLデータをダウンロードしたい開始年と終了年を指定し、CIKかTickerを指定すればOKです。（詳細は、https://github.com/robren/sec_edgar_download 参照）

```
sec_edgar_download getxbrl <from-year> <to-year> 
(-c  <cik> | -t <ticker> | -f <file>)[--ft <form-type>]  [--wd <dir>]
```

CIKは、Central Index Keyの略で、EDINETコードに該当するもので、EDGARに開示情報を掲載する企業や個人を特定するために、SECのシステム内で採番された番号です。TICKERは、ティッカーコード・ティッカーシンボルと呼ばれるもので、日本の証券コードに該当するもので、１社に固有の１コードが割り振られるものです。
次の[リンク](https://www.sec.gov/edgar/searchedgar/accessing-edgar-data.htm)先で、tickerの一覧がtxt形式やjson形式でSECから公開されています。

（https://www.sec.gov/include/ticker.txt）
>ticker.txt: tab-delimited text file (ticker.txt) for ticker / CIK. This file provides the ticker search functionality for the Company Search Fast Search. We periodically update the file but do not guarantee accuracy or scope.

（https://www.sec.gov/files/company_tickers.json）
>company_tickers.json: json file for ticker/CIK/Company name associations. These associations provide the typeahead lookup and search functionaliity for the home page EDGAR search. The company names are EDGAR conformed names. We periodically update the file but do not guarantee accuracy or scope.

例えば、ticker.txtを見ると、amazonは、amznがTICKERと分かるので、今回の方法で2017年のXBRLデータをダウンロードする場合は、`sec_edgar_download getxbrl 2017 2017 -t AMZN`と実行すれば、以下のようにXBRLデータを取得することができます。

■実行結果
amzn-20161231.xml
amzn-20170331.xml
amzn-20170630.xml
amzn-20170930.xml

## 1.6 応用編
sec_edgar_downloadパッケージをpythonコードから呼びだせば、より汎用的かつ一括での処理が可能となります。以下、公式の[Github](https://github.com/robren/sec_edgar_download)にサンプルコードがあります。
処理は、`from_year`と`to_year`を2016年でセットし、`download_sec_feeds`メソッドで2016年のRSSフィードファイルを`edgar`フォルダにダウンロードしているものです。
その後、Tickerが`INTC`のCIKを取得し、`download_xbrl_data`メソッドで、INTCの2016年のXBRLデータをダウンロードする処理となります。
この処理を応用すれば、事前に全期間のRSSフィードを取得しておいて、TickerかCIKのリストを一覧で保持しておけば、全期間の企業のXBRLデータが取得可能となります。

```python
from sec_edgar_download import indexer as ix
work_dir = './edgar'
from_year = 2016
to_year = 2016
indexer = ix.SecIndexer(work_dir)
indexer.download_sec_feeds(from_year, to_year)

cik = ix.get_cik('INTC')

indexer.download_xbrl_data(cik,from_year, to_year, 'All')

```

# 2 問題点と解決策

## 2.1 問題点
2016年中頃のRSSダウンロード時に、以下のような注意文が多発します。

```
WARNING:root:No EX-101 or EX-100 xml files found for  COMPUTER PROGRAMS & SYSTEMS INC (0001169445) (Filer)
```

とある企業の提出書類の中に、EX-101 か EX-100 のXMLファイル（インスタンスファイル）が存在しないという意味です。なぜこんなことが起きたかというと、ざっくり整理した結果、
・2016年に、[EDGARがinlineXBRLでの提出を決めた](https://www.xbrl.org/more-on-the-secs-inline-xbrl-announcement/)ことで、文書管理の仕様が変更された。

・具体的には、インスタンスファイルが提出されなくなってしまった（indexページには、インスタンスファイルの代わり？の[EXTRACTED XBRL INSTANCE DOCUMENT]が表示されているが、RSSフィードに記載はない）

・代わりのinlineXBRLには、インスタンスファイルと同じType（EX-101、EX-100）情報が付与されなかった。（formTypeが付与されているようです）

ということのようです。

もちろん、inlineXBRLをまだ採用していない企業は、従前どおりTypeでの制御でインスタンスの処理はできます。要は仕様変更なのですが、パッケージ自体が2017年で更新が終わっているので、最新のEDGARの仕様に準拠できていなかったようです。残念。

## 2.2 解決策
いくつか解決策を考えてみました。スクラッチの案はラフですが実装方針も記載してみました。ネット上では色んなアプローチで取得されている方々もいますが、簡単な方法があれば、お知恵お借りできると助かります。

### 2.2.1 パッケージのソースコードを修正する
厄介ですが、デバッグしながら修正することも可能とは思います。基本は、inlineXBRLが登場したことによる、処理の分岐を実装すればいいのだと思います。RSSの解析ロジックに手が入るんでしょうかね。

### 2.2.2 スクラッチで、RSSフィードやidxファイルを利用して全XBRLデータを収集する
急がば回れ。ここまで理解できているので、個人で作ったほうが早いかもしれません。inlineXBRLの登場により、RSSフィードでは、xbrlFile要素に新たに`inlineXBRL`属性が存在していました。inlineXBRLだった場合、`edgar:inlineXBRL="true"`と定義するようです。

・inlineXBRLファイルでない場合（従来）

```
<edgar:xbrlFile edgar:sequence="5" edgar:file="logx-20181231.xml" edgar:type="EX-101.INS" edgar:size="590588" edgar:description="XBRL INSTANCE FILE" edgar:url="https://www.sec.gov/Archives/edgar/data/1603494/000168316820004377/logx-20181231.xml"/>
```

・inlineXBRLファイルの場合：

```
<edgar:xbrlFile edgar:sequence="1" edgar:file="cien-20201031.htm" edgar:type="10-K" edgar:size="4027649" edgar:description="10-K" edgar:inlineXBRL="true" edgar:url="https://www.sec.gov/Archives/edgar/data/936395/000093639520000042/cien-20201031.htm"/>
```
ですので、これまでのRSSフィードを全てダウンロードしてきて、XML解析し、xbrlFileを束ねるxbrlFiles単位で、inlineXBRLがあるかどうかを判断し、あれば`edgar:inlineXBRL="true"`のファイルをインスタンスとして判断、なければ、`type`属性（EX-101かEX-100）でインスタンスファイルを判断すればよいのだと思います。
inlineXBRLではなく、どうしても従来のインスタンスファイルを取得したい場合は、[indexページ](https://www.sec.gov/Archives/edgar/data/320193/000032019320000096/0000320193-20-000096-index.htm)上で、EXTRACTED XBRL INSTANCE DOCUMENTを何らかのロジックでとることになるとは思います。

### 2.2.3 有償のデータ収集・提供ソフトを購入し、XBRLデータを収集する
本記事では紹介を割愛しますが、お金を払えばデータを購入できる企業やWebアプリがあります。なんとか無償を目指したいのですが、時間をお金で買うのもありかもしれません。

### 2.2.4 その他
XBRL USが出しているAPIがありました。これを先にやるべきだったかもしれません。また時間があれば、試してみたいと思います。
https://xbrl.us/home/use/xbrl-api/

# 3. 問合せ先
本記事に関する問い合わせは、以下のメールアドレスまでお願いします。
e-mail：xbrl-tech-qa@xbrl.or.jp
（もちろん、qiita上でのコメントも歓迎します）

本メールアドレスは、qiitaの記事を執筆しているXBRLJapanの[開発委員会](https://www.xbrl.or.jp/modules/pico3/index.php?content_id=10)の問合せ窓口になります。
そのため、組織に関する一般的な問合せなどは内容によって回答できかねますが、XBRLに関する技術的な質問、意見、要望、助言等はお気軽にご連絡ください。
なお、委員会メンバが有志で対応しているため、回答に時間がかかることもありますが、ご了承ください。