trading-platform/docs/02-definicion-modulos/OQI-008-portfolio-manager/implementacion/TRACEABILITY.yml
Adrian Flores Cortes 618e3220bd [F1-F3] feat: Complete entity types, stores, and documentation
FASE 1 - DDL-Backend Coherence (continued):
- market-data.types.ts: Updated TickerRow, added Ohlcv5mRow, Ohlcv15mRow, OhlcvStagingRow
- llm.types.ts: Updated UserPreferences, UserMemory, Embedding + 3 Row types
- financial.types.ts: +6 types (Invoice, WalletAuditLog, etc.)
- entity.types.ts (trading): +5 types (Symbol, TradingBot, etc.)

FASE 2 - Backend-Frontend Coherence (continued):
- llmStore.ts: New Zustand store with session lifecycle management
- riskStore.ts: New Zustand store for risk assessment
- risk.service.ts: New service with 8 functions
- currency.service.ts: New service with 5 functions

FASE 3 - Documentation:
- OQI-007: Updated to 100% (7 ET, 11 US, 6 RF)
- OQI-008: Added ET-PFM-010-architecture.md, ET-PFM-011-goals-system.md
- Updated all _MAP.md and README.md indexes

Build validation: Backend tsc PASSED, Frontend Vite PASSED

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 22:39:10 -06:00

641 lines
21 KiB
YAML

