Backtesting Flow Diagrams

Agencio Predict - Algorithm Builder & Trading System Architecture

Complete UX/UI Flows + System Diagnostics

User Experience (UX/UI)

1. Complete User Journey

End-to-end user journey from algorithm creation through backtesting to results analysis. Shows all user touchpoints and decision points.

journey title Backtesting User Journey section Create Algorithm Navigate to /admin/algorithms: 5: User Click "New Algorithm": 5: User Choose creation method: 4: User Write DSL or use "From English": 4: User Save algorithm: 5: User section Configure Backtest Click "Backtest" button: 5: User Select lookback period: 5: User Choose data source: 4: User Optionally tune risk params: 3: User Click "Run backtest": 5: User section Wait for Results See loading spinner: 3: User Monitor progress: 3: User section Analyze Results View equity curve: 5: User Check metrics grid: 5: User Examine drawdown chart: 4: User Review trades table: 4: User Check guardrail kills: 4: User Analyze factor attribution: 3: User section Next Steps Modify algorithm: 4: User Start paper trading: 5: User Export results: 3: User

UX Considerations

  • Progressive disclosure: Advanced options (tuning, datasets) are collapsed by default
  • Loading state: Spinner + disabled button during backtest execution
  • Error visibility: Red alert with clear error message on failure
  • Results accessibility: Collapsible sections for long trade tables

2. UI Component Hierarchy

React component tree for the algorithms page and BacktestModal.

