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>
101 lines
3.3 KiB
SQL
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)';
|