# TRACEABILITY.yml - OQI-008 Portfolio Manager
# Mapeo de requerimientos a implementacion
version: "1.1.0"
epic: OQI-008
name: "Portfolio Manager Avanzado"
updated: "2026-01-28"
status: planned
# Resumen de trazabilidad
summary:
total_requirements: 7
total_specs: 11
total_user_stories: 14
total_files_to_implement: 55
test_coverage: "TBD"
story_points: 75
phase: 2
documentation_progress: "100%"
# Nuevas especificaciones agregadas 2026-01-28
new_specs:
- id: ET-PFM-010
name: "Arquitectura General del Sistema"
path: "../especificaciones/ET-PFM-010-architecture.md"
description: "Vision completa de arquitectura: capas, flujos de datos, integraciones"
added: "2026-01-28"
- id: ET-PFM-011
name: "Sistema de Goals Completo"
path: "../especificaciones/ET-PFM-011-goals-system.md"
description: "Sistema completo de metas: entities, Monte Carlo, proyecciones"
added: "2026-01-28"
# Mapeo de Requerimientos Funcionales
requirements:
RF-PFM-001:
name: "Dashboard de Portfolio"
status: planned
specs:
- ET-PFM-001
- ET-PFM-005
user_stories:
- US-PFM-001
- US-PFM-002
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/portfolio.service.ts
description: "Servicio principal de portfolio"
methods:
- getPortfolioSummary
- getPortfolioValue
- getPortfolioHistory
- getAssetAllocation
- getDiversificationScore
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- getSummary
- getValue
- getHistory
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "GET /portfolio/summary"
- "GET /portfolio/value"
- "GET /portfolio/history"
- "GET /portfolio/allocation"
frontend:
- path: apps/frontend/src/modules/portfolio/pages/Portfolio.tsx
description: "Página principal de portfolio"
- path: apps/frontend/src/modules/portfolio/components/PortfolioSummary.tsx
description: "Resumen de portfolio"
- path: apps/frontend/src/modules/portfolio/components/PortfolioChart.tsx
description: "Gráfico de valor histórico"
- path: apps/frontend/src/modules/portfolio/components/AllocationPie.tsx
description: "Pie chart de asignación"
- path: apps/frontend/src/modules/portfolio/components/NetWorthCard.tsx
description: "Tarjeta de patrimonio neto"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- portfolios
- portfolio_snapshots
- portfolio_settings
enums:
- portfolio_type_enum
tests:
- path: apps/backend/tests/portfolio/portfolio.service.test.ts
status: planned
RF-PFM-002:
name: "Gestión de Holdings"
status: planned
specs:
- ET-PFM-001
- ET-PFM-002
user_stories:
- US-PFM-003
- US-PFM-004
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/holding.service.ts
description: "Servicio de holdings"
methods:
- getHoldings
- getHoldingById
- addHolding
- updateHolding
- removeHolding
- getHoldingPerformance
- syncWithBroker
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- getHoldings
- addHolding
- updateHolding
- deleteHolding
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "GET /portfolio/holdings"
- "POST /portfolio/holdings"
- "PUT /portfolio/holdings/:id"
- "DELETE /portfolio/holdings/:id"
- "POST /portfolio/holdings/sync"
frontend:
- path: apps/frontend/src/modules/portfolio/components/HoldingsTable.tsx
description: "Tabla de holdings"
- path: apps/frontend/src/modules/portfolio/components/HoldingCard.tsx
description: "Tarjeta de holding"
- path: apps/frontend/src/modules/portfolio/components/AddHoldingModal.tsx
description: "Modal para agregar holding"
- path: apps/frontend/src/modules/portfolio/components/HoldingDetail.tsx
description: "Detalle de holding"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- holdings
- holding_transactions
- holding_lots
enums:
- holding_type_enum
- asset_class_enum
tests:
- path: apps/backend/tests/portfolio/holding.service.test.ts
status: planned
RF-PFM-003:
name: "Análisis de Rendimiento"
status: planned
specs:
- ET-PFM-003
- ET-PFM-004
user_stories:
- US-PFM-005
- US-PFM-006
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/performance.service.ts
description: "Servicio de análisis de rendimiento"
methods:
- calculateTWR
- calculateMWR
- calculateAlpha
- calculateBeta
- calculateSharpe
- calculateSortino
- compareWithBenchmark
- getAttributionAnalysis
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- getPerformance
- getBenchmarkComparison
- getAttribution
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "GET /portfolio/performance"
- "GET /portfolio/performance/metrics"
- "GET /portfolio/performance/benchmark"
- "GET /portfolio/performance/attribution"
frontend:
- path: apps/frontend/src/modules/portfolio/pages/Performance.tsx
description: "Página de rendimiento"
- path: apps/frontend/src/modules/portfolio/components/PerformanceMetrics.tsx
description: "Métricas de rendimiento"
- path: apps/frontend/src/modules/portfolio/components/BenchmarkComparison.tsx
description: "Comparación con benchmark"
- path: apps/frontend/src/modules/portfolio/components/ReturnChart.tsx
description: "Gráfico de retornos"
- path: apps/frontend/src/modules/portfolio/components/DrawdownChart.tsx
description: "Gráfico de drawdown"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- performance_metrics
- benchmark_data
- performance_attribution
tests:
- path: apps/backend/tests/portfolio/performance.service.test.ts
status: planned
RF-PFM-004:
name: "Análisis de Riesgo"
status: planned
specs:
- ET-PFM-003
- ET-PFM-004
user_stories:
- US-PFM-007
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/risk.service.ts
description: "Servicio de análisis de riesgo"
methods:
- calculateVaR
- calculateCVaR
- calculateVolatility
- calculateCorrelation
- stressTest
- getConcentrationRisk
- getSectorExposure
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- getRiskAnalysis
- getVaR
- runStressTest
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "GET /portfolio/risk"
- "GET /portfolio/risk/var"
- "POST /portfolio/risk/stress-test"
- "GET /portfolio/risk/concentration"
frontend:
- path: apps/frontend/src/modules/portfolio/pages/Risk.tsx
description: "Página de análisis de riesgo"
- path: apps/frontend/src/modules/portfolio/components/RiskMetrics.tsx
description: "Métricas de riesgo"
- path: apps/frontend/src/modules/portfolio/components/VaRChart.tsx
description: "Gráfico de VaR"
- path: apps/frontend/src/modules/portfolio/components/CorrelationMatrix.tsx
description: "Matriz de correlación"
- path: apps/frontend/src/modules/portfolio/components/StressTestResults.tsx
description: "Resultados de stress test"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- risk_metrics
- stress_test_results
- correlation_data
tests:
- path: apps/backend/tests/portfolio/risk.service.test.ts
status: planned
RF-PFM-005:
name: "Rebalanceo"
status: planned
specs:
- ET-PFM-002
- ET-PFM-006
user_stories:
- US-PFM-008
- US-PFM-009
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/rebalance.service.ts
description: "Servicio de rebalanceo"
methods:
- getTargetAllocation
- setTargetAllocation
- calculateRebalanceActions
- executeRebalance
- scheduleRebalance
- getRebalanceHistory
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- getRebalanceSuggestions
- setTargetAllocation
- executeRebalance
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "GET /portfolio/rebalance/suggestions"
- "POST /portfolio/rebalance/target"
- "POST /portfolio/rebalance/execute"
- "GET /portfolio/rebalance/history"
frontend:
- path: apps/frontend/src/modules/portfolio/pages/Rebalance.tsx
description: "Página de rebalanceo"
- path: apps/frontend/src/modules/portfolio/components/TargetAllocation.tsx
description: "Configurar asignación objetivo"
- path: apps/frontend/src/modules/portfolio/components/RebalancePreview.tsx
description: "Preview de acciones de rebalanceo"
- path: apps/frontend/src/modules/portfolio/components/AllocationSliders.tsx
description: "Sliders de asignación"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- target_allocations
- rebalance_actions
- rebalance_history
tests:
- path: apps/backend/tests/portfolio/rebalance.service.test.ts
status: planned
RF-PFM-006:
name: "Reportes"
status: planned
specs:
- ET-PFM-005
- ET-PFM-007
user_stories:
- US-PFM-010
- US-PFM-011
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/report.service.ts
description: "Servicio de reportes"
methods:
- generateReport
- getReports
- downloadReport
- scheduleReport
- sendReportEmail
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- generateReport
- getReports
- downloadReport
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "POST /portfolio/reports"
- "GET /portfolio/reports"
- "GET /portfolio/reports/:id/download"
frontend:
- path: apps/frontend/src/modules/portfolio/pages/Reports.tsx
description: "Página de reportes"
- path: apps/frontend/src/modules/portfolio/components/ReportGenerator.tsx
description: "Generador de reportes"
- path: apps/frontend/src/modules/portfolio/components/ReportPreview.tsx
description: "Preview de reporte"
- path: apps/frontend/src/modules/portfolio/components/ReportList.tsx
description: "Lista de reportes"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- reports
- report_templates
- scheduled_reports
enums:
- report_type_enum
- report_frequency_enum
tests:
- path: apps/backend/tests/portfolio/report.service.test.ts
status: planned
RF-PFM-007:
name: "Objetivos Financieros"
status: planned
specs:
- ET-PFM-006
user_stories:
- US-PFM-012
implementation:
backend:
- path: apps/backend/src/modules/portfolio/services/goal.service.ts
description: "Servicio de objetivos"
methods:
- createGoal
- updateGoal
- deleteGoal
- getGoals
- calculateProgress
- projectCompletion
- suggestContributions
- path: apps/backend/src/modules/portfolio/controllers/portfolio.controller.ts
methods:
- createGoal
- getGoals
- updateGoal
- deleteGoal
- path: apps/backend/src/modules/portfolio/portfolio.routes.ts
routes:
- "GET /portfolio/goals"
- "POST /portfolio/goals"
- "PUT /portfolio/goals/:id"
- "DELETE /portfolio/goals/:id"
- "GET /portfolio/goals/:id/progress"
frontend:
- path: apps/frontend/src/modules/portfolio/pages/Goals.tsx
description: "Página de objetivos"
- path: apps/frontend/src/modules/portfolio/components/GoalCard.tsx
description: "Tarjeta de objetivo"
- path: apps/frontend/src/modules/portfolio/components/GoalProgress.tsx
description: "Progreso del objetivo"
- path: apps/frontend/src/modules/portfolio/components/GoalCreator.tsx
description: "Creador de objetivos"
- path: apps/frontend/src/modules/portfolio/components/ProjectionChart.tsx
description: "Gráfico de proyección"
database:
- path: apps/database/schemas/08_portfolio_schema.sql
tables:
- financial_goals
- goal_contributions
- goal_projections
enums:
- goal_type_enum
- goal_priority_enum
tests:
- path: apps/backend/tests/portfolio/goal.service.test.ts
status: planned
# Métricas de portfolio
portfolio_metrics:
return_metrics:
- TWR (Time-Weighted Return)
- MWR (Money-Weighted Return)
- CAGR
- YTD Return
- Annualized Return
risk_metrics:
- Standard Deviation
- Sharpe Ratio
- Sortino Ratio
- Max Drawdown
- VaR (95%, 99%)
- CVaR / Expected Shortfall
- Beta
- Tracking Error
advanced_metrics:
- Alpha
- Information Ratio
- Treynor Ratio
- Calmar Ratio
- Ulcer Index
# Benchmarks soportados
benchmarks:
- code: SPY
name: "S&P 500"
asset_class: equity
- code: QQQ
name: "NASDAQ 100"
asset_class: equity
- code: IWM
name: "Russell 2000"
asset_class: equity
- code: AGG
name: "US Aggregate Bond"
asset_class: fixed_income
- code: BTC
name: "Bitcoin"
asset_class: crypto
- code: CUSTOM
name: "Custom Benchmark"
asset_class: mixed
# Mapeo de archivos de configuración
config_files:
backend:
- path: apps/backend/src/modules/portfolio/portfolio.module.ts
description: "Módulo de portfolio"
- path: apps/backend/src/modules/portfolio/types/portfolio.types.ts
description: "Tipos TypeScript"
- path: apps/backend/src/modules/portfolio/validators/portfolio.validators.ts
description: "Validadores Zod"
- path: apps/backend/src/modules/portfolio/cron/portfolio.cron.ts
description: "Jobs programados"
frontend:
- path: apps/frontend/src/modules/portfolio/stores/portfolio.store.ts
description: "Store de portfolio Zustand"
- path: apps/frontend/src/modules/portfolio/hooks/usePortfolio.ts
description: "Hook principal de portfolio"
- path: apps/frontend/src/modules/portfolio/services/portfolio.api.ts
description: "Cliente API de portfolio"
# Dependencias externas
external_dependencies:
npm_backend:
- name: mathjs
version: "^12.0.0"
usage: "Cálculos financieros"
- name: simple-statistics
version: "^7.8.0"
usage: "Estadísticas"
- name: pdfkit
version: "^0.14.0"
usage: "Generación de reportes PDF"
- name: node-cron
version: "^3.0.0"
usage: "Jobs programados"
npm_frontend:
- name: recharts
version: "^2.10.0"
usage: "Gráficos"
- name: "@tanstack/react-table"
version: "^8.10.0"
usage: "Tablas de datos"
- name: react-grid-layout
version: "^1.4.0"
usage: "Dashboard customizable"
# APIs de terceros
third_party_apis:
- name: Alpaca Markets
docs: https://alpaca.markets/docs
usage:
- Posiciones reales (opcional)
- Sincronización de cuenta
- name: Yahoo Finance
docs: https://finance.yahoo.com
usage:
- Datos históricos de benchmark
- Precios de activos
- name: Alpha Vantage
docs: https://www.alphavantage.co/documentation/
usage:
- Datos fundamentales
- Información de sectores
# Endpoints API
api_endpoints:
base_path: /api/v1/portfolio
endpoints:
# Dashboard
- method: GET
path: /summary
requirement: RF-PFM-001
auth: true
- method: GET
path: /value
requirement: RF-PFM-001
auth: true
- method: GET
path: /history
requirement: RF-PFM-001
auth: true
- method: GET
path: /allocation
requirement: RF-PFM-001
auth: true
# Holdings
- method: GET
path: /holdings
requirement: RF-PFM-002
auth: true
- method: POST
path: /holdings
requirement: RF-PFM-002
auth: true
- method: PUT
path: /holdings/:id
requirement: RF-PFM-002
auth: true
- method: DELETE
path: /holdings/:id
requirement: RF-PFM-002
auth: true
# Performance
- method: GET
path: /performance
requirement: RF-PFM-003
auth: true
- method: GET
path: /performance/benchmark
requirement: RF-PFM-003
auth: true
# Risk
- method: GET
path: /risk
requirement: RF-PFM-004
auth: true
- method: GET
path: /risk/var
requirement: RF-PFM-004
auth: true
- method: POST
path: /risk/stress-test
requirement: RF-PFM-004
auth: true
# Rebalance
- method: GET
path: /rebalance/suggestions
requirement: RF-PFM-005
auth: true
- method: POST
path: /rebalance/target
requirement: RF-PFM-005
auth: true
- method: POST
path: /rebalance/execute
requirement: RF-PFM-005
auth: true
# Reports
- method: POST
path: /reports
requirement: RF-PFM-006
auth: true
- method: GET
path: /reports
requirement: RF-PFM-006
auth: true
- method: GET
path: /reports/:id/download
requirement: RF-PFM-006
auth: true
# Goals
- method: GET
path: /goals
requirement: RF-PFM-007
auth: true
- method: POST
path: /goals
requirement: RF-PFM-007
auth: true
- method: PUT
path: /goals/:id
requirement: RF-PFM-007
auth: true
- method: DELETE
path: /goals/:id
requirement: RF-PFM-007
auth: true
# Dependencias de épicas
dependencies:
blocks: []
blocked_by:
- epic: OQI-001
reason: "Requiere autenticación"
- epic: OQI-003
reason: "Usa datos de trading para holdings"
- epic: OQI-004
reason: "Integra cuentas de inversión"
# Notas y decisiones
notes:
- "TWR como métrica principal de rendimiento"
- "Snapshots diarios automáticos del portfolio"
- "VaR calculado con método histórico (252 días)"
- "Rebalanceo manual con preview de acciones"
- "Reportes mensuales automáticos opcionales"
- "Soporte para holdings manuales y sincronizados"
- "Dashboard customizable con drag-and-drop"
- "Proyecciones Monte Carlo para objetivos"