回测 - 完整API参考
使用历史数据、滚动预测分析和蒙特卡洛模拟来验证交易策略。
聊天命令
运行回测
/backtest momentum --from 2024-01-01 --to 2024-12-31
/backtest mean-reversion --market "Trump 2028" --days 90
/backtest my-strategy --capital 10000
快速统计
/backtest stats momentum 显示策略指标
/backtest compare momentum arb 比较两种策略
/backtest monte-carlo momentum 运行蒙特卡洛模拟
结果
/backtest results 显示最近结果
/backtest stats 结果的别名
/backtest results <id> --detailed 详细分解
/backtest export 将上次结果导出为CSV
TypeScript API参考
创建回测引擎
import { createBacktestEngine } from 'clodds/backtest';
const backtest = createBacktestEngine({
// 数据源
dataSource: 'polymarket', // 或自定义数据提供者
// 资本
initialCapital: 10000,
// 费用(Polymarket: 大多数市场0%;Kalshi: 平均约1.2%)
fees: {
maker: 0, // 0% maker费(Polymarket大多数市场)
taker: 0, // 0% taker费(Polymarket大多数市场)
// 对于15分钟加密市场或Kalshi,使用:taker: 0.012
},
// 滑点模型
slippageModel: 'realistic', // 'none' | 'fixed' | 'realistic'
slippageBps: 10,
});
运行基本回测
const result = await backtest.run({
strategy: 'momentum',
startDate: '2024-01-01',
endDate: '2024-12-31',
parameters: {
lookbackPeriod: 14,
entryThreshold: 0.02,
exitThreshold: 0.01,
},
});
console.log(`总回报率: ${result.totalReturn}%`);
console.log(`夏普比率: ${result.sharpeRatio}`);
console.log(`最大回撤: ${result.maxDrawdown}%`);
console.log(`胜率: ${result.winRate}%`);
console.log(`利润因子: ${result.profitFactor}`);
滚动预测分析
// 样本外验证
const wf = await backtest.walkForward({
strategy: 'momentum',
startDate: '2023-01-01',
endDate: '2024-12-31',
// 训练/测试分割
trainPeriod: '6M',
testPeriod: '1M',
step: '1M',
// 优化
optimize: ['lookbackPeriod', 'entryThreshold'],
optimizationMetric: 'sharpe',
});
console.log(`样本内夏普比率: ${wf.inSampleSharpe}`);
console.log(`样本外夏普比率: ${wf.outOfSampleSharpe}`);
console.log(`过拟合比率: ${wf.overfitRatio}`);
蒙特卡洛模拟
// 随机化的压力测试
const mc = await backtest.monteCarlo({
strategy: 'momentum',
trades: historicalTrades,
// 模拟设置
simulations: 10000,
confidenceLevel: 0.95,
// 随机化
shuffleTrades: true,
randomizeReturns: true,
});
console.log(`预期回报率: ${mc.expectedReturn}%`);
console.log(`95% VaR: ${mc.valueAtRisk}%`);
console.log(`最坏情况: ${mc.worstCase}%`);
console.log(`最好情况: ${mc.bestCase}%`);
console.log(`盈利概率: ${mc.probProfit}%`);
性能指标
const metrics = await backtest.getMetrics(result);
console.log('=== 性能 ===');
console.log(`总回报率: ${metrics.totalReturn}%`);
console.log(`CAGR: ${metrics.cagr}%`);
console.log(`波动率: ${metrics.volatility}%`);
console.log('=== 风险 ===');
console.log(`夏普比率: ${metrics.sharpeRatio}`);
console.log(`索提诺比率: ${metrics.sortinoRatio}`);
console.log(`最大回撤: ${metrics.maxDrawdown}%`);
console.log(`最大回撤持续时间: ${metrics.maxDrawdownDuration} 天`);
console.log('=== 交易 ===');
console.log(`总交易次数: ${metrics.totalTrades}`);
console.log(`胜率: ${metrics.winRate}%`);
console.log(`利润因子: ${metrics.profitFactor}`);
console.log(`平均盈利: ${metrics.avgWin}%`);
console.log(`平均亏损: ${metrics.avgLoss}%`);
console.log(`期望值: ${metrics.expectancy}%`);
自定义策略
// 定义自定义策略
const myStrategy = {
name: 'my-strategy',
onData: async (data, context) => {
const price = data.price;
const sma = data.indicators.sma(20);
if (price < sma * 0.95 && !context.hasPosition) {
return { action: 'buy', size: context.availableCapital * 0.1 };
}
if (price > sma * 1.05 && context.hasPosition) {
return { action: 'sell', size: 'all' };
}
return { action: 'hold' };
},
};
const result = await backtest.run({
strategy: myStrategy,
startDate: '2024-01-01',
endDate: '2024-12-31',
});
内置策略
| 策略 |
描述 |
momentum |
跟随价格趋势 |
mean-reversion |
逢低买入,逢高卖出 |
arbitrage |
跨平台价格差异 |
breakout |
在范围突破时进入 |
pairs |
相关市场对 |
指标解释
| 指标 |
好值 |
描述 |
| 夏普比率 |
> 1.0 |
风险调整后的回报 |
| 索提诺比率 |
> 1.5 |
下行风险调整后的回报 |
| 最大回撤 |
< 20% |
最糟糕的峰谷比 |
| 胜率 |
> 50% |
成功交易的百分比 |
| 利润因子 |
> 1.5 |
毛利润/毛亏损 |
| 期望值 |
> 0 |
每笔交易预期的收益 |
最佳实践
- 使用滚动预测 — 避免过拟合
- 包含费用 — 现实成本建模
- 测试多个周期 — 不要挑选日期
- 蒙特卡洛 — 了解变异性
- 样本外 — 总是验证在未见过的数据上