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失衡策略有三个参数:失衡阈值、持仓时间、止损幅度。我会这样优化:

  1. 固定持仓时间和止损幅度,优化失衡阈值
  2. 固定失衡阈值和止损幅度,优化持仓时间
  3. 固定失衡阈值和持仓时间,优化止损幅度
  4. 把三个最优参数组合起来,在测试集上跑一遍

这样做的好处是,每次只优化一个参数,避免参数之间的相互干扰。我试过用网格搜索同时优化三个参数,结果找到的参数组合在测试集上表现很差。后来改成逐步优化,效果好了很多。

参数调优的黄金法则:参数越少越好。三个参数以内,容易找到稳健的组合。超过五个参数,基本就是过度拟合的温床。

最后,别忘了做「蒙特卡洛模拟」。把回测的交易顺序随机打乱,重新计算绩效。如果打乱后的结果跟原来差不多,说明策略的收益不是靠运气。如果打乱后收益大幅下降,那你的策略可能只是碰巧抓住了某几笔好交易。

嗯,回测系统搭建大概就这些。记住一句话:回测是为了发现策略的弱点,而不是证明策略的完美。带着找茬的心态去做回测,你才能做出真正能赚钱的策略。

订单流回测系统架构图 数据层 逐笔成交数据 订单簿快照 Delta序列 失衡数据 策略层 Delta突破策略 失衡反转策略 累积Delta背离 POC追踪 评估层 夏普比率 最大回撤 胜率/盈亏比 资金曲线 ... 参数调优反馈 三层架构:数据驱动策略,策略产生信号,评估反馈优化

交易系统化学习资料 微信Strategy888888