-- ============================================================================
-- PAPER TRADING DIAGNOSTIC QUERIES
-- Agent 131 - 2025-10-14
-- ============================================================================

-- PROBLEM VERIFICATION
-- ----------------------------------------------------------------------------

-- 1. Count total predictions (Expected: 3000)
SELECT COUNT(*) as total_predictions FROM ensemble_predictions;

-- 2. Count executed orders (Expected: 0 - THIS IS THE BUG!)
SELECT COUNT(*) as total_orders 
FROM orders 
WHERE account_id LIKE '%paper%';

-- 3. Check prediction linkage (Expected: 0 - no predictions linked to orders)
SELECT COUNT(*) as linked_predictions 
FROM ensemble_predictions 
WHERE order_id IS NOT NULL;

-- 4. Conversion rate calculation (Expected: 0%)
SELECT
    COUNT(*) as total_predictions,
    SUM(CASE WHEN order_id IS NOT NULL THEN 1 ELSE 0 END) as executed_predictions,
    ROUND(100.0 * SUM(CASE WHEN order_id IS NOT NULL THEN 1 ELSE 0 END) / COUNT(*), 2) as conversion_rate_percent
FROM ensemble_predictions
WHERE ensemble_action IN ('BUY', 'SELL');


-- PREDICTION ANALYSIS
-- ----------------------------------------------------------------------------

-- 5. Prediction breakdown by action
SELECT 
    ensemble_action,
    COUNT(*) as count,
    ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) as percentage,
    ROUND(AVG(ensemble_confidence)::numeric, 4) as avg_confidence,
    ROUND(AVG(disagreement_rate)::numeric, 4) as avg_disagreement
FROM ensemble_predictions
GROUP BY ensemble_action
ORDER BY count DESC;

-- 6. Symbol distribution (Expected: Only TEST_SYM - THIS IS WRONG!)
SELECT 
    symbol,
    COUNT(*) as count,
    MIN(timestamp) as first_prediction,
    MAX(timestamp) as last_prediction
FROM ensemble_predictions
GROUP BY symbol
ORDER BY count DESC;

-- 7. High-confidence predictions (>60%) that SHOULD be executed
SELECT 
    COUNT(*) as high_confidence_predictions,
    ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM ensemble_predictions), 2) as percentage
FROM ensemble_predictions
WHERE ensemble_confidence >= 0.60
  AND ensemble_action IN ('BUY', 'SELL');

-- 8. High-confidence predictions by symbol (should be real symbols!)
SELECT 
    symbol,
    ensemble_action,
    COUNT(*) as count,
    AVG(ensemble_confidence)::numeric(5,2) as avg_confidence
FROM ensemble_predictions
WHERE ensemble_confidence >= 0.60
  AND ensemble_action IN ('BUY', 'SELL')
GROUP BY symbol, ensemble_action
ORDER BY count DESC;


-- MODEL VOTE ANALYSIS
-- ----------------------------------------------------------------------------

-- 9. Individual model participation (Expected: All NULL - models not trained)
SELECT
    COUNT(*) as total_predictions,
    SUM(CASE WHEN dqn_signal IS NOT NULL THEN 1 ELSE 0 END) as dqn_votes,
    SUM(CASE WHEN ppo_signal IS NOT NULL THEN 1 ELSE 0 END) as ppo_votes,
    SUM(CASE WHEN mamba2_signal IS NOT NULL THEN 1 ELSE 0 END) as mamba2_votes,
    SUM(CASE WHEN tft_signal IS NOT NULL THEN 1 ELSE 0 END) as tft_votes
FROM ensemble_predictions;

-- 10. High disagreement events (>50% disagreement)
SELECT 
    COUNT(*) as high_disagreement_count,
    ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM ensemble_predictions), 2) as percentage,
    AVG(disagreement_rate)::numeric(5,2) as avg_disagreement
FROM ensemble_predictions
WHERE disagreement_rate >= 0.50;


-- TEMPORAL ANALYSIS
-- ----------------------------------------------------------------------------

-- 11. Prediction timeline (when predictions were generated)
SELECT 
    DATE_TRUNC('minute', timestamp) as minute,
    COUNT(*) as predictions_per_minute
FROM ensemble_predictions
GROUP BY minute
ORDER BY minute DESC
LIMIT 10;

-- 12. Time since last prediction (Expected: >1 hour - system stopped)
SELECT 
    MAX(timestamp) as last_prediction_time,
    NOW() - MAX(timestamp) as time_since_last_prediction
FROM ensemble_predictions;


-- MISSING CONSUMER VALIDATION
-- ----------------------------------------------------------------------------

-- 13. Predictions that SHOULD be executed (but aren't due to missing consumer)
SELECT 
    id,
    timestamp,
    symbol,
    ensemble_action,
    ensemble_signal,
    ensemble_confidence,
    order_id
FROM ensemble_predictions
WHERE order_id IS NULL                              -- Not yet executed
  AND ensemble_confidence >= 0.60                    -- High confidence
  AND ensemble_action IN ('BUY', 'SELL')            -- Actionable
  AND timestamp > NOW() - INTERVAL '5 minutes'      -- Recent
ORDER BY ensemble_confidence DESC
LIMIT 20;

-- 14. Count of executable predictions (if consumer existed)
SELECT 
    COUNT(*) as executable_predictions,
    ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM ensemble_predictions), 2) as executable_percentage
FROM ensemble_predictions
WHERE order_id IS NULL
  AND ensemble_confidence >= 0.60
  AND ensemble_action IN ('BUY', 'SELL');


-- EXPECTED RESULTS AFTER FIX
-- ----------------------------------------------------------------------------

-- After implementing PaperTradingExecutor:
-- 
-- Query 2 (total_orders): >1500 (not 0!)
-- Query 3 (linked_predictions): >1500 (not 0!)
-- Query 4 (conversion_rate_percent): >50% (not 0%)
-- Query 6 (symbol): ES.FUT, NQ.FUT, ZN.FUT, 6E.FUT (not TEST_SYM!)
-- Query 14 (executable_predictions): Decreasing over time as consumer executes


-- ============================================================================
-- RUN ALL DIAGNOSTICS
-- ============================================================================

-- Usage:
-- psql postgresql://foxhunt:foxhunt_dev_password@localhost:5432/foxhunt -f PAPER_TRADING_DIAGNOSTIC_QUERIES.sql

