--- id: "US-TRD-011" title: "Ver Estadisticas de Rendimiento" type: "User Story" status: "Done" priority: "Alta" epic: "OQI-003" story_points: 3 created_date: "2025-12-05" updated_date: "2026-01-04" --- # US-TRD-011: Ver Estadísticas de Rendimiento ## Metadata | Campo | Valor | |-------|-------| | **ID** | US-TRD-011 | | **Épica** | OQI-003 - Trading y Charts | | **Módulo** | trading | | **Prioridad** | P1 | | **Story Points** | 3 | | **Sprint** | Sprint 5 | | **Estado** | Pendiente | | **Asignado a** | Por asignar | --- ## Historia de Usuario **Como** trader practicante, **quiero** ver estadísticas detalladas de mi rendimiento (win rate, profit factor, drawdown, etc.), **para** evaluar objetivamente mi progreso y identificar áreas de mejora en mi trading. ## Descripción Detallada El usuario debe tener acceso a un dashboard de estadísticas que muestre métricas clave de rendimiento: win rate, profit factor, average win/loss, maximum drawdown, sharpe ratio, gráficos de equity curve, distribución de P&L, y análisis por símbolo y timeframe. ## Mockups/Wireframes ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ TRADING STATISTICS │ ├─────────────────────────────────────────────────────────────────────────┤ │ Period: [Last 30 days ▼] [Custom Range] │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Win Rate │ │ Profit │ │ Net P&L │ │ Total Trades│ │ │ │ │ │ Factor │ │ │ │ │ │ │ │ 62.5% │ │ 2.45 │ │ +$1,234.56 │ │ 45 │ │ │ │ ████░░ │ │ Excellent │ │ (+12.3%) │ │ 27W / 18L │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ EQUITY CURVE │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ $12,000 ┤ ████ │ │ │ │ $11,500 ┤ ████████ │ │ │ │ $11,000 ┤ ████████ │ │ │ │ $10,500 ┤ ████████ │ │ │ │ $10,000 ┤────────────────────████████ │ │ │ │ $9,500 ┤ ████████ │ │ │ │ └──────────────────────────────────────────────────────── │ │ │ │ Nov 5 Nov 15 Nov 25 Dec 5 │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────┐ ┌──────────────────────────────────┐ │ │ │ PERFORMANCE METRICS │ │ P&L DISTRIBUTION │ │ │ ├──────────────────────────┤ ├──────────────────────────────────┤ │ │ │ Average Win: $45.72 │ │ $200+ ░░░░░░ 3 │ │ │ │ Average Loss: -$25.38 │ │ $100 ████████████ 8 │ │ │ │ Largest Win: $150.00 │ │ $50 ████████████████ 12 │ │ │ │ Largest Loss: -$80.00 │ │ $0 ██████ 4 │ │ │ │ │ │ -$50 ████████ 6 │ │ │ │ Avg Duration: 4h 20m │ │ -$100 ████ 3 │ │ │ │ Max Drawdown: -$345.00 │ │ -$200 ░░░ 2 │ │ │ │ (-3.45%) │ │ │ │ │ │ │ └──────────────────────────────────┘ │ │ │ Sharpe Ratio: 1.85 │ │ │ │ Recovery Factor: 3.58 │ ┌──────────────────────────────────┐ │ │ └──────────────────────────┘ │ BY SYMBOL │ │ │ ├──────────────────────────────────┤ │ │ │ BTCUSDT 15 trades +$567.89 │ │ │ │ ETHUSDT 20 trades +$456.12 │ │ │ │ SOLUSDT 10 trades +$210.55 │ │ │ └──────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ ``` --- ## Criterios de Aceptación **Escenario 1: Ver dashboard de estadísticas** ```gherkin DADO que el usuario ha completado 45 trades CUANDO accede a "Statistics" ENTONCES se muestra dashboard con: - Win rate con barra de progreso - Profit factor con indicador - Net P&L con porcentaje - Total de trades (wins/losses) Y todos los valores corresponden al periodo seleccionado ``` **Escenario 2: Ver equity curve** ```gherkin DADO que el usuario selecciona "Last 30 days" CUANDO el dashboard carga ENTONCES se muestra gráfico de línea con equity curve Y el eje X muestra fechas Y el eje Y muestra balance Y el punto inicial es $10,000 Y el punto actual refleja el balance actual Y se resaltan periodos de drawdown en rojo ``` **Escenario 3: Ver métricas de performance** ```gherkin DADO que el usuario está en Statistics ENTONCES se muestran métricas calculadas: - Average Win: Promedio de trades ganadores - Average Loss: Promedio de trades perdedores - Largest Win: Mayor ganancia en un trade - Largest Loss: Mayor pérdida en un trade - Avg Duration: Duración promedio de trades - Max Drawdown: Mayor caída desde peak - Sharpe Ratio: Ratio riesgo/retorno - Recovery Factor: NetPnL / MaxDrawdown ``` **Escenario 4: Ver distribución de P&L** ```gherkin DADO que el usuario tiene trades con diferentes P&L CUANDO ve el histograma de distribución ENTONCES muestra barras agrupadas por rangos de P&L Y cada barra indica cantidad de trades en ese rango Y la altura de la barra es proporcional a la cantidad ``` **Escenario 5: Filtrar por periodo** ```gherkin DADO que el usuario está en Statistics CUANDO selecciona "Last 7 days" ENTONCES todas las métricas se recalculan Y el equity curve muestra solo últimos 7 días Y la distribución P&L se actualiza ``` **Escenario 6: Ver estadísticas por símbolo** ```gherkin DADO que el usuario tradea múltiples símbolos CUANDO ve la sección "By Symbol" ENTONCES muestra lista de símbolos con: - Cantidad de trades - P&L total del símbolo - Win rate del símbolo Y están ordenados por P&L descendente ``` ## Criterios Adicionales - [ ] Comparación con periodo anterior - [ ] Indicadores de mejora/empeoración con flechas - [ ] Exportar reporte en PDF - [ ] Gráficos de trades por día de semana - [ ] Análisis de mejor/peor hora del día --- ## Tareas Técnicas **Database:** - [ ] DB-TRD-017: Crear tabla trading.daily_snapshots (balance diario) - [ ] DB-TRD-018: Crear funciones de cálculo de métricas **Backend:** - [ ] BE-TRD-056: Crear endpoint GET /trading/paper/statistics - [ ] BE-TRD-057: Implementar StatisticsService.calculateMetrics() - [ ] BE-TRD-058: Implementar cálculo de win rate - [ ] BE-TRD-059: Implementar cálculo de profit factor - [ ] BE-TRD-060: Implementar cálculo de drawdown - [ ] BE-TRD-061: Implementar cálculo de Sharpe ratio - [ ] BE-TRD-062: Crear endpoint GET /trading/paper/statistics/equity-curve - [ ] BE-TRD-063: Implementar cálculo por símbolo **Frontend:** - [ ] FE-TRD-057: Crear componente StatisticsPanel.tsx - [ ] FE-TRD-058: Crear componente MetricCard.tsx - [ ] FE-TRD-059: Crear componente EquityCurveChart.tsx (Recharts) - [ ] FE-TRD-060: Crear componente PnLDistribution.tsx - [ ] FE-TRD-061: Crear componente SymbolBreakdown.tsx - [ ] FE-TRD-062: Implementar hook useStatistics - [ ] FE-TRD-063: Implementar selector de periodo **Tests:** - [ ] TEST-TRD-028: Test unitario cálculos de métricas - [ ] TEST-TRD-029: Test integración endpoint statistics - [ ] TEST-TRD-030: Test E2E dashboard completo --- ## Dependencias **Depende de:** - [ ] US-TRD-010: Ver historial - Estado: Pendiente (necesita datos de trades) **Bloquea:** - Ninguna --- ## Notas Técnicas **Endpoints involucrados:** | Método | Endpoint | Descripción | |--------|----------|-------------| | GET | /trading/paper/statistics | Métricas generales | | GET | /trading/paper/statistics/equity-curve | Datos equity curve | | GET | /trading/paper/statistics/by-symbol | Breakdown por símbolo | | GET | /trading/paper/statistics/distribution | Distribución P&L | **Entidades/Tablas:** ```sql CREATE TABLE trading.daily_snapshots ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES auth.users(id), date DATE NOT NULL, balance DECIMAL(20, 8) NOT NULL, equity DECIMAL(20, 8) NOT NULL, total_pnl DECIMAL(20, 8) NOT NULL, created_at TIMESTAMP DEFAULT NOW(), CONSTRAINT unique_user_date UNIQUE(user_id, date) ); CREATE INDEX idx_daily_snapshots_user_date ON trading.daily_snapshots(user_id, date DESC); ``` **Componentes UI:** - `StatisticsPanel`: Panel principal - `MetricCard`: Card de métrica individual - `EquityCurveChart`: Gráfico de equity - `PnLDistribution`: Histograma de P&L - `SymbolBreakdown`: Tabla por símbolo - `PeriodSelector`: Selector de periodo **Response (Statistics):** ```typescript { period: { from: "2025-11-05", to: "2025-12-05" }, overview: { totalTrades: 45, wins: 27, losses: 18, winRate: 60.0, profitFactor: 2.45, netPnl: 1234.56, netPnlPercentage: 12.35 }, performance: { averageWin: 45.72, averageLoss: -25.38, largestWin: 150.00, largestLoss: -80.00, averageDuration: 15600, // segundos maxDrawdown: -345.00, maxDrawdownPercentage: -3.45, sharpeRatio: 1.85, recoveryFactor: 3.58 }, bySymbol: [ { symbol: "BTCUSDT", trades: 15, wins: 10, losses: 5, winRate: 66.67, netPnl: 567.89 }, // ... más símbolos ] } ``` **Response (Equity Curve):** ```typescript { data: [ { date: "2025-11-05", balance: 10000.00, equity: 10000.00, drawdown: 0.00 }, { date: "2025-11-06", balance: 10050.00, equity: 10075.50, drawdown: 0.00 }, // ... más puntos ] } ``` **Response (Distribution):** ```typescript { ranges: [ { min: -200, max: -100, count: 2 }, { min: -100, max: -50, count: 3 }, { min: -50, max: 0, count: 6 }, { min: 0, max: 50, count: 4 }, { min: 50, max: 100, count: 12 }, { min: 100, max: 200, count: 8 }, { min: 200, max: Infinity, count: 3 } ] } ``` **Fórmulas de cálculo:** ```typescript // Win Rate const winRate = (wins / totalTrades) * 100; // Profit Factor const profitFactor = grossProfit / Math.abs(grossLoss); // Sharpe Ratio (anualizado) const returns = trades.map(t => t.pnlPercentage); const avgReturn = mean(returns); const stdDev = standardDeviation(returns); const sharpeRatio = (avgReturn / stdDev) * Math.sqrt(252); // 252 trading days // Maximum Drawdown let peak = initialBalance; let maxDD = 0; equityCurve.forEach(point => { if (point.equity > peak) peak = point.equity; const drawdown = peak - point.equity; if (drawdown > maxDD) maxDD = drawdown; }); const maxDrawdownPercentage = (maxDD / peak) * 100; // Recovery Factor const recoveryFactor = netPnl / Math.abs(maxDrawdown); // Average Duration (en segundos) const avgDuration = sum(trades.map(t => t.durationSeconds)) / totalTrades; ``` **Periodos disponibles:** - Last 7 days - Last 30 days - Last 90 days - Year to date - All time - Custom range --- ## Definition of Ready (DoR) - [x] Historia claramente escrita - [x] Criterios de aceptación definidos - [x] Story points estimados - [x] Dependencias identificadas - [x] Sin bloqueadores - [ ] Diseño/mockup disponible - [ ] API spec disponible ## Definition of Done (DoD) - [ ] Código implementado según criterios - [ ] Tests unitarios escritos y pasando - [ ] Tests de integración pasando - [ ] Code review aprobado - [ ] Documentación actualizada - [ ] QA aprobado - [ ] Desplegado en ambiente de pruebas --- ## Historial de Cambios | Fecha | Cambio | Autor | |-------|--------|-------| | 2025-12-05 | Creación | Requirements-Analyst | --- **Creada por:** Requirements-Analyst **Fecha:** 2025-12-05 **Última actualización:** 2025-12-05