• #financial-data
  • #data-pipeline
  • #koyfin
  • #sqlite
  • #vue
  • #architecture
開発financial-dataメモ

財務データパイプライン - 全体像

複数企業の財務データを効率的に取得・管理・表示するためのデータパイプラインの全体像です。

データフロー概要

┌─────────────────────────────────────────────────────────────────────────────┐
│                        財務データパイプライン                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  [Step 1: データ取得]                                                        │
│  ┌──────────┐     Chrome拡張機能      ┌─────────────┐                       │
│  │  Koyfin  │  ─────────────────────→ │  TSVファイル  │                      │
│  │  (Web)   │   ティッカー入力で       │ (統合形式)    │                      │
│  └──────────┘   Annual + Quarterly    └─────────────┘                       │
│                  を一括取得                   │                              │
│                                             │                              │
│  [Step 2: データ蓄積]                        ↓                              │
│  ┌─────────────┐    Pythonスクリプト   ┌─────────────┐                       │
│  │  TSVファイル  │  ─────────────────→ │   SQLite    │                      │
│  │ (koyfin-data/) │  import_tsv_dir.py │ (koyfin.db) │                      │
│  └─────────────┘                      └─────────────┘                       │
│                                             │                              │
│  [Step 3: コード生成]                        ↓                              │
│  ┌─────────────┐    Node.jsスクリプト   ┌─────────────┐                       │
│  │   SQLite    │  ─────────────────→ │ TypeScript  │                      │
│  │ (koyfin.db) │  generate-financial  │ composables │                      │
│  └─────────────┘     -data.mjs        │(自動生成)    │                      │
│                                       └─────────────┘                       │
│                                             │                              │
│  [Step 4: 表示]                              ↓                              │
│  ┌─────────────┐        import        ┌─────────────┐                       │
│  │ TypeScript  │  ─────────────────→ │   Vue       │                      │
│  │ composables │                      │   ページ    │                      │
│  └─────────────┘                      └─────────────┘                       │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

各ステップの詳細

Step 1: Koyfinからデータ取得(Chrome拡張機能)

関連ドキュメント: Koyfin Chrome拡張機能とSQLiteインポート

Chrome拡張機能を使用して、Koyfinから財務データを自動取得します。

使い方:

  1. Koyfinでポップアップを開く
  2. ティッカーリスト(例: AAPL,MSFT,NVDA)を入力
  3. 「一括ダウンロード」ボタンをクリック
  4. TSVファイルが ダウンロード/koyfin-data/ に自動保存

出力形式: {TICKER}_{YYYYMMDD}.tsv(Annual + Quarterly統合)

Step 2: SQLiteへのインポート(Pythonスクリプト)

TSVファイルをSQLiteデータベースにインポートします。

cd chrome-extension-koyfin/scraper

# ディレクトリ内の全TSVを一括インポート
uv run python import_tsv_dir.py ~/Downloads/koyfin-data

# または単一ファイル
uv run python tsv_to_sqlite.py ~/Downloads/koyfin-data/AAPL_20251214.tsv

SQLiteの場所: chrome-extension-koyfin/scraper/data/koyfin.db

保存されるセクション:

  • highlights(ハイライト)
  • income_statement(損益計算書)
  • balance_sheet(貸借対照表)
  • cash_flow(キャッシュフロー)
  • multiples(マルチプル)
  • enterprise_value(企業価値)
  • profitability(収益性)
  • roic(投下資本利益率)
  • solvency(支払能力)

Step 3: TypeScript composablesの生成(Node.jsスクリプト)

関連ドキュメント: Composable自動生成リファクタリング

SQLiteからTypeScriptのcomposableファイルを自動生成します。

cd apps/web
node scripts/generate-financial-data.mjs

入力: koyfin.db(SQLite) 出力: app/composables/financial-data.ts

生成されるデータ構造:

export const financialData: FinancialDataStore = {
  AAPL: {
    ticker: 'AAPL',
    name: 'Apple Inc.',
    periods: [
      {
        label: '2015',
        data: {
          bs: { ... },      // 貸借対照表
          pl: { ... },      // 損益計算書
          cashFlow: { ... }, // キャッシュフロー
          perShare: { ... }  // 1株あたり指標
        }
      },
      // ... 2016〜LTM
    ]
  },
  // ... 他の企業
}

