trading-platform-database-v2/ddl/schemas/ml/tables/10-backtest_runs.sql
Adrian Flores Cortes 2a6d8367d8 feat: Update DDL schemas and add new structures
DDL updates:
- Update extensions and schemas configuration
- Add sessions table for auth schema
- Update education schema (videos, install/uninstall scripts)
- Add backtest_runs and llm_signals tables for ML schema

Scripts:
- Update database creation and migration scripts
- Add DDL validation script

New:
- Add migrations directory structure
- Add production seeds for auth, investment, market_data, trading

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 12:24:23 -06:00

101 lines
3.3 KiB
SQL

-- =====================================================
-- ML SCHEMA - BACKTEST RUNS TABLE
-- =====================================================
-- Description: Backtest execution history and results
-- Schema: ml
-- Author: ML Module Implementation
-- Date: 2026-01-18
-- =====================================================
-- Backtest status enum
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'backtest_status') THEN
CREATE TYPE ml.backtest_status AS ENUM (
'pending',
'running',
'completed',
'failed',
'cancelled'
);
END IF;
END$$;
CREATE TABLE IF NOT EXISTS ml.backtest_runs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- User who initiated the backtest (optional for system backtests)
user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL,
-- Symbol and date range
symbol VARCHAR(20) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
-- Status
status ml.backtest_status NOT NULL DEFAULT 'pending',
-- Configuration
config JSONB NOT NULL,
-- Example config:
-- {
-- "initialCapital": 10000,
-- "riskPerTrade": 0.02,
-- "rrConfig": "rr_2_1",
-- "strategy": "ml_signals",
-- "params": {}
-- }
-- Results (populated when completed)
result JSONB,
-- Example result:
-- {
-- "totalTrades": 150,
-- "winRate": 0.52,
-- "netProfit": 2500.00,
-- "profitFactor": 1.45,
-- "maxDrawdown": 0.15,
-- "sharpeRatio": 1.8,
-- "sortinoRatio": 2.1,
-- "calmarRatio": 1.2,
-- "expectancy": 0.05,
-- "totalProfitR": 45.5,
-- "trades": [...]
-- }
-- Error message (if failed)
error TEXT,
-- Timing
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
-- Constraints
CONSTRAINT valid_date_range CHECK (end_date >= start_date),
CONSTRAINT valid_config CHECK (jsonb_typeof(config) = 'object')
);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_backtest_runs_user ON ml.backtest_runs(user_id);
CREATE INDEX IF NOT EXISTS idx_backtest_runs_symbol ON ml.backtest_runs(symbol);
CREATE INDEX IF NOT EXISTS idx_backtest_runs_status ON ml.backtest_runs(status);
CREATE INDEX IF NOT EXISTS idx_backtest_runs_created ON ml.backtest_runs(created_at DESC);
-- Index for finding completed backtests by profit
CREATE INDEX IF NOT EXISTS idx_backtest_runs_profit ON ml.backtest_runs((result->>'netProfit'))
WHERE status = 'completed';
-- Composite index for user queries
CREATE INDEX IF NOT EXISTS idx_backtest_runs_user_symbol ON ml.backtest_runs(user_id, symbol, created_at DESC);
-- Comments
COMMENT ON TABLE ml.backtest_runs IS 'Backtest execution history and results';
COMMENT ON COLUMN ml.backtest_runs.user_id IS 'User who initiated the backtest (null for system backtests)';
COMMENT ON COLUMN ml.backtest_runs.symbol IS 'Trading symbol/pair tested';
COMMENT ON COLUMN ml.backtest_runs.config IS 'Backtest configuration (capital, risk, strategy, etc.)';
COMMENT ON COLUMN ml.backtest_runs.result IS 'Backtest results including metrics and trades';
COMMENT ON COLUMN ml.backtest_runs.error IS 'Error message if backtest failed';
COMMENT ON COLUMN ml.backtest_runs.started_at IS 'When backtest execution started';
COMMENT ON COLUMN ml.backtest_runs.completed_at IS 'When backtest finished (success or failure)';