migration-tracker
旧Portfolio Buddyアプリからの移行作業を円滑に進めるため、移行中の機能や既知の問題点に関する情報を集約し、バグ修正や機能追加、コード理解を支援するSkill。
📜 元の英語説明(参考)
Context for ongoing migration from old Portfolio Buddy app. Use when: fixing bugs, adding migrated features, checking feature parity, or understanding why certain code exists. Contains list of 40 features being migrated and known issues.
🇯🇵 日本人クリエイター向け解説
旧Portfolio Buddyアプリからの移行作業を円滑に進めるため、移行中の機能や既知の問題点に関する情報を集約し、バグ修正や機能追加、コード理解を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o migration-tracker.zip https://jpskill.com/download/16750.zip && unzip -o migration-tracker.zip && rm migration-tracker.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/16750.zip -OutFile "$d\migration-tracker.zip"; Expand-Archive "$d\migration-tracker.zip" -DestinationPath $d -Force; ri "$d\migration-tracker.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
migration-tracker.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
migration-trackerフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Portfolio Buddy 2 - Migration Tracker
移行状況: 40 機能
✅ 完了 (36/40 - 90%)
移行済みで動作中のコア機能:
-
PapaParse を使用した CSV アップロードと解析
-
Supabase ストレージ統合
-
基本的なメトリクスの計算 (Sharpe, Max DD, CAGR, 勝率など)
-
ソルティノレシオ (完了したコミット 258ba3a, 9f25040)
-
リスクフリーレート入力 (完了したコミット 258ba3a)
-
資産相関行列 (Spearman & Pearson)
-
ポートフォリオ比較チャート (Chart.js)
-
エクイティカーブの可視化
-
Tailwind CSS によるレスポンシブ UI
-
shadcn/ui カラーシステム統合
-
日付範囲フィルタリング (完了したコミット 258ba3a)
-
先物の契約乗数 (useContractMultipliers hook)
-
高度な複数列ソート (useSorting hook)
-
エラー処理とバリデーション
-
ファイルアップロードの進捗状況の追跡
-
複数ファイルの管理
-
データベース統合 (2025年11月16日) - 本番環境対応 ✓
- Python スクリプトによる自動取引アップロード ✓
- 新しいデータベーススキーマ (portfolios, strategies, trades) ✓
- フロントエンドデータベースフェッチ ✓ (コミット c4fa57c から ee7cec8)
- CSV/データベースのデュアルサポート ✓
- フォーマットの自動検出 (1行 vs 2行) ✓
- ユーザーテストと検証済み ✓
- main にマージしてデプロイ済み ✓
- 参照:
dev-docs/supabase-migration-plan.md
🚧 進行中 (3/40)
- 高度なフィルタリング - 部分的な実装
- 日付フィルタリング完了 ✓
- シンボルフィルタリングが必要
- 戦略フィルタリングが必要
- エクスポート機能 - CSV エクスポートのみ
- Excel エクスポート保留
- PDF レポート保留
- 過去の比較 - バックエンド準備完了、UI 保留
- 複数の期間を比較するための UI が必要
❌ 未着手 (2/40)
- 複数期間分析 - 複雑、優先度低
- 異なる時間枠でのパフォーマンスを比較
- 大幅な UI 作業が必要
- リスクシナリオモデリング - 新しいバックエンドロジックが必要
- モンテカルロシミュレーション
- ストレステスト
最近完了した機能
データベースフェッチの実装 (2025年11月16日) ✅ 完了
ステータス: 本番環境対応 - テスト済みおよびデプロイ済み コミット: c4fa57c, a5ce0ec, 676de06, eba4c8d, ee7cec8, ae9202d main にマージ: d56497a (PR #1)
実装の道のり (6 コミット):
-
初期実装 (c4fa57c)
calculateMetricsFromDatabase()とbuildFilenameFromMetadata()を dataUtils.ts に追加- App.tsx で
fetchFromSupabase()を書き換え - 古い
csv_filesテーブルから新しいstrategies+tradesスキーマに変更 - TypeScript インターフェースを追加: DatabaseTrade, StrategyMetadata
-
クエリ構文の修正 (a5ce0ec)
- Supabase の order 句の構文エラーを修正
order('trades.trade_date')を foreignTable パラメータ付きのorder('trade_date')に変更- エラー: "failed to parse order (trades.trade_date.asc)"
-
取引数制限の修正 (676de06)
- Supabase の埋め込みリソース制限 (~60 行) を発見
- クエリを分離: まず戦略をフェッチし、次に取引を個別にフェッチ
- すべての取引を取得するために明示的な
.limit(10000)を追加 - 修正: 59 取引 → 119 取引 ✅
-
TypeScript ビルドエラーの修正 (eba4c8d)
- オプションの
trades?プロパティを持つ StrategyFromDB インターフェースを追加 - DatabaseTrade インターフェースを App.tsx に追加
- 修正: "Property 'trades' does not exist" エラー
- オプションの
-
メトリクス計算の修正 (ee7cec8) ⭐ 重大な修正
- フォーマットの自動検出: 2行 (Entry/Exit) vs 1行 (データベース)
- "Entry/Exit" 列を確認するように
calculateMetrics()を変更 - 存在する場合 → 2 ずつループ (古い CSV 形式)
- 存在しない場合 → 1 ずつループ (新しいデータベース形式)
- 修正: すべての 119 取引に対してメトリクスが正しく計算されるようになりました ✅
-
ドキュメントの更新 (ae9202d)
- 実装の詳細を migration-tracker スキルで更新
- すべての変更と行番号をドキュメント化
最終結果:
- ✅ データベースから 119 取引がロードされました (59 ではありません)
- ✅ すべてのメトリクスが正しく計算されました (勝率、プロフィットファクターなど)
- ✅ CSV アップロードの下位互換性が維持されました
- ✅ デュアルモードサポート: CSV とデータベースの両方が同時に動作します
- ✅ フォーマットの自動検出がシームレスに動作します
- ✅ ユーザーテストと動作確認済み
- ✅ 本番環境にデプロイ済み
変更されたファイル:
src/utils/dataUtils.ts: +235 行 (関数、インターフェース、自動検出)src/App.tsx: +145 行 (データベースフェッチ、TypeScript 型).claude/skills/migration-tracker/SKILL.md: ドキュメントの更新
仕組み:
- ユーザーが「Load Data」ボタンをクリック
- アプリが Supabase から戦略をフェッチ
- 各戦略について、すべての取引を個別にフェッチ (60 行の制限なし)
- メタデータからファイル名を構築 (例: SI_Long_Test_TestStrategy1.csv)
- 3 列の cleanedData 形式に変換 (Entry/Exit 列なし)
calculateMetrics()がフォーマットを自動検出し、正しく処理- データベースから契約乗数を事前に入力
- 戦略を自動選択し、メトリクス/チャートを表示
下位互換性:
- ✅ 4 列の CSV アップロード (Entry/Exit を含む) → 2 行処理
- ✅ 3 列のデータベース (Entry/Exit なし) → 1 行処理
- ✅ 両方の形式が同時に動作します
- ✅ 既存のすべてのコンポーネント、hook、チャートは変更されていません
データベース統合計画 (2025年11月16日)
ステータス: 計画完了、実装準備完了 変更点:
- 包括的な移行計画を作成 (
dev-docs/supabase-migration-plan.md) - 新しい Supabase データベーススキーマを分析 (portfolios, strategies, trades テーブル)
- デュアルモードサポートを設計 (CSV アップロード + データベースフェッチ)
- データ変換戦略を計画 (単一行取引 vs エントリー/イグジットペア)
新しいデータベーススキーマ:
portfolios: is_master フラグ付きのポートフォリオ定義strategies: 戦略メタデータ (市場、方向、contract_multiplier など)trades: 個々の取引レコード (trade_date, trade_time, profit)portfolio_strategies: ポートフォリオを戦略にリンク
実装計画:
- dataUtils.ts に
calculateMetricsFromDatabase()関数を追加 (~80 行) - App.tsx で
fetchFromSupabase()クエリを更新 (~60 行変更) - データベースデータを c
(原文がここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Portfolio Buddy 2 - Migration Tracker
Migration Status: 40 Features
✅ Completed (36/40 - 90%)
Core features migrated and working:
-
CSV upload and parsing with PapaParse
-
Supabase storage integration
-
Basic metrics calculation (Sharpe, Max DD, CAGR, Win Rate, etc.)
-
Sortino Ratio (completed commits 258ba3a, 9f25040)
-
Risk-free rate input (completed commit 258ba3a)
-
Asset correlation matrix (Spearman & Pearson)
-
Portfolio comparison charts (Chart.js)
-
Equity curve visualization
-
Responsive UI with Tailwind CSS
-
shadcn/ui color system integration
-
Date range filtering (completed commit 258ba3a)
-
Contract multipliers for futures (useContractMultipliers hook)
-
Advanced multi-column sorting (useSorting hook)
-
Error handling and validation
-
File upload progress tracking
-
Multiple file management
-
Database Integration (Nov 16, 2025) - PRODUCTION READY ✓
- Python script uploads trades automatically ✓
- New database schema (portfolios, strategies, trades) ✓
- Frontend database fetch ✓ (commits c4fa57c through ee7cec8)
- Dual CSV/Database support ✓
- Format auto-detection (1-row vs 2-row) ✓
- User tested and verified ✓
- Merged to main and deployed ✓
- See:
dev-docs/supabase-migration-plan.md
🚧 In Progress (3/40)
- Advanced filtering - Partial implementation
- Date filtering complete ✓
- Symbol filtering needed
- Strategy filtering needed
- Export functionality - CSV export only
- Excel export pending
- PDF reports pending
- Historical comparison - Backend ready, UI pending
- Need UI for comparing multiple time periods
❌ Not Started (2/40)
- Multi-period analysis - Complex, low priority
- Compare performance across different time windows
- Requires significant UI work
- Risk scenario modeling - Requires new backend logic
- Monte Carlo simulations
- Stress testing
Recent Completed Features
Database Fetch Implementation (Nov 16, 2025) ✅ COMPLETED
Status: Production ready - Tested and deployed Commits: c4fa57c, a5ce0ec, 676de06, eba4c8d, ee7cec8, ae9202d Merged to main: d56497a (PR #1)
Implementation Journey (6 commits):
-
Initial Implementation (c4fa57c)
- Added
calculateMetricsFromDatabase()andbuildFilenameFromMetadata()to dataUtils.ts - Rewrote
fetchFromSupabase()in App.tsx - Changed from old
csv_filestable to newstrategies+tradesschema - Added TypeScript interfaces: DatabaseTrade, StrategyMetadata
- Added
-
Fix Query Syntax (a5ce0ec)
- Fixed Supabase order clause syntax error
- Changed
order('trades.trade_date')toorder('trade_date')with foreignTable parameter - Error: "failed to parse order (trades.trade_date.asc)"
-
Fix Trade Count Limit (676de06)
- Discovered Supabase embedded resource limit (~60 rows)
- Separated queries: fetch strategies first, then fetch trades separately
- Added explicit
.limit(10000)to get all trades - Fixed: 59 trades → 119 trades ✅
-
Fix TypeScript Build Errors (eba4c8d)
- Added StrategyFromDB interface with optional
trades?property - Added DatabaseTrade interface to App.tsx
- Fixed: "Property 'trades' does not exist" errors
- Added StrategyFromDB interface with optional
-
Fix Metrics Calculation (ee7cec8) ⭐ CRITICAL FIX
- Auto-detect format: 2-row (Entry/Exit) vs 1-row (database)
- Modified
calculateMetrics()to check for "Entry/Exit" column - If present → loop by 2 (old CSV format)
- If absent → loop by 1 (new database format)
- Fixed: Metrics now calculated correctly for all 119 trades ✅
-
Update Documentation (ae9202d)
- Updated migration-tracker skill with implementation details
- Documented all changes and line numbers
Final Results:
- ✅ 119 trades loaded from database (not 59)
- ✅ All metrics calculated correctly (win rate, profit factor, etc.)
- ✅ CSV upload backward compatibility preserved
- ✅ Dual-mode support: both CSV and database work simultaneously
- ✅ Format auto-detection works seamlessly
- ✅ User tested and verified working
- ✅ Deployed to production
Files Modified:
src/utils/dataUtils.ts: +235 lines (functions, interfaces, auto-detection)src/App.tsx: +145 lines (database fetch, TypeScript types).claude/skills/migration-tracker/SKILL.md: Documentation updates
How It Works:
- User clicks "Load Data" button
- App fetches strategies from Supabase
- For each strategy, fetches ALL trades separately (no 60-row limit)
- Builds filename from metadata (e.g., SI_Long_Test_TestStrategy1.csv)
- Transforms to cleanedData format with 3 columns (no Entry/Exit column)
calculateMetrics()auto-detects format and processes correctly- Pre-populates contract multipliers from database
- Auto-selects strategies and displays metrics/charts
Backward Compatibility:
- ✅ CSV upload with 4 columns (includes Entry/Exit) → 2-row processing
- ✅ Database with 3 columns (no Entry/Exit) → 1-row processing
- ✅ Both formats work simultaneously
- ✅ All existing components, hooks, charts unchanged
Database Integration Planning (Nov 16, 2025)
Status: Planning complete, ready for implementation What Changed:
- Created comprehensive migration plan (
dev-docs/supabase-migration-plan.md) - Analyzed new Supabase database schema (portfolios, strategies, trades tables)
- Designed dual-mode support (CSV upload + database fetch)
- Planned data transformation strategy (single-row trades vs entry/exit pairs)
New Database Schema:
portfolios: Portfolio definitions with is_master flagstrategies: Strategy metadata (market, direction, contract_multiplier, etc.)trades: Individual trade records (trade_date, trade_time, profit)portfolio_strategies: Links portfolios to strategies
Implementation Plan:
- Add
calculateMetricsFromDatabase()function in dataUtils.ts (~80 lines) - Update
fetchFromSupabase()query in App.tsx (~60 lines changed) - Transform database data to match cleanedData format
- Pre-populate contract multipliers from database
- Test with 119 existing trades
Current State:
- Python script on Windows VPS uploads trades automatically ✓
- Database contains 1 strategy with 119 trades ✓
- Frontend still queries old
csv_filestable (needs update)
Next Steps:
- Implement Phase 1: New calculation function
- Implement Phase 2: Update Supabase query
- Test dual CSV/Database support
- Deploy to production
Strategy Delete Feature (Nov 19, 2025) ✅
Commit: c372ab7a92d267eda3e540b298872484ef09e38d Files: App.tsx (+47), MetricsTable.tsx (+18), PortfolioSection.tsx (+8)
What it does:
- Delete database strategies permanently (red trash icon with confirmation)
- Remove CSV strategies from view (gray trash icon, immediate)
- strategyIdMap tracks DB vs CSV (App.tsx line 67)
- handleDeleteStrategy with Supabase deletion (App.tsx lines 423-458)
- Trash2 icon in Actions column (MetricsTable.tsx lines 1, 239-246)
Git Forensic Recovery (Dec 2, 2025) ✅
Problem: Delete feature was "lost" (local repo behind origin/main)
Solution:
git fetch origin
git merge origin/main # Fast-forward to c372ab7
Key lesson: Always check git log origin/main when work seems missing
Sortino Ratio (Oct 2025)
Commits: 258ba3a, 9f25040 What Changed:
- Added risk-free rate input field in PortfolioSection (line 131:
useState<number>(0)) - Implemented inline Sortino calculation in PortfolioSection (lines 133-158)
- Fixed downside deviation calculation (now properly annualized using sqrt(365))
- Corrected variance calculation (divides by total returns, not just negative returns)
- Displays in portfolio stats section (line 535)
Files Modified:
PortfolioSection.tsx: Added riskFreeRate state, downside deviation calculation, and display
Implementation Details:
- NOT in dataUtils.ts - Sortino is calculated inline in PortfolioSection using
useMemo - NOT in MetricsTable - Only displayed in portfolio stats area
- Kept in component due to portfolio-level context requirements:
- Needs user input (risk-free rate)
- Operates on portfolio daily returns (not trade-level metrics)
- Different calculation scope than win rate, profit factor, etc.
Date Range Filtering (Oct 2025)
Commit: 258ba3a What Changed:
- usePortfolio hook now accepts date range params
- Filters trades by start/end date
- Recalculates metrics for filtered period only
- UI controls in PortfolioSection
Files Modified:
usePortfolio.ts: Added date filtering logicPortfolioSection.tsx: Added date picker controls
Enhanced Error Handling (Sept 2025)
Commit: 9fb7fdb What Changed:
- Better Supabase error messages
- Client validation before upload
- Error list component shows all errors
- Toast notifications for user feedback
Files Modified:
UploadSection.tsx: Enhanced error handlingErrorList.tsx: New component for error displayusePortfolio.ts: Better error propagation
Current Tech Debt
High Priority
-
PortfolioSection.tsx is 591 lines (3x the 200-line limit)
- Needs refactoring into:
EquityChartSection.tsxPortfolioStats.tsxContractControls.tsx
- Estimated effort: 4-6 hours
- Needs refactoring into:
-
Remove unused Recharts dependency (11.5KB waste)
- Currently using Chart.js
- Recharts never imported anywhere
- Run:
npm uninstall recharts
-
Fix 15 TypeScript
anyviolations- usePortfolio.ts: 11 instances
- useMetrics.ts: 4 instances
- dataUtils.ts: 1 instance
- Need proper interfaces for Trade and Metric types
Medium Priority
-
App.tsx is 351 lines (175% of limit)
- Extract sections into components
- Estimated effort: 2-3 hours
-
MetricsTable.tsx is 242 lines (121% of limit)
- Improved from 350 lines
- Still over limit, could extract more
-
No error boundaries implemented
- Should wrap risky components
- Prevents full app crashes
Low Priority
-
No testing setup
- Should test critical calculations
- Vitest recommended for Vite projects
-
No CI/CD pipeline
- Manual Cloudflare deployments
- Could automate with GitHub Actions
Known Issues
Issue 1: Supabase 500 Errors
Status: Partially fixed (commit 9fb7fdb) Root cause: Row limit exceeded on free tier Current workaround:
- Enhanced error handling shows user-friendly messages
- Batch uploads in smaller chunks recommended Long-term fix: Implement data aggregation before storage
Issue 2: Large Component Files
Status: Documented but not fixed Problem: Components grew during migration Affected:
- PortfolioSection.tsx: 591 lines (was 280, now worse!)
- App.tsx: 351 lines
- MetricsTable.tsx: 242 lines (improved from 350) Fix needed: Systematic refactoring into smaller components
Issue 3: No Select All Button
Status: Feature doesn't exist Note: Previous skill version documented a "Select All bug" but this feature was either removed or never implemented. MetricsTable has individual selection but no "Select All" functionality.
Issue 4: Lost/Missing Code
Status: Recoverable via git forensics Problem: Can't find recently added features or code seems to have disappeared Solution:
- Check remote:
git log origin/main --oneline -10 - Search commits:
git log --all --grep="keyword" - Fast-forward if behind:
git merge origin/main - Use reflog to see recent HEAD positions:
git reflogExample: On Dec 2, 2025, the delete feature was recovered by fast-forwarding from f4e752a to c372ab7
Migration Priorities (ICE Scored)
| Feature | Impact | Confidence | Ease | ICE Score | Status |
|---|---|---|---|---|---|
| Refactor PortfolioSection | 6 | 8 | 4 | 19.2 | ❌ |
| Remove Recharts | 3 | 10 | 10 | 30 | ❌ |
Fix TypeScript any |
5 | 9 | 6 | 27 | ❌ |
| Export to Excel | 8 | 8 | 7 | 44.8 | 🚧 |
| Advanced filters | 7 | 6 | 5 | 21 | 🚧 |
| Historical comparison UI | 6 | 7 | 4 | 16.8 | 🚧 |
| Error boundaries | 7 | 9 | 8 | 50.4 | ❌ |
| Testing setup | 6 | 8 | 5 | 24 | ❌ |
| Risk scenarios | 5 | 4 | 2 | 4 | ❌ |
Top Priorities by ICE Score:
- Error boundaries (50.4) - High impact, easy to implement
- Export to Excel (44.8) - User-requested feature
- Remove Recharts (30) - Quick win, technical cleanup
- Fix TypeScript violations (27) - Code quality
- Testing setup (24) - Long-term maintainability
What Changed from Old App
Tech Stack Evolution
| Component | Old App | New App | Reason |
|---|---|---|---|
| React | 16.x | 19.x | Latest features, better performance |
| Language | JavaScript | TypeScript | Type safety, better DX |
| Build Tool | Create React App | Vite | 10x faster builds, modern |
| Styling | Material-UI v4 | Tailwind + shadcn | More flexible, lighter |
| Charts | Recharts | Chart.js | Better performance, more features |
| State | Redux | Plain React hooks | Simpler, less boilerplate |
| Backend | Custom Node.js | Supabase | Faster development, PostgreSQL |
State Management Migration
- Old: Redux with actions, reducers, middleware (complex)
- New: Plain React hooks (useState, useMemo, useCallback)
- Result: 70% less boilerplate, easier to understand
Note: Skills previously claimed migration to TanStack Query + Zustand, but actual implementation uses plain React hooks only.
Why No Global State Library?
Portfolio Buddy 2 is simple enough to use React's built-in state:
- Small component tree (14 components)
- State rarely shared across distant components
- Custom hooks encapsulate shared logic effectively
- No complex async state management needed
Migration Lessons Learned
What Went Well
- Vite adoption - Build times dropped from 30s to 2s
- TypeScript migration - Caught many bugs early
- Chart.js over Recharts - Better performance with large datasets
- Simplified state - No Redux complexity
- Supabase integration - Fast backend setup
What Could Be Better
- Component size discipline - Let components grow too large
- TypeScript strictness - Too many
anyescapes - Testing from start - No tests written yet (tech debt)
- Code reviews - Need refactoring before more features
- Documentation - Should have updated skills continuously
Migration Velocity
- Weeks 1-4: Core features (upload, parsing, basic metrics)
- Weeks 5-8: Charts, correlation, UI polish
- Weeks 9-12: Advanced features (Sortino, date filtering, sorting)
- Current: Maintenance, refactoring, optimization
Next Steps
Immediate (This Sprint)
- Remove Recharts dependency
- Add error boundaries to risky components
- Fix highest-impact TypeScript
anyviolations
Short Term (Next 2 Sprints)
- Refactor PortfolioSection into smaller components
- Implement Excel export
- Complete symbol/strategy filtering
Long Term (Next Quarter)
- Set up Vitest testing framework
- Add CI/CD with GitHub Actions
- Multi-period analysis UI
- Risk scenario modeling
Feature Parity Checklist
Comparing to old Portfolio Buddy v1:
| Feature | Old App | New App | Notes |
|---|---|---|---|
| CSV Upload | ✅ | ✅ | Improved error handling |
| Sharpe Ratio | ✅ | ✅ | Same calculation |
| Sortino Ratio | ✅ | ✅ | Fixed calculation (9f25040) |
| Max Drawdown | ✅ | ✅ | Same calculation |
| CAGR | ✅ | ✅ | Same calculation |
| Correlation Matrix | ✅ | ✅ | Added Pearson + Spearman |
| Equity Curves | ✅ | ✅ | Better charts with zoom/pan |
| Contract Multipliers | ❌ | ✅ | New feature |
| Date Filtering | ❌ | ✅ | New feature |
| Multi-column Sort | ✅ | ✅ | Improved with useSorting |
| Export to CSV | ✅ | ✅ | Same functionality |
| Export to Excel | ✅ | ❌ | Regression - needs reimplementation |
| Export to PDF | ✅ | ❌ | Regression - low priority |
| Symbol Filtering | ✅ | ❌ | Regression - in progress |
| Historical Compare | ✅ | ❌ | Regression - backend ready |
Parity Status: 85% (11/13 core features complete)