-- Migration 030: Create A/B Test Results Table -- Creates table for storing A/B testing pipeline results and deployment decisions CREATE TABLE IF NOT EXISTS ab_test_results ( -- Primary identifiers test_id VARCHAR(100) PRIMARY KEY, -- Test configuration control_model VARCHAR(100) NOT NULL, treatment_model VARCHAR(100) NOT NULL, symbol VARCHAR(20) NOT NULL, traffic_split DOUBLE PRECISION NOT NULL DEFAULT 0.5, min_sample_size INTEGER NOT NULL DEFAULT 1000, -- Test status status VARCHAR(50) NOT NULL DEFAULT 'running', start_time TIMESTAMPTZ NOT NULL DEFAULT NOW(), end_time TIMESTAMPTZ, -- Control group metrics control_predictions BIGINT DEFAULT 0, control_correct_predictions BIGINT DEFAULT 0, control_win_rate DOUBLE PRECISION DEFAULT 0.0, control_total_pnl DOUBLE PRECISION DEFAULT 0.0, control_sharpe DOUBLE PRECISION DEFAULT 0.0, control_avg_latency_us DOUBLE PRECISION DEFAULT 0.0, -- Treatment group metrics treatment_predictions BIGINT DEFAULT 0, treatment_correct_predictions BIGINT DEFAULT 0, treatment_win_rate DOUBLE PRECISION DEFAULT 0.0, treatment_total_pnl DOUBLE PRECISION DEFAULT 0.0, treatment_sharpe DOUBLE PRECISION DEFAULT 0.0, treatment_avg_latency_us DOUBLE PRECISION DEFAULT 0.0, -- Statistical test results sharpe_diff DOUBLE PRECISION, sharpe_p_value DOUBLE PRECISION, sharpe_significant BOOLEAN, pnl_diff DOUBLE PRECISION, pnl_p_value DOUBLE PRECISION, pnl_significant BOOLEAN, -- Deployment decision (JSON) decision JSONB, -- Audit trail created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Indexes for querying CREATE INDEX idx_ab_test_results_status ON ab_test_results (status); CREATE INDEX idx_ab_test_results_symbol ON ab_test_results (symbol); CREATE INDEX idx_ab_test_results_start_time ON ab_test_results (start_time DESC); CREATE INDEX idx_ab_test_results_control_model ON ab_test_results (control_model); CREATE INDEX idx_ab_test_results_treatment_model ON ab_test_results (treatment_model); -- Trigger to update updated_at timestamp CREATE OR REPLACE FUNCTION update_ab_test_results_timestamp() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_update_ab_test_results_timestamp BEFORE UPDATE ON ab_test_results FOR EACH ROW EXECUTE FUNCTION update_ab_test_results_timestamp(); -- Comments COMMENT ON TABLE ab_test_results IS 'A/B testing pipeline results for automated model deployment decisions'; COMMENT ON COLUMN ab_test_results.test_id IS 'Unique test identifier'; COMMENT ON COLUMN ab_test_results.control_model IS 'Baseline model ID (e.g., DQN_v1.0.0)'; COMMENT ON COLUMN ab_test_results.treatment_model IS 'New model ID under test (e.g., DQN_v2.0.0)'; COMMENT ON COLUMN ab_test_results.traffic_split IS 'Traffic split ratio (0.5 = 50/50)'; COMMENT ON COLUMN ab_test_results.status IS 'Test status: running, completed_rollout, completed_revert, completed_neutral, completed_inconclusive'; COMMENT ON COLUMN ab_test_results.decision IS 'JSON deployment decision: RolloutTreatment, RevertToControl, Neutral, Inconclusive';