EDINETの有報データを返してくれるAPIが増えてきた。ありがたい。XBRLを自分でパースする地獄から解放される。
ただ、ふと思った。返ってくる数値、合ってるのか?
有報は監査済み。公式の数字。APIが返す数値が公式とずれていたら、その上に作った分析は全部ゴミになる。
気になったので、2つのAPI(EDINET DBとAxiora)の返り値を、トヨタ・ソニー・ファーストリテイリングの公式IR資料と突き合わせた。
やったこと
- 両APIから同じ企業・同じ年度のデータを取得
- 公式IR(決算短信・プレスリリース・SEC Filing)の数値と比較
- ずれがあったら原因を調べる
突き合わせに使った公式ソース:
結論から
売上高・純利益は両方とも正確。最重要指標が合ってるのは安心。
差が出たのはメタデータとデータの整合性。順に見ていく。
トヨタの会計基準がおかしい
トヨタはFY2021からIFRS。20-Fにも書いてある。常識。
EDINET DBに聞いてみる:
curl -s -H "X-API-Key: $KEY" \
"https://edinetdb.jp/v1/companies/E02144/financials" | \
jq '.data[-1] | {fiscal_year, accounting_standard}'
{"fiscal_year": 2025, "accounting_standard": "USGAAP"}
USGAAP。2025年度で。
Axioraだと:
from axiora import Axiora
client = Axiora()
f = client.companies.retrieve_financials("7203", years=1).data[0]
print(f.accounting_standard) # "IFRS"
IFRS。正しい。
トヨタだけかと思って調べたら、NTT(JP-GAAPのはず)もUSGAAPと返ってくる。会計基準の判定ロジックが壊れている。
なぜ困るか: IFRSとUS-GAAPとJP-GAAPでは、同じ「営業利益」でも定義が違う。IFRSには制度上の「営業利益」の定義がない。会計基準のラベルが間違っていると、比較分析の前提が崩れる。
ソニーのデータが二重に返ってくる
ソニー(E01777)の財務データを取ると、年度の配列がこうなる:
curl -s -H "X-API-Key: $KEY" \
"https://edinetdb.jp/v1/companies/E01777/financials" | \
jq '.meta.fiscal_years'
[2012, 2013, 2014, 2015, 2015, 2016, 2016, 2017, 2017,
2018, 2018, 2019, 2019, 2020, 2020, 2021, 2022, 2023, 2024, 2025]
FY2015〜FY2020が2回ずつ。14年度分に対して20行。
FY2020の重複を見ると:
// 1つ目(フィールド2個だけ)
{"accounting_standard": "USGAAP", "capex": 513061000000, "fiscal_year": 2020}
// 2つ目(正常、40フィールド)
{"fiscal_year": 2020, "revenue": 8259885000000, "net_income": 582191000000, ...}
1つ目は売上も純利益もない。子会社の提出書類(ソニーフィナンシャルHD等)が混入してる可能性が高い。
なぜ困るか:
import pandas as pd
df = pd.DataFrame(response["data"])
df.groupby("fiscal_year")["revenue"].sum() # 二重計上
df.plot(x="fiscal_year", y="revenue") # 折れ線が飛ぶ
利用者側で重複除去を書かないとpandasに入れた瞬間に壊れる。
Axioraでソニーを取ると:
sony = client.companies.retrieve_financials("6758", years=15)
years = [f.fiscal_year for f in sony.data]
print(len(years), len(set(years))) # 11 11 — 重複なし
1年度1行。
純利益と売上高は両方正確
一番大事な数値。公式IRと突き合わせた:
| 企業 | 年度 | 公式(親会社帰属) | EDINET DB | Axiora |
|---|---|---|---|---|
| トヨタ | 2025 | ¥4,765,086M | ¥4,765,086M | ¥4,765,086M |
| トヨタ | 2024 | ¥4,944,933M | ¥4,944,933M | ¥4,944,933M |
| ソニー | FY2025 | ¥1,141,600M | ¥1,141,600M | ¥1,141,600M |
| ソニー | FY2024 | ¥970,573M | ¥970,573M | ¥970,573M |
| ファストリ | 2025 | ¥433,009M | ¥433,009M | ¥433,009M |
| ファストリ | 2024 | ¥371,999M | ¥371,999M | ¥371,999M |
売上高も全社全年度で一致。ここは安心。
トヨタの売上原価が時空を超えている
EDINET DBのトヨタFY2019:
revenue: 30,225,681,000,000
cost_of_sales: 9,561,872,000,000
粗利率 = (30.2T - 9.6T) / 30.2T = 68.4%
トヨタの粗利率68%。自動車メーカーで。
実際のトヨタの粗利率は約20%。COGS比率は80%前後。68%の粗利はAppleでも出ない。
FY2021以降(IFRS移行後)は正常値に戻っている。US-GAAP期間のXBRLタグの取り違えだと思われる。
Axioraでトヨタの売上原価を見ると:
for f in client.companies.retrieve_financials("7203", years=5).data:
if f.cost_of_sales and f.revenue:
margin = (f.revenue - f.cost_of_sales) / f.revenue * 100
print(f"FY{f.fiscal_year} 粗利率: {margin:.1f}%")
# FY2025 粗利率: 26.1%
# FY2024 粗利率: 25.5%
# FY2023 粗利率: 21.6%
# FY2022 粗利率: 22.7%
# FY2021 粗利率: 22.1%
全年度で20〜26%。自動車メーカーとして妥当な値。
まとめ
| EDINET DB | Axiora | |
|---|---|---|
| 売上高 | 正確 | 正確 |
| 純利益 | 正確 | 正確 |
| 会計基準の判定 | トヨタ→USGAAP ✗ | IFRS ✓ |
| 重複行 | ソニー6年度分が重複 | なし |
| 空データ行 | あり(フィールド2個の行) | なし |
| 売上原価 | FY2019以前で異常値 | 正確(粗利率20〜26%) |
両方ともEDINETの有報XBRLをパースしている。売上と純利益が合ってるのは前提として、差が出るのはパーサーの品質。重複除去、会計基準の判定、XBRLタグの正確なマッピング。
追試コード
5分で同じ検証ができる。
from axiora import Axiora
client = Axiora()
# トヨタ — 会計基準と純利益
for f in client.companies.retrieve_financials("7203", years=3).data:
print(f"FY{f.fiscal_year} {f.accounting_standard} 純利益: ¥{f.net_income:,}")
# ソニー — 重複チェック
sony = client.companies.retrieve_financials("6758", years=15)
years = [f.fiscal_year for f in sony.data]
assert len(years) == len(set(years)), f"重複: {years}"
print(f"ソニー: {len(years)}年度、重複なし")
EDINET DB側はcurlで:
# 会計基準
curl -s -H "X-API-Key: $KEY" \
"https://edinetdb.jp/v1/companies/E02144/financials" | \
jq '[.data[] | {fiscal_year, accounting_standard}] | last'
# 重複チェック
curl -s -H "X-API-Key: $KEY" \
"https://edinetdb.jp/v1/companies/E01777/financials" | \
jq '.meta.fiscal_years | length, unique | length'
リンク
- EDINET DB: edinetdb.jp — β版3/7まで無料1,000回/日
- Axiora: axiora.dev — 無料10,000回/日
- EDINETとは何か — 開発者向けガイド
用途に合う方を使えばいい。ただし財務データは正確性が命。自分で検証してから使うことをおすすめする。