25、订单流中的回测系统搭建
回测系统,说白了就是你的策略实验室。我做了这么多年交易,见过太多人拿着一个看起来不错的策略直接上实盘,结果亏得底裤都不剩。嗯,回测就是帮你避免这种悲剧的。
订单流策略的回测,跟传统K线回测不太一样。传统回测只看价格和成交量,但订单流回测要处理逐笔数据、Delta、失衡这些微观结构信息。数据量大了好几个数量级,处理起来也更讲究。
回测框架设计
我个人习惯把回测框架分成三层:数据层、策略层、评估层。这样分层的好处是,哪一层出了问题,直接定位修改就行,不用动其他代码。
核心思路:订单流回测框架 = 数据引擎 + 策略引擎 + 分析引擎
先看数据层。订单流数据是逐笔成交数据,每条记录包含时间、价格、成交量、买卖方向。我建议你把这些数据存成Parquet格式,比CSV快10倍不止。我在项目中遇到过,用CSV回测一个月的数据要跑半小时,换成Parquet后只要两分钟。
策略层呢,就是你的交易逻辑。比如Delta突破策略、失衡反转策略、累积Delta背离策略等等。每个策略都是一个独立模块,输入数据,输出信号。
评估层负责算绩效指标。夏普比率、最大回撤、胜率、盈亏比,这些都得算清楚。我还会额外加一个「交易次数统计」,因为订单流策略通常交易频率较高,次数太少说明策略可能没触发。
// 回测框架核心结构(伪代码)
class OrderFlowBacktest:
def __init__(self, data, strategy, params):
self.data = data // 订单流数据
self.strategy = strategy // 策略逻辑
self.params = params // 策略参数
self.trades = [] // 交易记录
def run(self):
for tick in self.data:
signal = self.strategy.check(tick, self.params)
if signal:
self.execute(tick, signal)
return self.analyze()
订单流策略的回测实现
实现回测时,有几个坑你得注意。我曾经踩过一个大坑——未来函数。什么意思呢?就是用未来的数据去判断当前的交易信号。比如计算Delta时,用了整个交易日的总数据,但实际交易时你只能看到当前这一秒的数据。
解决办法很简单:严格按时间顺序处理数据。每来一条新数据,只基于之前的数据做判断。我写了个检查函数,专门验证回测过程中有没有用到未来数据。
另一个要注意的是滑点和手续费。订单流策略通常交易频率高,滑点和手续费的影响特别大。我一般按万分之二收手续费,滑点按1个tick算。你想想看,如果一个策略每天交易100次,每次手续费万二,一年下来手续费就能吃掉20%的收益。
| 参数项 | 建议值 | 说明 |
|---|---|---|
| 手续费 | 万分之二 | 按成交金额计算 |
| 滑点 | 1个tick | 按最小变动价位计算 |
| 最小交易量 | 1手 | 期货/股票的最小交易单位 |
| 数据精度 | 逐笔 | 不要用分钟级数据回测订单流策略 |
我的小技巧:回测时先跑一遍「理想环境」——没有手续费、没有滑点。看看策略本身有没有赚钱能力。如果有,再逐步加入真实成本。如果理想环境都不赚钱,那这策略基本没戏。
回测结果分析
回测跑完了,一堆数字摆在你面前。怎么看?我一般先看三个核心指标:
- 夏普比率:大于1算及格,大于2算优秀。低于0.5的,建议直接放弃。
- 最大回撤:不能超过20%。超过30%的策略,实盘时你根本拿不住。
- 交易次数:至少100次以上。次数太少,统计意义不大。
除了这些,我还会画一张资金曲线图。看曲线是不是平滑向上,有没有突然的暴跌。如果曲线像过山车一样,那策略的稳定性就有问题。
我记得有一次,一个Delta突破策略回测夏普比率高达3.5,但资金曲线图一看,最后三天赚了80%的利润。这说明什么?策略可能过度拟合了那几天的行情。去掉那三天,夏普直接掉到0.8。
注意:回测结果好不代表实盘也能赚钱。我见过太多回测曲线漂亮、实盘一塌糊涂的例子。原因通常是:过度拟合、未来函数、数据偏差。所以回测结果只能作为参考,不能作为信仰。
策略优化与参数调优
策略优化,说白了就是找一组最好的参数。但这里有个陷阱——过度优化。你让参数完美拟合历史数据,但未来行情一变,策略就失效了。
我常用的方法是「滚动优化」。把数据分成训练集和测试集,在训练集上找最优参数,然后在测试集上验证。如果训练集和测试集的结果差不多,说明参数比较稳健。如果训练集很好、测试集很差,那就是过度拟合了。
举个例子,一个Delta失衡策略有三个参数:失衡阈值、持仓时间、止损幅度。我会这样优化:
- 固定持仓时间和止损幅度,优化失衡阈值
- 固定失衡阈值和止损幅度,优化持仓时间
- 固定失衡阈值和持仓时间,优化止损幅度
- 把三个最优参数组合起来,在测试集上跑一遍
这样做的好处是,每次只优化一个参数,避免参数之间的相互干扰。我试过用网格搜索同时优化三个参数,结果找到的参数组合在测试集上表现很差。后来改成逐步优化,效果好了很多。
参数调优的黄金法则:参数越少越好。三个参数以内,容易找到稳健的组合。超过五个参数,基本就是过度拟合的温床。
最后,别忘了做「蒙特卡洛模拟」。把回测的交易顺序随机打乱,重新计算绩效。如果打乱后的结果跟原来差不多,说明策略的收益不是靠运气。如果打乱后收益大幅下降,那你的策略可能只是碰巧抓住了某几笔好交易。
嗯,回测系统搭建大概就这些。记住一句话:回测是为了发现策略的弱点,而不是证明策略的完美。带着找茬的心态去做回测,你才能做出真正能赚钱的策略。