ブログに戻る
tutorialdata

Pythonで日本の財務データを取得する実践ガイド

Onkar Dahale

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社以上のスクリーニング・比較・チャート作成までを解説します。

準備

pip install axiora

SDKは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 matplotlib
from 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パース済み。")

次のステップ

無料プラン。クレカ不要。APIキーを取得 →