flowchart TB subgraph Page["AlgorithmsPage"] Header["Page Header"] Tabs["Tabs: Algorithms | Datasets"] subgraph AlgoTab["Algorithms Tab"] AlgoList["Algorithm Cards Grid"] AlgoCard["AlgorithmCard"] Actions["Action Buttons"] end subgraph Modals["Modal Components"] BM["BacktestModal"] TM["TranslateModal"] CM["CritiqueModal"] AM["AuditModal"] MM["ModificationsModal"] end end subgraph BacktestModal["BacktestModal Structure"] Controls["Control Bar"] LookbackSelect["Lookback Selector
90/180/365/730 days"] DatasetSelect["Dataset Selector"] TuneButton["Tune Button"] RunButton["Run Button"] TunePanel["Risk Tuning Panel"] TuneFields["5 Tunable Fields"] Results["Results Section"] MetricsGrid["Metrics Grid (12 stats)"] FactorPanel["Factor Attribution"] EquityChart["Equity Curve (Recharts)"] DDChart["Drawdown Chart (Recharts)"] KillsTable["Guardrail Kills"] TradesTable["Trades Details"] end AlgoCard --> Actions Actions -->|"Click Backtest"| BM BM --> Controls Controls --> LookbackSelect Controls --> DatasetSelect Controls --> TuneButton Controls --> RunButton TuneButton -->|"Toggle"| TunePanel TunePanel --> TuneFields RunButton -->|"Success"| Results Results --> MetricsGrid Results --> FactorPanel Results --> EquityChart Results --> DDChart Results --> KillsTable Results --> TradesTable style Page fill:#1e3a5f,stroke:#3b82f6 style BacktestModal fill:#1e3a2f,stroke:#10b981

Component Responsibilities

  • BacktestModal: 663 lines (page.tsx:2097-2759)
  • Stat: Reusable metric display component
  • TuningField: Number input with label
  • ResponsiveContainer: Recharts wrapper with minHeight

3. UI State Machine

React state transitions within BacktestModal component.

stateDiagram-v2 [*] --> Idle: Modal opens state Idle { [*] --> ConfigReady ConfigReady --> DatasetsLoading: Fetch datasets DatasetsLoading --> ConfigReady: Datasets loaded ConfigReady --> TuningOpen: Click "Tune" TuningOpen --> ConfigReady: Click "Tune" again } Idle --> Running: Click "Run backtest" state Running { [*] --> Fetching Fetching --> Processing: Request sent Note right of Processing: setRunning(true)
Button disabled } Running --> Success: API returns 200 Running --> Error: API returns error state Success { [*] --> DisplayResults DisplayResults --> ComputeDrawdown: useMemo ComputeDrawdown --> RenderCharts RenderCharts --> ShowMetrics } state Error { [*] --> ShowError Note right of ShowError: Red alert box
XCircle icon } Success --> Idle: User modifies config Error --> Idle: User modifies config Success --> [*]: Close modal Error --> [*]: Close modal

State Variables

  • running: Boolean - controls loading state
  • result: BacktestResponse | null - API response
  • error: string | null - error message
  • showTuning: Boolean - tuning panel visibility
  • overrides: Record - risk parameter overrides

4. Chart Rendering Flow

How backtest results are transformed into Recharts visualizations.

flowchart TB subgraph API["API Response"] EC["equityCurve[]
{date, equity, dailyReturn}"] end subgraph Transform["Data Transformation"] Memo["useMemo hook"] Peak["Track peak equity"] Calc["Calculate drawdown %"] DD["drawdownSeries[]
{date, drawdown}"] end subgraph Charts["Recharts Rendering"] subgraph EquityChart["Equity Curve"] RC1["ResponsiveContainer
minHeight=180"] LC["LineChart"] CG1["CartesianGrid"] XA1["XAxis dataKey=date"] YA1["YAxis domain=auto"] TT1["Tooltip"] Line["Line dataKey=equity
stroke=#3b82f6"] end subgraph DrawdownChart["Drawdown Chart"] RC2["ResponsiveContainer
minHeight=120"] AC["AreaChart"] CG2["CartesianGrid"] XA2["XAxis dataKey=date"] YA2["YAxis tickFormatter=%"] TT2["Tooltip"] Area["Area dataKey=drawdown
stroke=#ef4444"] end end EC --> Memo Memo --> Peak Peak --> Calc Calc --> DD EC --> RC1 RC1 --> LC LC --> CG1 LC --> XA1 LC --> YA1 LC --> TT1 LC --> Line DD --> RC2 RC2 --> AC AC --> CG2 AC --> XA2 AC --> YA2 AC --> TT2 AC --> Area style API fill:#1e3a5f,stroke:#3b82f6 style Transform fill:#3a2f1e,stroke:#f59e0b style Charts fill:#1e3a2f,stroke:#10b981

Chart Configuration

  • Equity Curve: Blue line (#3b82f6), 180px height, no dots
  • Drawdown: Red area (#ef4444), 120px height, 30% opacity fill
  • minHeight: Prevents Recharts width(-1) height(-1) warning
  • Responsive: width="100%" adapts to container

System Architecture

5. System Overview

High-level architecture showing how the backtesting system integrates with the broader platform.

flowchart TB subgraph Frontend["Frontend (Next.js App)"] UI["/admin/algorithms Page"] BM["BacktestModal Component"] Charts["Recharts Visualization"] end subgraph API["API Layer"] Route["Route Handler
/api/predict/v1/algorithms/[id]/backtest"] Handler["handleBacktestAlgorithm()"] end subgraph Engine["Backtest Engine"] BE["runAlgorithmBacktest()"] DSL["DSL Evaluator"] IND["Indicator Bundle
(40+ primitives)"] Metrics["Metrics Calculator
(13+ metrics)"] end subgraph Data["Data Sources"] DS["Imported Datasets
(S3/Local)"] Live["Live Price Service
(Yahoo/CoinGecko/Finnhub)"] Bond["Bond Overlays
(FRED/Treasury)"] Market["Market Benchmark
(SPY)"] end subgraph Storage["Persistence"] DB[(PostgreSQL)] Runs["algorithm_runs"] Trades["algorithm_trades"] end UI --> BM BM -->|"POST /backtest"| Route Route --> Handler Handler --> BE BE --> DSL BE --> IND BE --> Metrics BE -->|"datasetId?"| DS BE -->|"live data"| Live BE --> Bond BE --> Market Handler --> Runs Handler --> Trades Handler -->|"JSON Response"| BM BM --> Charts style Frontend fill:#1e3a5f,stroke:#3b82f6 style Engine fill:#1e3a2f,stroke:#10b981 style Data fill:#3a2f1e,stroke:#f59e0b style Storage fill:#3a1e2f,stroke:#ef4444

6. Backtest Engine Data Flow

Internal data flow within runAlgorithmBacktest().

flowchart TB subgraph Input["Input Resolution"] AST["Strategy AST"] Opts["BacktestOptions"] DS{"datasetId
provided?"} Access["canAccessDataset()"] LoadDS["loadImportedBars()"] LoadLive["getHistoricalPrices()"] end subgraph Prefetch["Data Prefetching"] Bond["prefetchBondBundle()"] SPY["Fetch SPY for beta/alpha"] Paired["Extract paired symbols"] end subgraph Loop["Bar-by-Bar Loop"] direction TB Bar["For each bar idx = 0..N"] Ctx["Build EvalContext
(no look-ahead)"] Ind["Compute IndicatorBundle"] Signals["Resolve signal groups"] Entry{"Entry?"} Exit{"Exit?"} Trade["Execute trade
+ Almgren-Chriss slippage"] Update["Update equity"] Guard["Check L1 guardrails"] end subgraph Output["Output Generation"] CalcMetrics["calculateBacktestMetrics()"] Enhanced["calculateEnhancedMetrics()"] Result["AlgorithmBacktestResult"] end AST --> DS Opts --> DS DS -->|Yes| Access Access -->|Allowed| LoadDS DS -->|No| LoadLive LoadDS --> Bond LoadLive --> Bond Bond --> SPY SPY --> Paired Paired --> Bar Bar --> Ctx Ctx --> Ind Ind --> Signals Signals --> Entry Entry -->|Yes| Trade Entry -->|No| Exit Exit -->|Yes| Trade Trade --> Update Update --> Guard Guard --> Bar Bar -->|Done| CalcMetrics CalcMetrics --> Enhanced Enhanced --> Result style Input fill:#1e3a5f,stroke:#3b82f6 style Loop fill:#1e3a2f,stroke:#10b981

7. API Routes & Handlers

Complete map of backtest-related API endpoints.

flowchart LR subgraph Routes["API Routes"] R1["POST /algorithms/{id}/backtest"] R2["POST /algorithms/{id}/walk-forward"] R3["POST /algorithms/{id}/monte-carlo"] R4["POST /algorithms/{id}/stress-test"] R5["POST /algorithms/{id}/portfolio-backtest"] R6["GET /algorithms/backtest-jobs"] R7["GET /algorithms/backtest-jobs/{jobId}"] end subgraph Handlers["Handler Functions"] H1["handleBacktestAlgorithm()"] H2["handleWalkForwardBacktest()"] H3["handleMonteCarloBacktest()"] H4["handleStressTestAlgorithm()"] H5["handlePortfolioBacktest()"] H6["handleListBacktestJobs()"] H7["handleGetBacktestJob()"] end subgraph Engine["Engine Functions"] E1["runAlgorithmBacktest()"] E2["runWalkForwardBacktest()"] E3["runMonteCarloSimulation()"] E4["runRegimeStress()"] E5["runPortfolioBacktest()"] end R1 --> H1 --> E1 R2 --> H2 --> E2 R3 --> H3 --> E3 R4 --> H4 --> E4 R5 --> H5 --> E5 R6 --> H6 R7 --> H7 E2 -.->|"uses"| E1 E3 -.->|"uses"| E1 E4 -.->|"uses"| E1 style Routes fill:#1e3a5f,stroke:#3b82f6 style Handlers fill:#3a2f1e,stroke:#f59e0b style Engine fill:#1e3a2f,stroke:#10b981

8. Metrics Calculation Pipeline

From raw equity curve to 13+ metrics plus enhanced analysis.

flowchart TB subgraph Input["Raw Data"] EC["equityCurve[]"] TR["trades[]"] Bars["OHLCV bars[]"] end subgraph Core["Core Metrics (13)"] DR["calculateDailyReturns()"] TR_calc["calculateTotalReturn()"] AR["calculateAnnualizedReturn()"] Vol["calculateVolatility()"] SR["calculateSharpeRatio()"] So["calculateSortinoRatio()"] Cal["calculateCalmarRatio()"] DD["calculateMaxDrawdown()"] TS["calculateTradeStatistics()"] end subgraph Enhanced["Enhanced Metrics"] Tail["Tail Risk: VaR, CVaR"] DDE["Drawdown Events"] Streak["Win/Loss Streaks"] Month["Monthly Returns"] DOW["Day-of-Week"] Dist["Distribution"] Factor["Factor Attribution"] end EC --> DR --> TR_calc --> AR DR --> Vol --> SR Vol --> So AR --> Cal EC --> DD --> Cal TR --> TS DR --> Tail EC --> DDE TR --> Streak DR --> Month DR --> DOW DR --> Dist Bars --> Factor style Input fill:#1e3a5f,stroke:#3b82f6 style Core fill:#1e3a2f,stroke:#10b981 style Enhanced fill:#3a2f1e,stroke:#f59e0b

System Diagnostics

9. Error Handling Flow

How errors propagate from backend to frontend and are displayed to users.

flowchart TB subgraph Backend["Backend Error Sources"] Auth["Auth Error
requireAuth()"] NotFound["Not Found
Algorithm missing"] Access["Access Denied
Dataset not owned"] Data["Data Error
Insufficient bars"] Engine["Engine Error
Backtest failure"] end subgraph Handler["Handler Layer"] Catch["try/catch block"] Errors["Errors.X() factory"] Handle["handleError(e)"] Response["NextResponse.json()
status: 4xx/5xx"] end subgraph Frontend["Frontend Error Handling"] Fetch["apiFetch()"] Check["if (!r.ok)"] Extract["data?.error?.message"] SetError["setError(message)"] Display["Red alert box
XCircle icon"] end Auth --> Catch NotFound --> Catch Access --> Catch Data --> Catch Engine --> Catch Catch --> Errors Errors --> Handle Handle --> Response Response --> Fetch Fetch --> Check Check -->|"Error"| Extract Extract --> SetError SetError --> Display style Backend fill:#3a1e2f,stroke:#ef4444 style Handler fill:#3a2f1e,stroke:#f59e0b style Frontend fill:#1e3a5f,stroke:#3b82f6

Error Types

  • Errors.unauthorized() - 401, missing/invalid auth
  • Errors.notFound() - 404, algorithm not found
  • Errors.forbidden() - 403, dataset access denied
  • Errors.validation() - 400, backtest engine failure

10. Data Validation Pipeline

Multi-layer validation from API input to DSL evaluation.

flowchart TB subgraph Input["Input Validation"] Query["Query params
days, symbol, assetClass"] Body["Request body
risk, datasetId"] Parse["JSON.parse()"] TypeCheck["Type narrowing
typeof === 'number'"] end subgraph Auth["Authorization"] User["requireAuth(request)"] Owner["getAlgorithm(userId, id)"] Dataset["canAccessDataset()"] end subgraph Engine["Engine Validation"] Bars["bars.length >= 30"] AST["AST structure"] Risk["Risk params in range"] Symbol["Symbol exists"] end subgraph DSL["DSL Evaluation"] NoEval["No eval()"] NoLookAhead["No look-ahead
asOf frozen"] Whitelist["Primitive whitelist"] Zod["Zod schema (LLM output)"] end Query --> Parse Body --> Parse Parse --> TypeCheck TypeCheck --> User User --> Owner Owner --> Dataset Dataset --> Bars Bars --> AST AST --> Risk Risk --> Symbol Symbol --> NoEval NoEval --> NoLookAhead NoLookAhead --> Whitelist Whitelist --> Zod style Input fill:#1e3a5f,stroke:#3b82f6 style Auth fill:#3a2f1e,stroke:#f59e0b style Engine fill:#1e3a2f,stroke:#10b981 style DSL fill:#3a1e3a,stroke:#a855f7

Validation Rules

  • Minimum bars: 30 required for any backtest
  • Warmup period: 100 bars before window start
  • Dataset access: User must own or be subscribed
  • Leverage limits: 1-125x depending on asset class

11. Logging & Monitoring

Structured logging flow from backend services to observability stack.

flowchart LR subgraph Services["Backend Services"] Engine["Backtest Engine"] Handler["API Handler"] Price["Price Service"] Metrics["Metrics Calculator"] end subgraph Logger["Pino Logger"] Module["moduleLogger('name')"] Warn["log.warn()"] Error["log.error()"] Info["log.info()"] end subgraph Redact["Auto-Redaction"] Creds["password, token
secret, apiKey"] end subgraph Output["Output"] Dev["Dev: Pretty print
to stdout"] Prod["Prod: JSON lines
to CloudWatch"] end subgraph Alerts["Alert Triggers"] DD["Max drawdown hit"] Kill["Guardrail kill"] Fail["Backtest failure"] end Engine --> Module Handler --> Module Price --> Module Metrics --> Module Module --> Warn Module --> Error Module --> Info Warn --> Redact Error --> Redact Info --> Redact Redact --> Dev Redact --> Prod Error --> Alerts style Services fill:#1e3a2f,stroke:#10b981 style Logger fill:#3a2f1e,stroke:#f59e0b style Output fill:#1e3a5f,stroke:#3b82f6 style Alerts fill:#3a1e2f,stroke:#ef4444

Log Levels

  • LOG_LEVEL=debug - All messages
  • LOG_LEVEL=info - Info, warn, error (default)
  • LOG_LEVEL=warn - Warn and error only
  • LOG_PRETTY=true - Human-readable (dev only)

12. Performance Bottlenecks

Identified performance bottlenecks and their mitigations.

flowchart TB subgraph Bottlenecks["Identified Bottlenecks"] B1["N separate INSERT queries
for trades"] B2["Sequential price fetches
for paired symbols"] B3["SPY benchmark fetch
on every backtest"] B4["Enhanced metrics
computation overhead"] end subgraph Mitigations["Mitigations Applied"] M1["Batched INSERT
using UNNEST arrays"] M2["Parallel Promise.all()
for prefetch"] M3["24-hour cache
for risk-free rate"] M4["Lazy computation
only when requested"] end subgraph Future["Future Optimizations"] F1["Redis cache
for price history"] F2["Worker threads
for metrics"] F3["Incremental backtest
resume support"] end B1 -->|"Fixed"| M1 B2 --> M2 B3 --> M3 B4 --> M4 M1 -.-> F1 M2 -.-> F2 M4 -.-> F3 style Bottlenecks fill:#3a1e2f,stroke:#ef4444 style Mitigations fill:#1e3a2f,stroke:#10b981 style Future fill:#3a2f1e,stroke:#f59e0b

Performance Metrics

  • Trade insertion: O(1) batch vs O(N) loop
  • Risk-free rate: 24h cache TTL
  • Enhanced metrics: Computed lazily on request
  • SPY data: Forward-fill for missing dates

Integrations

13. Paper Trading Integration

How paper trading executor uses the same DSL evaluator as backtesting.

flowchart TB subgraph Scheduler["Scheduler (5-min)"] Tick["tickAllActiveRuns()"] end subgraph Executor["Paper/Live Executor"] TR["tickRun(runId)"] Hydrate["Hydrate run state"] Price["Fetch current prices"] Validate["validatePrice()"] Ctx["Build EvalContext"] Eval["Evaluate DSL rules"] Exec["Execute trades"] Tel["Record telemetry"] Guard["Check guardrails L1-L4"] end subgraph Shared["Shared with Backtest"] DSL["DSL Evaluator"] Ind["IndicatorBundle"] Slip["Almgren-Chriss
Slippage Model"] end subgraph Mode["Execution Mode"] Paper["Paper Mode
Simulated fills"] Live["Live Mode
Broker adapter"] end Tick --> TR TR --> Hydrate --> Price --> Validate --> Ctx Ctx --> DSL DSL --> Ind Ctx --> Eval --> Exec Exec --> Slip Exec --> Paper Exec --> Live Exec --> Tel --> Guard style Scheduler fill:#3a1e3a,stroke:#a855f7 style Shared fill:#3a2f1e,stroke:#f59e0b

14. All Seeing Eye Integration

Real-time signal aggregation feeding into trading decisions.

flowchart TB subgraph ASE["All Seeing Eye (15-min)"] Agg["aggregateAllData()"] Market["Market Data"] Prediction["Prediction Markets"] Sentiment["Social Sentiment"] Derivatives["Derivatives Data"] end subgraph Insights["Computed Insights"] HA["Human-Automation Score"] Paradox["Paradox Detection"] BlackSwan["Black Swan Alerts"] end subgraph DSL["DSL Primitives"] P1["human_automation_score()"] P2["paradox_risk()"] P3["black_swan_severity()"] end subgraph Executor["Trading Executor"] Ctx["EvalContext"] Entry["Entry Rules"] Exit["Exit Rules"] Size["Position Sizing"] end Market --> Agg Prediction --> Agg Sentiment --> Agg Derivatives --> Agg Agg --> HA --> P1 Agg --> Paradox --> P2 Agg --> BlackSwan --> P3 P1 --> Ctx P2 --> Ctx P3 --> Ctx Ctx --> Entry Ctx --> Exit Ctx --> Size style ASE fill:#1e3a5f,stroke:#3b82f6 style Insights fill:#3a2f1e,stroke:#f59e0b

15. Graduation Flow (Backtest → Paper → Live)

Complete journey from backtesting to live trading.

stateDiagram-v2 [*] --> Backtest: Create Algorithm Backtest --> BacktestComplete: Run backtest BacktestComplete --> PaperPending: Start paper state PaperTrading { PaperPending --> PaperActive: startRun(paper) PaperActive --> Ticking: 5-min ticks Ticking --> ProgressUpdate: Update progress ProgressUpdate --> Ticking ProgressUpdate --> Eligible: Gates pass } state GraduationGates { Eligible --> PSRCheck: Request PSRCheck --> WalkForward: PSR >= 0.95 WalkForward --> MFAAck: OOS/IS >= 0.70 MFAAck --> Graduated: Confirmed } Graduated --> LiveActive: startRun(live)

16. Credits System Flow

How trading credits are reserved and released.

sequenceDiagram participant User participant Executor participant Credits participant DB User->>Executor: startRun(paper, 100k) Executor->>Credits: getUserCredits() Credits->>DB: SELECT available DB-->>Credits: 150,000 Executor->>Credits: reserveCredits(100k) Credits->>DB: UPDATE -100k available Credits-->>Executor: Reserved loop Every 5 min Executor->>Credits: syncEquity(current) Credits->>DB: UPDATE reserved end User->>Executor: stopRun() Executor->>Credits: release(finalEquity) Credits->>DB: Return to available Credits-->>User: P&L applied

Reference

17. Database Schema

Entity relationships for backtest-related tables.

erDiagram users ||--o{ algorithms : owns users ||--o{ algorithm_runs : executes users ||--o{ user_credits : has users ||--o{ imported_datasets : owns algorithms ||--o{ algorithm_versions : "has versions" algorithms ||--o{ algorithm_runs : "has runs" algorithm_versions ||--o{ algorithm_runs : "used in" algorithm_runs ||--o{ algorithm_trades : contains algorithm_runs ||--o{ algorithm_telemetry : records imported_datasets ||--o{ algorithm_runs : "data source" algorithms { uuid id PK uuid user_id FK string name string status } algorithm_runs { uuid id PK uuid algorithm_id FK uuid version_id FK string mode "backtest|paper|live" numeric starting_equity numeric ending_equity jsonb metrics_json } algorithm_trades { uuid id PK uuid run_id FK string symbol string side numeric pnl }

18. Complete File Map

All files involved in the backtesting system with their responsibilities.

Frontend Files

File Path Purpose Lines
apps/web/src/app/admin/algorithms/page.tsx Main page, BacktestModal component, chart rendering 2097-2759
apps/web/src/app/api/predict/v1/algorithms/[id]/backtest/route.ts API route wrapper, delegates to handler ~10
packages/fe/src/components/trading/backtest/BacktestEnhancedView.tsx 5-tab enhanced metrics interface ~293
packages/fe/src/components/trading/backtest/TailRiskPanel.tsx VaR, CVaR, Cornish-Fisher display ~80
packages/fe/src/components/trading/backtest/DrawdownEventsTable.tsx Sortable drawdown history table ~120
packages/fe/src/components/trading/backtest/StreakMetrics.tsx Win/loss streak analysis ~70
packages/fe/src/components/trading/backtest/MonthlyHeatmap.tsx Monthly returns heatmap ~100

Backend Files

File Path Purpose Lines
packages/be/src/algorithms/api/handlers.ts handleBacktestAlgorithm(), handleWalkForward(), etc. 462-750
packages/be/src/algorithms/backtest/engine.ts runAlgorithmBacktest(), bar-by-bar evaluation ~1700
packages/be/src/algorithms/backtest/enhanced-metrics.ts calculateEnhancedMetrics(), tail risk, streaks ~400
packages/be/src/algorithms/backtest/walk-forward.ts runWalkForwardBacktest(), cross-validation ~300
packages/be/src/algorithms/backtest/monte-carlo.ts runMonteCarloSimulation(), bootstrap ~250
packages/be/src/algorithms/backtest/regime-stress.ts runRegimeStress(), historical crises ~200
packages/be/src/algorithms/backtest/portfolio-engine.ts runPortfolioBacktest(), multi-symbol ~650
packages/be/src/backtest/metrics.ts Sharpe, Sortino, VaR, all core metrics ~1870
packages/be/src/algorithms/dsl/evaluator.ts DSL evaluation, no-look-ahead, indicators ~600
packages/be/src/algorithms/paper/executor.ts tickRun(), paper trading, price validation ~3800
packages/be/src/algorithms/graduation-service.ts Graduation gates, PSR check, walk-forward consistency ~400
packages/be/src/trading/services/credits-service.ts Credit reservation, release, P&L sync ~200
packages/be/src/all-seeing-eye/orchestrator/index.ts Real-time signal aggregation, insights ~500

Shared Types

File Path Purpose Key Types
packages/shared/src/backtest.ts Shared backtest type definitions BacktestTrade, EquityPoint, BacktestMetrics
packages/be/src/algorithms/dsl/types.ts DSL primitive definitions StrategyAST, Expression, 40+ primitives

Test Files

File Path Coverage
packages/be/src/algorithms/backtest/engine.test.ts 7 e2e tests: user DSL, AI-translated, AI auto-built
packages/be/src/backtest/metrics.test.ts 31 unit tests: pure math functions
packages/be/src/algorithms/backtest/garch.test.ts GARCH volatility model tests
packages/be/src/algorithms/backtest/hurst.test.ts Hurst exponent calculation tests
packages/be/src/algorithms/backtest/factor-attribution.test.ts Alpha, beta, R-squared tests