institutional-trader/BACKTESTING_IMPLEMENTATION_...

4.2 KiB

Backtesting Implementation Summary

Completed Tasks

1. Database Schema Validation ✓

  • Created backend/scripts/validateSchema.js script
  • Validates all required tables exist
  • Checks indexes on critical tables
  • Verifies PRIMARY KEY constraints
  • Checks for data type inconsistencies
  • Can be run with: node backend/scripts/validateSchema.js

2. Historical Data Pull Configuration ✓

  • Updated yahhooscript.py:
    • Changed LOOKBACK_DAYS_INTRADAY from 1 to 30 (1 month)
    • Enhanced run_intraday_batched() function to automatically select interval:
      • 1-7 days: Uses 1-minute intervals
      • 8-60 days: Uses 5-minute intervals (handles 30-day requirement)
      • 60 days: Uses 15-minute intervals

  • Handles Yahoo Finance limitations gracefully

3. Enhanced Backtester ✓

  • Created backend/src/services/performanceMetrics.js with:
    • Sharpe ratio calculation
    • Maximum drawdown tracking
    • Win/loss streak calculation
    • Session-based performance (PRE/RTH/POST)
    • Best/worst performing symbols
    • Equity curve generation
  • Updated backend/src/services/backtester.js:
    • Integrated new performance metrics
    • Enhanced price lookup with daily data fallback
    • Improved error handling for missing data

4. Backtest API Endpoints ✓

  • Enhanced backend/src/routes/backtest.js with:
    • POST /api/backtest/run - Run single backtest
    • POST /api/backtest/batch - Run multiple backtests
    • GET /api/backtest/results/:id - Get backtest results by ID
    • POST /api/backtest/compare - Compare multiple strategies side-by-side
  • Added strategy scoring for ranking
  • Maintained backward compatibility with existing endpoints

Usage

Running Schema Validation

cd backend
node scripts/validateSchema.js

Pulling Historical Data

# Pull data for all symbols (30 days, 5-minute intervals)
python yahhooscript.py

# Pull data for a single symbol
python yahhooscript.py --only AAPL

Running Backtests via API

Single Backtest:

curl -X POST http://localhost:3010/api/backtest/run \
  -H "Content-Type: application/json" \
  -d '{
    "pattern": {
      "minRocketScore": 5.0,
      "requireTapeAlignment": true,
      "session": "RTH"
    },
    "options": {
      "lookbackDays": 30,
      "exitStrategy": "target_stop",
      "targetPct": 1.5,
      "stopPct": 1.5
    }
  }'

Compare Strategies:

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
    }
  }'

New Metrics Available

The enhanced backtester now provides:

  • Sharpe Ratio: Risk-adjusted return metric
  • Maximum Drawdown: Largest peak-to-trough decline
  • Win/Loss Streaks: Consecutive wins and losses
  • Session Performance: Separate metrics for PRE/RTH/POST sessions
  • Symbol Performance: Best and worst performing symbols
  • Equity Curve: Portfolio value over time

Testing

Quick Test Commands

# Validate database schema
cd backend
npm run validate-schema

# Test backtester functionality
npm run test-backtester

# Pull historical data (single symbol for testing)
python yahhooscript.py --only AAPL

# Pull full universe (30 days)
python yahhooscript.py

See TESTING_GUIDE.md for detailed testing instructions.

Next Steps

  1. Run Schema Validation: npm run validate-schema in backend directory
  2. Pull Historical Data: Run python yahhooscript.py --only AAPL to test, then full universe
  3. Test Backtesting: Run npm run test-backtester or use API endpoints
  4. Monitor Performance: Check that queries perform well with 30 days of data
  5. Review Results: Analyze backtest results and refine trading patterns

Notes

  • Yahoo Finance provides 1-minute data for last 7 days only
  • For 30-day lookback, the script automatically uses 5-minute intervals
  • The backtester falls back to daily data if intraday data is unavailable
  • All API endpoints maintain backward compatibility