- Create ThemeProvider component
- Apply ThemeProvider to root layout
- Enable system theme detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add tailwind.config.ts with shadcn/ui theme colors
- Update globals.css with CSS variables for dark/light mode
- Add utils.ts with cn() helper function
- Add components.json for shadcn/ui CLI
- Update postcss.config.mjs with autoprefixer
- Exclude playwright config from tsconfig to fix build
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Comprehensive redesign plan including:
- shadcn/ui + Lucide Icons + Recharts + TradingView charts
- Dark/light theme with system preference support
- Collapsible sidebar with responsive breakpoints
- Dashboard with charts and sparklines
- Portfolio pages with TradingView integration
- Strategy and backtest page improvements
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove unused login helper in portfolio.spec.ts
- Add eslint-disable for useEffect in history page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- APScheduler for daily snapshots (18:30 weekdays)
- ReturnsCalculator with CAGR, TWR, MDD, volatility
- Portfolio history page with snapshots and returns tabs
- FastAPI lifespan integration for scheduler
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Backtest list/create page with strategy-specific params
- Backtest result page with metrics, holdings, transactions
- Polling for async backtest status
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- POST /api/backtest (create and start)
- GET /api/backtest (list)
- GET /api/backtest/{id} (detail)
- GET /api/backtest/{id}/equity-curve
- GET /api/backtest/{id}/holdings
- GET /api/backtest/{id}/transactions
- DELETE /api/backtest/{id}
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- VirtualPortfolio for portfolio simulation
- BacktestEngine for strategy backtesting
- Worker for async background execution
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GET /api/market/stocks/{ticker}
- GET /api/market/stocks/{ticker}/prices
- GET /api/market/search
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- POST /api/strategy/multi-factor
- POST /api/strategy/quality
- POST /api/strategy/value-momentum
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BaseStrategy abstract class
- MultiFactorStrategy with weighted factors
- QualityStrategy with F-Score filtering
- ValueMomentumStrategy combining value and momentum
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add user-facing error state with red alert box for failed operations
- Improve error handling in fetchJobs and runCollector functions
- Add aria-labels to collector buttons for better accessibility
- Add scope="col" to table headers for proper semantic HTML
- Add refresh loading state with disabled button styling
- Create handleRefresh function for proper state management during refresh
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add frontend page for admin data collection management at /admin/data.
The page displays available collectors (stocks, sectors, prices, valuations)
with buttons to trigger collection jobs, and shows recent job history
with status, timing, record counts, and error information.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add Query parameter validation with regex patterns for date fields (YYYYMMDD format) and numeric constraints for limit parameter. Update JobLogResponse to use datetime types instead of strings for proper date serialization.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add time import and RATE_LIMIT_DELAY constant for rate limiting between HTTP requests
- Add 1-second delay after OTP request to respect API rate limits
- Validate OTP response is not empty before using it
- Add CSV column structure validation with required columns check
- Add data quality check to skip records where all metrics are None
- Improve error handling and data integrity
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add ValuationCollector class that fetches PER, PBR, and dividend yield
data from KRX for all listed stocks. Includes business day validation,
safe float conversion, and upsert logic for the valuations table.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Implement per-ticker commits to ensure atomic operations per data source
- Add rollback on exception to prevent partial data corruption
- Add _safe_float() and _safe_int() helper methods for defensive type conversion
- Validate column count after DataFrame reset to catch schema issues early
- Skip records with missing essential values (close price) with debug logging
- Remove final db.commit() since commits now happen per ticker in the loop
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add REQUEST_TIMEOUT and RATE_LIMIT_DELAY constants to StockCollector
- Add timeout parameter to all HTTP requests
- Wrap HTTP requests in try-except with proper error handling
- Add _validate_biz_day() method to both collectors
- Add validation for required fields (ticker, name) before insert
- Replace generic Exception with specific exception types in SectorCollector
- Add logging module and logger to both collectors
- Remove unused numpy import from StockCollector
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>