今回は米国の決算報告書を取得できるサイトであるEDGARの使い方を見ていきたいと思います。日本のEDINETに対応する米国のサイトがEDGARになります。EDINETは最大で10年分までしかデータを取得できませんが、EDGARの場合には公開されていればより長い期間のデータを取得できます。
基本的なEDGARの使い方
通常通りデータをダウンロードするだけであれば、サイト上で欲しい企業の詳細ページから必要な書類をダウンロードできます。
例えば Apple の決算報告書を取得する例を見てみます。
Apple の決算報告書が一覧になっているページはこちらのページになるので、
このページから必要なファイルをダウンロードします。
企業コード CIK の調べ方
EDGARの場合は、各企業に対してCIKという ID が振られています。これはEDINETの場合のEDINETコードに対応するイメージとなります。この、CIKを検索するには、こちらのページの検索から、企業名を入力するなどして検索が可能です。
https://www.sec.gov/edgar/searchedgar/cik
アクセス先のURLとRSS
EDGAR は RSS を提供しています。ですので、更新された情報を取得するには RSS を使うと便利です。
RSSのドキュメント
EDGARの場合には URL 構造が整理されていて、欲しい情報にアクセスする場合には基本的に URL を パターン通り入力すると アクセスできるケースがほとんどです。
また過去に作成されたデータの一覧についてもまとまった xml ファイルが存在しているので、過去に公表された計算データの一覧を取得したいといったような場合には以下のアーカイブ一覧ファイルを使うと便利です。
アーカイブ
細かい内容については、以下のドキュメントが参考になります
https://www.sec.gov/os/accessing-edgar-data
Python で EDGAR から 決算情報を取得する
それでは Python から決算情報を取得するにはどのようにすれば良いのでしょうか。
2016年頃まではEDGARの計算報告書の形式は EDINETと同じく xbrl 形式でした。
しかしそれ以降は ixbrl に変更となっています。そのため、いつのデータを処理するかによって若干処理の方法が異なってくるのが難しいポイントになります。
EDGARから決算情報を取得する方法は大きく分けて2つあります。
まず1つ目がAPI を使って取得する方法です。EDGAR には 以前は API は存在しませんでしたが 現在は API が一部 存在しています。API を使えば、特定の企業の財務諸表数値の一覧を取得したり、特定の財務諸表項目の数値を取得することが可能です。
もう一つの方法が自分で企業が公開している書類の一覧をダウンロードして解析する方法になります。この方法の方がより多くの情報を手に入れることができますが、途中でファイルの形式が変更されていることもあり、全てに対応したものを作るには手間がかかります。
今回は主に1つ目の方法について紹介していきます。
2つ目の方法も試してみましたが、ファイルのダウンロードは可能ですが、Arelleで要素を解析する時に、適切な参照先のリンクが見つからずうまく要素が見つけられないことが多くあったので、Arelleを使う場合には自分で調整が必要になりそうです。2つ目の方法についてもファイルの取得方法と読み込みの基本的な方法については紹介します。
EDGAR API の使い方
こちらがAPIドキュメントになるので、詳細はこちらを参照してください
提出書類一覧の取得
https://data.sec.gov/submissions/CIK{cik}.json
にアクセスすることで、提出書類一覧を取得できます。
例えばアップルの例を見てみます。
cik = '0000320193' #APPL
url = f'https://data.sec.gov/submissions/CIK{cik}.json'
def get_data(url):
headers = {
'User-Agent': 'email@gmail.com',
}
# リクエストを送信してJSONデータを取得
response = requests.get(url, headers=headers)
# レスポンスの内容を確認
if response.status_code == 200:
# JSONデータをDataFrameに読み込む
data = response.json()
else:
print(f"Failed to retrieve data. Status code: {response.status_code}")
return data
get_data(url)
リクエストの際にはheaderを入力する必要があるので、注意してください。メールアドレスを入力するようです。
pd.DataFrame(data['filings']['recent'])
このようにして、提出書類の一覧を取得できます。
このほか、企業の現在の名前、以前の名前、証券取引所、ティッカー シンボルなどのメタデータが含まれています。
ここで取得される書類一覧は、少なくとも直近1年間の提出書類、または最新の 1,000 件のいずれか多い方の提出書類情報が含まれているようです。
特定項目の値の取得(個別企業)
以下のURLにアクセスすることで、特定の企業の特定の項目を取得できます。
例えば、純利益の場合には次のようにして取得できます。
concept_name = 'NetIncomeLoss'
url = f'https://data.sec.gov/api/xbrl/companyconcept/CIK{cik}/us-gaap/{concept_name}.json'
data = get_data(url)
pd.DataFrame(data['units']['USD'])
特定項目の値の取得(全企業)
全企業の特定期間の特定項目のデータをまとめて取得することも可能です。
正直これは、分析においてはかなりありがたい機能です。基本的にはクロスセクションで値を比較して、分析することが多いので、その時のデータとして使用できます。
https://data.sec.gov/api/xbrl/frames/usgaap/{concept_name}/{unit}/CY***Q.json
のようなリンクにアクセスします。
2023年Q1の純資産のデータです。
url = f'https://data.sec.gov/api/xbrl/frames/us-gaap/{concept_name}/USD/CY2023Q1.json'
data = get_data(url)
pd.DataFrame(data['data'])
XBRL で指定される測定単位に分子と分母が含まれる場合、これらは「USD-per-shares」のように「-per-」で区切るようです。XBRL のデフォルトの単位は「pure」です。
期間の形式は、年間データの場合は CY#### (期間は 365 日 +/- 30 日)、
四半期データの場合は CY####Q# (期間は 91 日 +/- 30 日)、
瞬間データの場合は CY####Q#I です。
例えば、Assetsなどは瞬間データとして、AssetsCurrent
などで取得できます。(CY2023Q1Iなどで取得できますが、CY2023Q1では取得できません)
concept_nameを調べるには、以下のページのスキーマファイルなどから探したり、次に説明する企業の全項目取得の項目データから取得できます。
https://www.sec.gov/data-research/standard-taxonomies/operating-companies
特定企業の全項目の取得
最後に特定企業のすべての項目データを取得する方法になります。
https://data.sec.gov/api/xbrl/companyfacts/CIK{cik}.json
url = f'https://data.sec.gov/api/xbrl/companyfacts/CIK{cik}.json'
data = get_data(url)
df = pd.DataFrame(data['facts']['us-gaap']).T
df
数値に関するデータは基本すべて取得できそうに見えます。
自力で解析する場合
自力で解析する場合には、XBRLなどの入ったファイルをzip形式でダウンロードして、解析を行います。
例えば、過去の公開された文書一覧は以下のようなURLにXMLとして格納されています。
url = “https://www.sec.gov/Archives/edgar/monthly/xbrlrss-2023-12.xml”
ですので、まずは、この一覧をダウンロードして処理していきます。
この中には<item>
タグで囲まれた要素があります。
下記がその一例ですが、CIKや企業名と、ファイルのリンク種類などが記載されています。
これは新しいタイプの形式です。
<item>
<title>Adamas One Corp. (0001884072) (Filer)</title>
<link>https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/0001199835-23-000643-index.htm</link>
<guid>https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/0001199835-23-000643-xbrl.zip</guid>
<enclosure length="104751" type="application/zip" url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/0001199835-23-000643-xbrl.zip"/>
<description>10-Q</description>
<pubDate>Fri, 29 Dec 2023 17:30:45 EST</pubDate>
<edgar:xbrlFiling xmlns:edgar="https://www.sec.gov/Archives/edgar">
<edgar:companyName>Adamas One Corp.</edgar:companyName>
<edgar:formType>10-Q</edgar:formType>
<edgar:filingDate>12/29/2023</edgar:filingDate>
<edgar:cikNumber>0001884072</edgar:cikNumber>
<edgar:accessionNumber>0001199835-23-000643</edgar:accessionNumber>
<edgar:fileNumber>001-41560</edgar:fileNumber>
<edgar:acceptanceDatetime>20231229173045</edgar:acceptanceDatetime>
<edgar:period>20230630</edgar:period>
<edgar:assistantDirector>Office of Manufacturing</edgar:assistantDirector>
<edgar:assignedSic>3910</edgar:assignedSic>
<edgar:fiscalYearEnd>0930</edgar:fiscalYearEnd>
<edgar:xbrlFiles>
<edgar:xbrlFile edgar:description="ADAMAS ONE CORP. 10-Q" edgar:file="jewl-10q.htm" edgar:inlineXBRL="true" edgar:sequence="1" edgar:size="628682" edgar:type="10-Q" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-10q.htm"/>
<edgar:xbrlFile edgar:description="CERTIFICATION PURSUANT TO SECTION 302 OF THE SARBANES-OXLEY ACT OF 2002 FOR JOHN" edgar:file="jewl-ex31_1.htm" edgar:sequence="2" edgar:size="15107" edgar:type="EX-31.1" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-ex31_1.htm"/>
<edgar:xbrlFile edgar:description="CERTIFICATION PURSUANT TO SECTION 302 OF THE SARBANES-OXLEY ACT OF 2002 FOR STEV" edgar:file="jewl-ex31_2.htm" edgar:sequence="3" edgar:size="15100" edgar:type="EX-31.2" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-ex31_2.htm"/>
<edgar:xbrlFile edgar:description="CERTIFICATION PURSUANT TO SECTION 906 OF THE SARBANES-OXLEY ACT OF 2002 FOR JOHN" edgar:file="jewl-ex32_1.htm" edgar:sequence="4" edgar:size="5672" edgar:type="EX-32.1" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-ex32_1.htm"/>
<edgar:xbrlFile edgar:description="CERTIFICATION PURSUANT TO SECTION 906 OF THE SARBANES-OXLEY ACT OF 2002 FOR STEV" edgar:file="jewl-ex32_2.htm" edgar:sequence="5" edgar:size="5626" edgar:type="EX-32.2" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-ex32_2.htm"/>
<edgar:xbrlFile edgar:description="XBRL SCHEMA FILE" edgar:file="jewl-20230630.xsd" edgar:sequence="6" edgar:size="21999" edgar:type="EX-101.SCH" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-20230630.xsd"/>
<edgar:xbrlFile edgar:description="XBRL CALCULATION FILE" edgar:file="jewl-20230630_cal.xml" edgar:sequence="7" edgar:size="36299" edgar:type="EX-101.CAL" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-20230630_cal.xml"/>
<edgar:xbrlFile edgar:description="XBRL DEFINITION FILE" edgar:file="jewl-20230630_def.xml" edgar:sequence="8" edgar:size="68475" edgar:type="EX-101.DEF" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-20230630_def.xml"/>
<edgar:xbrlFile edgar:description="XBRL LABEL FILE" edgar:file="jewl-20230630_lab.xml" edgar:sequence="9" edgar:size="197267" edgar:type="EX-101.LAB" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-20230630_lab.xml"/>
<edgar:xbrlFile edgar:description="XBRL PRESENTATION FILE" edgar:file="jewl-20230630_pre.xml" edgar:sequence="10" edgar:size="157708" edgar:type="EX-101.PRE" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/jewl-20230630_pre.xml"/>
<edgar:xbrlFile edgar:description="GRAPHIC" edgar:file="ac001_v1.jpg" edgar:sequence="11" edgar:size="6788" edgar:type="GRAPHIC" edgar:url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/ac001_v1.jpg"/>
</edgar:xbrlFiles>
</edgar:xbrlFiling>
</item>
この場合は、guid
に必要なzipファイルのリンクがありますので、
このリンクをダウンロードしていきます。
<guid>https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/0001199835-23-000643-xbrl.zip</guid>
<enclosure length="104751" type="application/zip" url="https://www.sec.gov/Archives/edgar/data/1884072/000119983523000643/0001199835-23-000643-xbrl.zip"/>
上記はixbrl形式の場合ですが、xbrlの場合は、
<item>
<title>PetLife Pharmaceuticals, Inc. (0001354591) (Filer)</title>
<link>http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/0001493152-15-006520-index.htm</link>
<description>10-Q</description>
<pubDate>Thu, 31 Dec 2015 17:23:55 EST</pubDate>
<edgar:xbrlFiling xmlns:edgar="http://www.sec.gov/Archives/edgar">
<edgar:companyName>PetLife Pharmaceuticals, Inc.</edgar:companyName>
<edgar:formType>10-Q</edgar:formType>
<edgar:filingDate>12/31/2015</edgar:filingDate>
<edgar:cikNumber>0001354591</edgar:cikNumber>
<edgar:accessionNumber>0001493152-15-006520</edgar:accessionNumber>
<edgar:fileNumber>000-52445</edgar:fileNumber>
<edgar:acceptanceDatetime>20151231172355</edgar:acceptanceDatetime>
<edgar:period>20150531</edgar:period>
<edgar:assistantDirector>6</edgar:assistantDirector>
<edgar:assignedSic>2860</edgar:assignedSic>
<edgar:fiscalYearEnd>0831</edgar:fiscalYearEnd>
<edgar:xbrlFiles>
<edgar:xbrlFile edgar:description="" edgar:file="form10-q.htm" edgar:sequence="1" edgar:size="244406" edgar:type="10-Q" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/form10-q.htm"/>
<edgar:xbrlFile edgar:description="" edgar:file="ex31-1.htm" edgar:sequence="2" edgar:size="13875" edgar:type="EX-31.1" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ex31-1.htm"/>
<edgar:xbrlFile edgar:description="" edgar:file="ex32-1.htm" edgar:sequence="3" edgar:size="7325" edgar:type="EX-32.1" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ex32-1.htm"/>
<edgar:xbrlFile edgar:description="XBRL INSTANCE FILE" edgar:file="ptlf-20150531.xml" edgar:sequence="4" edgar:size="86104" edgar:type="EX-101.INS" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ptlf-20150531.xml"/>
<edgar:xbrlFile edgar:description="XBRL SCHEMA FILE" edgar:file="ptlf-20150531.xsd" edgar:sequence="5" edgar:size="11441" edgar:type="EX-101.SCH" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ptlf-20150531.xsd"/>
<edgar:xbrlFile edgar:description="XBRL CALCULATION FILE" edgar:file="ptlf-20150531_cal.xml" edgar:sequence="6" edgar:size="19351" edgar:type="EX-101.CAL" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ptlf-20150531_cal.xml"/>
<edgar:xbrlFile edgar:description="XBRL DEFINITION FILE" edgar:file="ptlf-20150531_def.xml" edgar:sequence="7" edgar:size="23926" edgar:type="EX-101.DEF" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ptlf-20150531_def.xml"/>
<edgar:xbrlFile edgar:description="XBRL LABEL FILE" edgar:file="ptlf-20150531_lab.xml" edgar:sequence="8" edgar:size="90955" edgar:type="EX-101.LAB" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ptlf-20150531_lab.xml"/>
<edgar:xbrlFile edgar:description="XBRL PRESENTATION FILE" edgar:file="ptlf-20150531_pre.xml" edgar:sequence="9" edgar:size="65302" edgar:type="EX-101.PRE" edgar:url="http://www.sec.gov/Archives/edgar/data/1354591/000149315215006520/ptlf-20150531_pre.xml"/>
</edgar:xbrlFiles>
</edgar:xbrlFiling>
</item>
のようになっているので、description="XBRL INSTANCE FILE"
となっているファイルが、XBRLファイルになります。
ダウンロード
一覧を取得して、その中からURLを取り出し、zipをダウンロードして、解凍します。
import requests
from bs4 import BeautifulSoup
import zipfile
import os
# ユーザーエージェントの設定
headers = {
'User-Agent': 'email@gmail.com',
}
# URLからXMLを取得
url = "https://www.sec.gov/Archives/edgar/monthly/xbrlrss-2015-12.xml"
response = requests.get(url, headers=headers)
xml_content = response.content
# BeautifulSoupを使用してXMLをパース
soup = BeautifulSoup(xml_content, 'xml')
# <guid>要素のURLを抽出
guid_urls = [guid.text for guid in soup.find_all('guid')]
ここまでが一覧の取得です。
# ダウンロードと解凍
download_dir = "downloaded_zips"
extract_dir = "extracted_files"
os.makedirs(download_dir, exist_ok=True)
os.makedirs(extract_dir, exist_ok=True)
for i, file_url in enumerate(guid_urls[:1]):
try:
# ZIPファイルをダウンロード
zip_response = requests.get(file_url, headers=headers)
zip_path = os.path.join(download_dir, f"file_{i}.zip")
with open(zip_path, 'wb') as f:
f.write(zip_response.content)
# ZIPファイルを解凍
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(extract_dir)
print(f"Downloaded and extracted {file_url}")
except Exception as e:
print(f"Failed to process {file_url}: {e}")
今回は例として1件だけ取得しています
解析
Arelleでダウンロードしたファイル群を解析します。
ixbrlなので、htmファイルを結合して、一つのファイルにして、Arelleに渡します。
import os
# フォルダのパスと結合するファイル名
folder_path = '/content/extracted_files' # 自分のフォルダパスに置き換える
output_file = '/content/extracted_files//output_file.htm' # 出力ファイルのパスと名前を指定
# フォルダ内のすべての .htm ファイルをリストアップ
htm_files = [f for f in os.listdir(folder_path) if f.endswith('.htm')]
# 結合するファイルの内容を保持する変数
combined_content = ''
# 各ファイルの内容を読み込んで結合する
for htm_file in htm_files:
file_path = os.path.join(folder_path, htm_file)
with open(file_path, 'r', encoding='utf-8') as f:
file_content = f.read()
combined_content += file_content
# 結合した内容を新しい .htm ファイルに書き出す
with open(output_file, 'w', encoding='utf-8') as f:
f.write(combined_content)
print(f"合成されたファイルはこちらに保存されています: {output_file}")
結合したファイルをArelleに入れます
from arelle import Cntlr,ViewFileFactTable,XbrlConst
import glob
xbrl_file = '/content/extracted_files//output_file.htm'
cols = ['Concept','Facts']
ctrl = Cntlr.Cntlr(logFileName='logToPrint')
modelXbrl = ctrl.modelManager.load(xbrl_file)
ファイルによってはうまく解析できますが、いくつか試したところできないものもありました。
ですので、テキストデータを必要としない限りは、APIの利用がおすすめです。
今回のコードはこちらのGoogleColabから確認できます。