# Testing Guide for Historical Data & Backtesting

## Prerequisites

1. Database connection configured (see `.env` file)
2. Node.js installed and in PATH
3. Python 3.x installed with required packages:
   - `yfinance`
   - `pandas`
   - `psycopg2`
   - `python-dotenv`

## Step 1: Validate Database Schema

Run the schema validation script to ensure all tables and indexes exist:

```bash
cd backend
node scripts/validateSchema.js
```

**Expected Output:**
- ✅ All required tables exist
- ✅ Indexes on critical tables
- ✅ PRIMARY KEY constraints verified
- ⚠️  Any warnings about data types

**If issues are found:**
- Run `backend/database/schema.sql` in your database
- Run `backend/database/missing_tables.sql` if needed

## Step 2: Pull Historical Data

### Test with Single Symbol First

```bash
python yahhooscript.py --only AAPL
```

This will:
- Pull 30 days of 5-minute intraday data for AAPL
- Pull daily data (2 years) for AAPL
- Store in PostgreSQL database

**Verify data was pulled:**
```sql
-- Check intraday data
SELECT COUNT(*), MIN(ts), MAX(ts)
FROM prices_intraday_1m
WHERE symbol = 'AAPL'
  AND ts >= NOW() - INTERVAL '30 days';

-- Check daily data
SELECT COUNT(*), MIN("Date"), MAX("Date")
FROM prices_daily
WHERE symbol = 'AAPL';
```

### Pull Full Universe

```bash
python yahhooscript.py
```

This will pull data for all symbols in your universe (S&P 500, S&P 400, Nasdaq-100, plus custom groups).

**Note:** This may take 30-60 minutes depending on:
- Number of symbols
- Yahoo Finance rate limiting
- Network speed

**Monitor progress:**
- Script shows batch progress
- Check for errors in output
- Verify data counts in database

## Step 3: Test Backtester

### Run Test Script

```bash
cd backend
node scripts/testBacktester.js
```

This will:
- Test database connectivity
- Check price data availability
- Run a sample backtest
- Verify enhanced metrics are calculated

### Test via API

Start the backend server:
```bash
cd backend
npm run dev
```

**Run Single Backtest:**
```bash
curl -X POST http://localhost:3010/api/backtest/run \
  -H "Content-Type: application/json" \
  -d '{
    "pattern": {
      "rocketScoreMin": 5.0,
      "session": "RTH"
    },
    "options": {
      "lookbackDays": 30,
      "targetPct": 1.5,
      "stopPct": 1.5
    }
  }'
```

**Compare Strategies:**
```bash
curl -X POST http://localhost:3010/api/backtest/compare \
  -H "Content-Type: application/json" \
  -d '{
    "strategies": [
      {
        "name": "High Score RTH",
        "pattern": { "rocketScoreMin": 5, "session": "RTH" }
      },
      {
        "name": "Tape Aligned",
        "pattern": { "rocketScoreMin": 3, "tapeAligned": true }
      }
    ],
    "options": {
      "lookbackDays": 30
    }
  }'
```

## Step 4: Validate Results

### Check Metrics

Verify that all new metrics are being calculated:

```javascript
{
  "winRate": 70.1,
  "avgWin": 2.7,
  "avgLoss": -1.3,
  "expectancy": 1.5,
  "sharpeRatio": 1.23,        // ✅ New
  "maxDrawdown": 15.0,         // ✅ New
  "streaks": {                 // ✅ New
    "maxWinStreak": 5,
    "maxLossStreak": 2
  },
  "sessionPerformance": [     // ✅ New
    { "session": "RTH", "winRate": 72.5, "totalTrades": 80 }
  ],
  "symbolPerformance": {      // ✅ New
    "best": [{"symbol": "AAPL", "avgReturn": 3.2}],
    "worst": [{"symbol": "TSLA", "avgReturn": -1.5}]
  }
}
```

### Verify Data Quality

```sql
-- Check data completeness for a symbol
SELECT 
  symbol,
  COUNT(*) as total_bars,
  COUNT(DISTINCT DATE(ts)) as trading_days,
  MIN(ts) as earliest,
  MAX(ts) as latest
FROM prices_intraday_1m
WHERE symbol = 'AAPL'
  AND ts >= NOW() - INTERVAL '30 days'
GROUP BY symbol;

-- Should show ~20-22 trading days (excluding weekends/holidays)
-- Should show ~390 bars per day for 5-minute data (6.5 hours * 12 bars/hour)
```

## Troubleshooting

### No Data Found in Backtest

**Possible causes:**
1. No options flow data in date range
   - Check: `SELECT COUNT(*) FROM "OptionsFlow_monthly" WHERE "CreatedDate" >= CURRENT_DATE - INTERVAL '30 days'`
2. Pattern criteria too strict
   - Try lowering `rocketScoreMin` or removing filters
3. No price data available
   - Run: `python yahhooscript.py --only SYMBOL`

### Yahoo Finance Rate Limiting

**Symptoms:**
- Empty data returned
- Timeout errors
- JSON parsing errors

**Solutions:**
1. Increase `SLEEP_BETWEEN_BATCHES` in `yahhooscript.py`
2. Reduce `BATCH_SIZE` (try 50 instead of 110)
3. Run during off-peak hours
4. Use VPN if IP is rate-limited

### Database Connection Issues

**Check:**
1. `.env` file has correct credentials
2. Database is not paused (Supabase)
3. Network connectivity
4. Firewall rules

**Test connection:**
```bash
cd backend
node -e "import('./src/db.js').then(m => m.testConnection())"
```

## Success Criteria

✅ Schema validation passes  
✅ 30 days of historical data pulled  
✅ Backtester runs without errors  
✅ All enhanced metrics are calculated  
✅ API endpoints return valid results  
✅ Data quality checks pass  

## Next Steps

After successful testing:
1. Run full universe data pull (if not done)
2. Test with various pattern combinations
3. Compare multiple strategies
4. Analyze results and refine patterns
5. Set up scheduled data pulls (optional)

