Pythonで日本の上場企業の財務データが欲しいとき、現実の選択肢は3つ。Yahoo!ファイナンスをスクレイピングしてHTML変更のたびに壊れるコードを保守する。年間300万円のBloomberg端末を契約する。または3つの会計基準とShift-JISに対応するXBRLパーサーを2週間かけて自作する。
4つ目の選択肢:
from axiora import Axiora
client = Axiora(api_key="your-key")
toyota = client.companies.retrieve_financials("7203", years=1)
print(f"売上高: ¥{toyota.data[0].revenue:,}")
# 売上高: ¥29,929,992,000,000トヨタの監査済み売上高。型付き、IDEで自動補完、XBRLからパース。このチュートリアルでは、最初のAPIコールから4,125社以上のスクリーニング・比較・チャート作成までを解説します。
準備
- Python 3.9+
- Axiora APIキー — 無料、クレカ不要
pip install axioraSDKはStainlessで生成 — OpenAI、Anthropic、CloudflareのSDKと同じツールです。型付きPydanticモデル、自動リトライ、ページネーション内蔵。JSONの手動パース不要。
セットアップ
from axiora import Axiora
client = Axiora(api_key="your-api-key")1行。環境変数AXIORA_API_KEYからの読み取りにも対応。金額はすべてJPY整数値 — 浮動小数点エラーなし。
企業の財務データを取得
証券コード7203 — 東証で見る4桁のティッカーそのまま:
financials = client.companies.retrieve_financials("7203", years=5)
for f in financials.data:
rev = f.revenue / 1_000_000_000_000
ni = f.net_income / 1_000_000_000_000
print(f" {f.fiscal_year} 売上: ¥{rev:.1f}兆 純利益: ¥{ni:.2f}兆") 2024 売上: ¥29.9兆 純利益: ¥4.94兆
2023 売上: ¥37.2兆 純利益: ¥2.45兆
2022 売上: ¥31.4兆 純利益: ¥2.85兆
2021 売上: ¥27.2兆 純利益: ¥2.25兆
2020 売上: ¥29.9兆 純利益: ¥2.08兆トヨタの5年分の財務データ。すべて監査済み有価証券報告書のXBRLから、会計基準を跨いで正規化済み。レスポンスは型付きPydanticモデル — f.revenueがIDEで自動補完されます。
EDINETコード(E02144)でも同じ結果が取れます。
スクリーニング:面白い企業を見つける
「ROE15%以上、売上高1,000億円以上の日本企業をROE順で」。1回のAPIコール:
screen = client.screen.retrieve(
roe_min=15.0,
revenue_min=100_000_000_000,
sort="roe_desc",
limit=10,
)
for r in screen.data:
name = r.company.name_jp
roe = r.metrics.roe
rev_b = r.financials.revenue / 1_000_000_000
print(f" {name[:20]:<20} ROE: {roe:.1f}% 売上: ¥{rev_b:,.0f}億")元データは同じ — EDINETの監査済み有報です。Bloombergは端末にリアルタイム株価やニュースなど多機能を提供しますが、有報の財務指標でスクリーニングするだけなら端末は不要です。
フィルタ: roe_min, roe_max, revenue_min, revenue_max, net_income_min, roa_min, sectorなど。
競合比較
トヨタ(7203)、ホンダ(7267)、日産(7201)を並べる:
codes = ["7203", "7267", "7201"]
for code in codes:
company = client.companies.retrieve(code)
financials = client.companies.retrieve_financials(code, years=3)
print(f"\n{company.data.name_jp}")
for f in financials.data:
rev = f.revenue / 1_000_000_000_000
ni = f.net_income / 1_000_000_000
print(f" {f.fiscal_year} 売上: ¥{rev:.1f}兆 純利益: ¥{ni:,.0f}億")チャート:10年の売上推移
トヨタ(スケール)、ソニー(V字回復)、キーエンス(複利成長):
pip install axiora matplotlibfrom axiora import Axiora
import matplotlib.pyplot as plt
client = Axiora() # 環境変数AXIORA_API_KEYから読み取り
companies = {"7203": "トヨタ", "6758": "ソニー", "6861": "キーエンス"}
fig, ax = plt.subplots(figsize=(10, 6))
for code, label in companies.items():
financials = client.companies.retrieve_financials(code, years=10)
years = [f.fiscal_year for f in reversed(financials.data)]
rev = [f.revenue / 1e12 for f in reversed(financials.data)]
ax.plot(years, rev, marker="o", label=label, linewidth=2)
ax.set_ylabel("売上高(兆円)")
ax.set_title("トヨタ vs ソニー vs キーエンス — 10年売上推移")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("japan_revenue.png", dpi=150)トヨタの規模は圧倒的。でも傾きを見ると話が変わります。キーエンス — 売上2兆円のセンサー企業 — が10年間で年率15%以上の複利成長を続けている。
成長率
定量化:
growth = client.companies.retrieve_growth("6861", years=10)
print("キーエンス — 売上高 前年比成長率")
for entry in growth.data.yoy:
g = entry.growth.revenue
if g is not None:
bar = "█" * int(abs(g))
sign = "+" if g >= 0 else ""
print(f" {entry.fiscal_year} {sign}{g:>6.1f}% {bar}")
cagr = growth.data.cagr
if cagr.api_5yr:
print(f"\n 5年CAGR: {cagr.api_5yr.revenue:.1f}%")セクターランキング
電気機器セクターのROEトップ10:
ranking = client.rankings.retrieve(
"roe",
sector="電気機器",
limit=10,
)
for r in ranking.data:
name = r.company.name_jp[:20]
print(f" #{r.rank:<3} {name:<20} ROE: {r.value:.1f}%")非同期対応
並行処理が必要なら、完全なasyncクライアントがあります:
import asyncio
from axiora import AsyncAxiora
async def main():
async with AsyncAxiora() as client:
tasks = [
client.companies.retrieve_financials(code, years=5)
for code in ["7203", "6758", "6861", "9984", "6501"]
]
results = await asyncio.gather(*tasks)
for result in results:
f = result.data[0]
print(f" {f.edinet_code} 売上: ¥{f.revenue/1e12:.1f}兆")
asyncio.run(main())同じ型付きレスポンス、同じエラーハンドリング。awaitするだけ。
エラーハンドリング
SDKは型付き例外を送出:
from axiora import NotFoundError, RateLimitError
try:
client.companies.retrieve("INVALID")
except NotFoundError:
print("企業が見つかりません")
except RateLimitError:
print("レート制限 — リトライしてください")ステータスコードの確認不要。エラーJSONのパース不要。
コピペ用スクリプト
#!/usr/bin/env python3
"""日本の財務データをPythonで — Axiora クイックスタート"""
from axiora import Axiora
client = Axiora() # 環境変数AXIORA_API_KEYから読み取り
# トヨタの財務データ
print("=== トヨタ (7203) ===")
for f in client.companies.retrieve_financials("7203", years=5).data:
print(f" {f.fiscal_year} 売上: ¥{f.revenue/1e12:.1f}兆 純利益: ¥{f.net_income/1e12:.2f}兆")
# 高ROEスクリーニング
print("\n=== ROE > 15%、売上 > 1,000億円 ===")
for r in client.screen.retrieve(
roe_min=15, revenue_min=100_000_000_000, sort="roe_desc", limit=10
).data:
print(f" {r.company.name_jp[:20]:<20} ROE: {r.metrics.roe:.1f}%")
# 電気機器ランキング
print("\n=== 電気機器 — ROEトップ ===")
for r in client.rankings.retrieve("roe", sector="電気機器", limit=10).data:
print(f" #{r.rank:<3} {r.company.name_jp[:20]:<20} {r.value:.1f}%")
print("\n全データ: 監査済みEDINET有報、XBRLパース済み。")次のステップ
- 開発者のためのEDINET完全ガイド — データの出所とXBRLパースの大変さ
- 4,125社のXBRLをパースする方法 — これらの数値を支えるパーサーの仕組み
無料プラン。クレカ不要。APIキーを取得 →