開発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から財務データを自動取得します。
使い方:
- Koyfinでポップアップを開く
- ティッカーリスト(例:
AAPL,MSFT,NVDA)を入力 - 「一括ダウンロード」ボタンをクリック
- 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拡張機能でダウンロードできない
- 拡張機能がKoyfinのドメインで有効になっているか確認
- ポップアップでティッカーリストが正しく入力されているか確認
- コンソールでエラーを確認
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自動生成リファクタリング の「貸借バランス調整ロジック」を参照。