54 lines
No EOL
1.7 KiB
TypeScript
54 lines
No EOL
1.7 KiB
TypeScript
#!/usr/bin/env bun
|
|
|
|
/**
|
|
* Quick test of backtest with fixed order execution
|
|
*/
|
|
|
|
import { createContainer } from './src/simple-container';
|
|
import { BacktestEngine } from './src/backtest/BacktestEngine';
|
|
|
|
async function runQuickBacktest() {
|
|
const container = await createContainer();
|
|
|
|
const backtestEngine = container.resolve('backtestEngine') as BacktestEngine;
|
|
|
|
const config = {
|
|
name: 'Quick SMA Test',
|
|
strategy: 'sma-crossover',
|
|
symbols: ['AAPL'],
|
|
startDate: '2020-01-01',
|
|
endDate: '2021-01-01', // Just 1 year for quick test
|
|
initialCapital: 100000,
|
|
dataFrequency: '1d',
|
|
commission: 0.001,
|
|
slippage: 0.0001
|
|
};
|
|
|
|
console.log('Running quick backtest...\n');
|
|
|
|
try {
|
|
const result = await backtestEngine.runBacktest(config);
|
|
|
|
console.log('Backtest Results:');
|
|
console.log(`Total Return: ${result.metrics.totalReturn.toFixed(2)}%`);
|
|
console.log(`Total Trades: ${result.metrics.totalTrades}`);
|
|
console.log(`Win Rate: ${result.metrics.winRate.toFixed(2)}%`);
|
|
console.log(`Sharpe Ratio: ${result.metrics.sharpeRatio.toFixed(2)}`);
|
|
console.log(`Max Drawdown: ${result.metrics.maxDrawdown.toFixed(2)}%`);
|
|
console.log('\nTrade History:');
|
|
console.log(`Trades in history: ${result.trades.length}`);
|
|
|
|
result.trades.slice(0, 5).forEach(trade => {
|
|
console.log(`- ${trade.side} ${trade.quantity} @ $${trade.entryPrice} -> $${trade.exitPrice} (${trade.pnlPercent.toFixed(2)}%)`);
|
|
});
|
|
|
|
if (result.trades.length > 5) {
|
|
console.log(`... and ${result.trades.length - 5} more trades`);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('Backtest failed:', error);
|
|
}
|
|
}
|
|
|
|
runQuickBacktest().catch(console.error); |