stock-bot/apps/stock/orchestrator/test-backtest.ts
2025-07-03 11:04:33 -04:00

99 lines
No EOL
3.1 KiB
TypeScript

#!/usr/bin/env bun
import { createContainer } from './src/simple-container';
import { BacktestEngine } from './src/backtest/BacktestEngine';
import { StrategyManager } from './src/strategies/StrategyManager';
import { SimpleMovingAverageCrossover } from './src/strategies/examples/SimpleMovingAverageCrossover';
async function runBacktest() {
console.log('Starting backtest test...');
// Create container with minimal config
const config = {
port: 2004,
mode: 'paper',
enableWebSocket: false,
database: {
mongodb: { enabled: false },
postgres: { enabled: false },
questdb: { enabled: false }
},
redis: {
url: 'redis://localhost:6379'
},
backtesting: {
maxConcurrent: 1,
defaultSpeed: 'max',
dataResolutions: ['1d']
},
strategies: {
maxActive: 10,
defaultTimeout: 30000
}
};
const container = await createContainer(config);
// Initialize strategy manager
const strategyManager = new StrategyManager(container.executionService, container.modeManager);
// Create and add strategy
const strategyConfig = {
id: 'sma-test',
name: 'SMA Test',
type: 'sma-crossover',
symbols: ['AA'],
active: true,
allocation: 1.0,
riskLimit: 0.02,
maxPositions: 10
};
const strategy = new SimpleMovingAverageCrossover(strategyConfig, container.modeManager, container.executionService);
await strategyManager.addStrategy(strategy);
// Create backtest engine
const backtestEngine = new BacktestEngine(container, strategyManager);
// Run backtest
const backtestConfig = {
symbols: ['AA'],
strategy: 'sma-crossover',
startDate: '2024-01-01',
endDate: '2024-12-31',
initialCapital: 100000,
commission: 0.001,
slippage: 0.0005,
dataFrequency: '1d'
};
try {
console.log('Running backtest...');
const result = await backtestEngine.runBacktest(backtestConfig);
console.log('\n=== Backtest Results ===');
console.log(`Total trades: ${result.metrics.totalTrades}`);
console.log(`Win rate: ${result.metrics.winRate.toFixed(2)}%`);
console.log(`Total return: ${result.metrics.totalReturn.toFixed(2)}%`);
console.log(`Sharpe ratio: ${result.metrics.sharpeRatio.toFixed(2)}`);
console.log(`Max drawdown: ${result.metrics.maxDrawdown.toFixed(2)}%`);
console.log('\n=== Trade History ===');
result.trades.forEach((trade, i) => {
console.log(`Trade ${i + 1}: ${trade.side} ${trade.quantity} ${trade.symbol} @ ${trade.entryPrice.toFixed(2)}`);
if (trade.exitDate) {
console.log(` Exit: ${trade.exitPrice.toFixed(2)}, P&L: ${trade.pnl.toFixed(2)} (${trade.pnlPercent.toFixed(2)}%)`);
}
});
console.log(`\nTotal trades in result: ${result.trades.length}`);
} catch (error) {
console.error('Backtest failed:', error);
} finally {
// Cleanup
await container.shutdownManager.shutdown();
process.exit(0);
}
}
runBacktest().catch(console.error);