Step 4: Vueページでの表示

生成されたcomposableをVueページでimportして使用します。

// pages/financial-quiz/proportional-animation-qqq.vue
import { financialData, getCompanyData } from '~/composables/financial-data'

const company = getCompanyData('AAPL')
const latestPeriod = company.periods.find(p => p.label === 'LTM')

クイックスタート

新しい企業のデータを追加する場合

# 1. Chrome拡張機能でTSVをダウンロード
#    → ダウンロード/koyfin-data/{TICKER}_{DATE}.tsv

# 2. SQLiteにインポート
cd chrome-extension-koyfin/scraper
uv run python import_tsv_dir.py ~/Downloads/koyfin-data

# 3. TypeScript composablesを再生成
cd apps/web
node scripts/generate-financial-data.mjs

# 4. 開発サーバーで確認
pnpm dev

データを更新する場合

既存企業のデータを最新化する場合も同じ手順です。SQLiteは企業・期間単位でUPSERTするため、既存データは上書きされます。


ファイル構成

mdx-playground/
├── chrome-extension-koyfin/           # Chrome拡張機能
│   ├── manifest.json
│   ├── content.js                     # データ取得ロジック
│   ├── background.js                  # ダウンロードAPI
│   └── scraper/
│       ├── schema.sql                 # SQLiteスキーマ
│       ├── tsv_to_sqlite.py           # TSV→SQLite変換
│       ├── import_tsv_dir.py          # 一括インポート
│       └── data/
│           └── koyfin.db              # SQLiteデータベース
│
└── apps/web/
    ├── scripts/
    │   └── generate-financial-data.mjs # SQLite→TypeScript変換
    ├── app/
    │   ├── types/
    │   │   └── financial.ts           # 型定義
    │   ├── composables/
    │   │   └── financial-data.ts      # 自動生成されたデータ
    │   └── pages/
    │       └── financial-quiz/
    │           └── proportional-animation-qqq.vue
    └── content/
        └── 2025-12-14/
            ├── financial-data-pipeline-overview.md  # このドキュメント
            └── koyfin-chrome-extension-sqlite-import.md

関連ドキュメント

ドキュメント説明
Koyfin Chrome拡張機能とSQLiteインポートStep 1-2の詳細実装
Composable自動生成リファクタリングStep 3の詳細実装、型定義、マッピングロジック

旧システムとの比較

旧: Gemini API経由

Koyfin → TSV(2ファイル) → Gemini API → TypeScript → アプリ
         ↓                   ↓
    Annual.tsv           毎回API呼び出し
    Quarterly.tsv         (コスト・時間)

問題点:

  • 毎回Gemini APIを呼ぶ必要(コスト・時間)
  • Annual/Quarterlyが別ファイルで管理が煩雑
  • 変換結果が非決定論的

新: SQLite経由

Koyfin → TSV(統合) → SQLite → TypeScript → アプリ
          ↓            ↓
    {TICKER}.tsv    決定論的パース
    (1ファイル)      無料・高速

メリット:

  • Gemini API不要(高速・無料)
  • 1企業1ファイルで管理が簡単
  • 決定論的なパース(再現性あり)
  • SQLクエリで柔軟なデータ取得

トラブルシューティング

Chrome拡張機能でダウンロードできない

  1. 拡張機能がKoyfinのドメインで有効になっているか確認
  2. ポップアップでティッカーリストが正しく入力されているか確認
  3. コンソールでエラーを確認

SQLiteインポートでエラー

# データベースをリセットして再インポート
rm scraper/data/koyfin.db
uv run python import_tsv_dir.py ~/Downloads/koyfin-data

TypeScript生成でエラー

# SQLiteに接続できるか確認
sqlite3 chrome-extension-koyfin/scraper/data/koyfin.db "SELECT ticker FROM companies;"

BSバランスが合わない

生成スクリプトには自動調整ロジックが組み込まれています。詳細は Composable自動生成リファクタリング の「貸借バランス調整ロジック」を参照。