pykrx get_market_ohlcv returns 6 data columns (시가/고가/저가/종가/거래량/거래대금),
not 7. The 등락률 (change) column does not exist, causing a length mismatch error.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The pykrx library uses 'etx' not 'etf' as the module directory name,
and fetch() is the proper method that returns a DataFrame.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
KRX CSV download endpoint blocks requests from cloud/server IPs,
causing "No columns to parse from file" errors. Replaced with pykrx's
JSON-based API (get_market_ticker_list, get_market_cap_by_ticker,
get_market_fundamental_by_ticker) which is more reliable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add ETFCollector (KRX master data) and ETFPriceCollector (pykrx OHLCV)
with corresponding admin API endpoints and frontend collection UI buttons.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace passlib with direct bcrypt usage to eliminate the
'module bcrypt has no attribute __about__' warning
- Change Query(regex=) to Query(pattern=) per FastAPI deprecation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Hash passwords with SHA-256 on frontend before transmission to prevent
raw password exposure in network traffic and server logs
- Switch login endpoint from OAuth2 form-data to JSON body
- Auto-create admin user on startup from ADMIN_USERNAME/ADMIN_PASSWORD
env vars, solving login failure after registration was disabled
- Update auth tests to match new SHA-256 + JSON login flow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Alpine's wget resolves localhost to IPv6 [::1] first, but Next.js
standalone listens on 0.0.0.0 (IPv4 only), causing connection refused.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The frontend container needs more time to initialize. Replace fixed
sleep with a retry loop that polls the container health status up to
30 times (150s max) before checking.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Install Docker CLI + Compose plugin in job container
- Remove rsync dependency (work directly from checkout workspace)
- Use --project-name for consistent compose project naming
- Use --env-file for compose variable substitution
- Use docker exec for health checks (job container can't reach host ports)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove nginx from docker-compose.prod.yml (NPM handles reverse proxy)
- Add Next.js rewrites to proxy /api/* to backend (backend fully hidden)
- Bind frontend to 127.0.0.1:3000 only (NPM proxies externally)
- Replace hardcoded localhost:8000 in history page with api client
- Make CORS origins configurable via environment variable
- Restrict CORS methods to GET/POST/PUT/DELETE
- Add Gitea Actions deploy workflow with secrets-based env management
- Add security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy)
- Add BACKEND_URL build arg to frontend Dockerfile for standalone builds
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Toast notifications with sonner
- Loading skeleton components
- Improved loading states
- 404 page
- Cleanup old components
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add StrategyCard component with icon, CAGR range, risk badge, and stock count
- Update strategy list page with improved cards and descriptions
- Redesign backtest page with split layout (form left, results right)
- Add summary cards for CAGR, MDD, Sharpe ratio, and total return
- Integrate charts for equity curve, drawdown, and yearly returns
- Add badge, select, and skeleton UI components
- Toggle between new backtest form and history view
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TradingView chart component with lightweight-charts v5 API
- PortfolioCard component with mini pie chart and return display
- Updated portfolio list with cards and empty state
- Portfolio detail with charts, tabs (holdings/transactions/analysis)
- Improved holdings table with progress bars for weight
- Added tabs component from shadcn
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Sparkline for summary cards
- AreaChart for asset trends
- DonutChart for sector allocation
- BarChart for portfolio comparison
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Portfolio pages updated with DashboardLayout and shadcn/ui Card components
- Strategy pages updated (multi-factor, quality, value-momentum)
- Backtest pages updated with consistent styling
- Admin data management page updated
- Login page improved with shadcn/ui Card, Input, Button, Label
- All pages now support dark mode via CSS variables
- Removed old Sidebar/Header imports, using unified DashboardLayout
- Added shadcn/ui input and label components
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Collapsible Sidebar with navigation
- Header with page titles and logout
- DashboardLayout with responsive design
- Updated dashboard page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>