回测框架概述:为什么我们需要它?
做市商策略写好了,怎么知道它能不能赚钱?
直接扔到实盘?那风险太大了。我见过太多人,策略回测没跑明白就上实盘,结果亏得底裤都不剩。
回测框架,说白了就是你的策略「时光机」。它用历史数据模拟交易,让你在真实资金入场前,先看清策略的底牌。
回测框架的核心作用
我个人习惯把回测框架的作用归纳为三点:
- 验证策略有效性——你的做市策略到底能不能赚钱?回测给你第一个答案。
- 发现潜在风险——比如极端行情下的滑点、流动性枯竭,回测能帮你提前暴露问题。
- 优化参数配置——报价宽度、库存阈值、对冲频率,这些参数怎么调?回测告诉你答案。
核心观点:回测不是为了证明策略完美,而是为了在实盘前尽可能多地「排雷」。
我在项目中遇到过一件事:一个看起来年化收益80%的做市策略,回测时一切正常。但当我加入「订单簿快照延迟」这个现实因素后,收益直接腰斩。嗯,这就是回测的价值——它让你看到策略在真实世界里的样子。
回测框架的核心组件
一个完整的回测框架,至少包含以下五个组件。你想想看,少了哪一个,回测结果都可能失真。
1. 数据模块
这是回测的「燃料」。没有数据,一切都是空谈。
- 行情数据:Tick级、秒级、分钟级,取决于你的策略频率
- 订单簿数据:做市商必须要有完整的L2/L3订单簿快照
- 交易数据:成交记录、挂单撤销记录
避坑指南:我曾经用分钟级K线回测一个高频做市策略,结果回测收益高得离谱。后来才发现,分钟级数据掩盖了订单簿的微观波动。做市商回测,至少要用Tick级数据。
2. 策略引擎
这是回测的「大脑」。它负责执行你的做市逻辑。
- 报价生成逻辑(双边报价、动态价差)
- 订单管理(挂单、撤单、重报)
- 库存管理(目标库存、再平衡策略)
3. 模拟撮合引擎
这是回测的「心脏」。它模拟订单簿的撮合过程。
说白了,就是回答一个问题:你的报价单子,在什么价格、什么时间能成交?
# 一个简化的撮合逻辑示例
def match_order(order, orderbook):
if order.side == 'buy':
# 检查是否有卖单价格低于等于买单价格
if orderbook.asks[0].price <= order.price:
return True # 成交
else:
if orderbook.bids[0].price >= order.price:
return True # 成交
return False # 未成交
4. 风控模块
做市商最怕什么?黑天鹅事件。风控模块就是你的「安全带」。
- 最大持仓限制
- 最大亏损限制
- 报价偏离度检查
- 异常行情熔断
警告:很多新手做回测时不加风控模块,觉得「策略本身就能控制风险」。我见过一个案例,策略在正常行情下表现完美,但遇到一次闪崩,库存直接爆仓。回测时加上风控,你会发现很多策略其实不堪一击。
5. 绩效评估模块
回测跑完了,怎么评价策略好坏?这就是绩效评估模块的工作。
回测框架的评估指标
做市商的评估指标,和普通趋势策略不太一样。我列几个核心的:
| 指标 | 计算公式 | 说明 |
|---|---|---|
| 年化收益率 | (期末净值/期初净值)^(1/年数) - 1 | 衡量整体盈利能力 |
| 夏普比率 | (策略收益率 - 无风险利率) / 收益率标准差 | 衡量风险调整后收益 |
| 最大回撤 | max(峰值 - 谷值) / 峰值 | 衡量策略的最大亏损幅度 |
| 胜率 | 盈利交易次数 / 总交易次数 | 做市商通常胜率高但单笔盈利小 |
| 库存周转率 | 总交易量 / 平均库存 | 衡量做市商的做市效率 |
| 买卖价差收益 | ∑(卖价 - 买价) × 成交量 | 做市商的核心收入来源 |
重点:做市商策略,我建议重点关注「最大回撤」和「库存周转率」。为什么?因为做市商赚的是薄利,一旦回撤过大,可能一次亏损吃掉几个月的利润。而库存周转率低,说明你的报价可能不够有竞争力。
回测框架的整体逻辑
说了这么多,我们用一个流程图来总结回测框架的核心逻辑:
这个流程,说白了就是:数据进去 → 策略决策 → 模拟成交 → 风控检查 → 绩效打分。然后根据打分结果,回头调整策略参数,再来一轮。
我的经验:刚开始做回测时,我总想一步到位,把所有组件都做得特别复杂。后来发现,先跑通一个最简单的版本,再逐步加细节,效率反而更高。比如先不加滑点、不考虑手续费,看看策略逻辑本身是否成立。
回测框架不是万能的。它不能预测未来,也不能保证实盘一定赚钱。但它能帮你回答一个关键问题:「如果历史重演,我的策略会怎样?」
嗯,这就是回测框架存在的意义。