- Add pykrx-openapi dependency
- New krx_client.py wrapper module
- ETFCollector: Open API bulk fetch + pykrx fallback
- ETFPriceCollector: Open API date-based bulk + pykrx fallback
- StockCollector: Open API base_info + daily_trade + pykrx fallback
- PriceCollector: Open API date-based bulk + pykrx fallback
- ValuationCollector: pykrx retained (Open API has no PER/PBR)
- generate_snapshots.py: Open API + pykrx fallback
- Auto-switch based on KRX_OPENAPI_KEY env var
- All 278 tests passing
- New script: scripts/generate_snapshots.py
- Fetches actual ETF closing prices from KRX for each month-end
- Computes portfolio value from cumulative holdings at each date
- Generates 12 monthly snapshots (2025-04 ~ 2026-03)
- Added to CI/CD deploy pipeline
The seed script was incorrectly using the latest snapshot's market price
as avg_price, resulting in inflated average costs. Now computes avg_price
from actual total invested amounts per ticker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>