WonderTrader / Backtest

wondertrader 回测怎么跑:调用链、回调时机与信号核对

回测是本框架里最省成本的一环:同一个引擎覆盖 CTA、SEL、HFT、UFT 与执行单元,Python 与 C++ 策略进同一套回测逻辑。但回测结果对不对,取决于三件事 —— 调用链有没有按官方顺序串、回调有没有在正确的时点触发、下单语义有没有理解错。本文逐项给出官方原文依据。

入口:回测引擎 + 引擎类型可切:cta/sel/hft/exec/uft存储:csv 或二进制绩效:可输出 Excel
配置回测配置文件
建环境回测引擎 + 引擎类型
跑回测提交策略后运行
看结果绩效报表 / 信号查看器
回测调用链示意(依据官方文档「回测自己的策略」与「策略模块详解」);示意非官方流程图,接口签名以官方文档为准。
Chain

调用链:从建环境到释放

官方 demo 的顺序是固定的,跳过任何一步都可能出现「跑完了但没有输出」。

  1. 创建回测引擎并指定引擎类型

    用回测引擎构造函数传入引擎类型(CTA / SEL / HFT / EXEC / UFT 之一)。预期得到一个尚未初始化环境的引擎对象。注意引擎类型决定了后续提交策略的接口名。

  2. 初始化环境

    指定公共基础文件所在目录与回测配置文件。预期加载品种、合约、节假日、主力映射、交易时间模板、佣金等配置。基础文件缺失会在这一步直接失败,比到回测中段才发现便宜得多。

  3. 配置回测区间

    用开始与结束时间两个参数限定回测范围,时间精确到分钟。预期限制后续回放的行情区间。

  4. 配置回测数据存储

    指定存储模式(csv 或二进制形式)与数据存储根目录。预期决定从何处读历史行情;选 csv 时存储模块配置不生效。

  5. 提交配置

    把上述配置提交生效,然后创建策略实例并提交给引擎。策略实例参数通常包括实例名、标的代码、K 线回溯条数、K 线周期与策略自身参数。

  6. 运行回测

    执行回测,可选择同步或异步运行。预期在输出目录生成日志目录与结果目录。

  7. 做绩效分析并释放

    把回测输出目录交给绩效分析模块,指定初始资金、无风险利率与年化交易日数,生成绩效报表;核对完成后释放回测资源。官方注明该绩效模块目前仅适用 CTA 策略。

配置可被代码覆盖:官方说明回测配置文件里的值是默认值,起模板作用,可以在入口脚本里通过代码覆盖。也就是说同一份配置文件可以服务多组回测区间与存储路径,不必为每次回测复制一份配置。
Callbacks

四个回调,什么时候被调用

策略基类一共只有四个接口,其中重算是核心。时序理解错就会出现「信号到了但仓位没动」。

回调触发时机典型用途常见误用注意点
初始化回调策略启动时调用一次拉取所需历史 K 线、加载自定义数据、写初始化日志把交易逻辑写在初始化里拉取历史 K 线的动作会同时注册 K 线闭合与逐笔事件,这是激活后续回调的开关
K 线闭合回调K 线闭合时自动调用做需要感知其他标的闭合的响应逻辑把它当作主计算入口多标的同周期策略会在同一时刻被多次触发;触发顺序一般按初始化时拉取 K 线的先后顺序
逐笔回调收到新 tick 时调用;回测中为模拟逐笔数据使用日线策略时读取当日未闭合行情在分钟级策略里也用逐笔做重算用日线策略时当日 K 线尚未闭合,历史数据里没有当日数据,只能靠逐笔拿到最新值
重算回调CTA 引擎:主 K 线闭合且所有已订阅 K 线都闭合后触发一次;SEL 引擎:到达注册的重算时间时触发策略核心逻辑,写在这里在重算里做耗时 IO底层会保证触发前应当闭合的 K 线都已经触发了闭合回调
条件单(非回调,但影响时序)每次重算调用之前会清除上一轮设置的条件单把限价与止价作为信号二次确认以为条件单会跨多根 K 线长期有效条件单生命周期仅在下一根主 K 线闭合之前;同时设置限价与止价时只有限价生效
会话开始 / 结束事件回测框架对交易时段起止事件提供响应接口时段相关的初始化与收尾与重算回调混用该能力来自官方更新日志记录的回测框架增强项
Order API

下单接口语义:和通用图表语言对齐

CTA 引擎的四个下单接口,官方说明其语义与常见图表软件的买、卖、卖空、买平一致。理解这一点能避免大量「平不干净」的问题。

接口当当前仓位满足条件时当当前仓位不满足时适用场景注意点
开多持仓大于等于 0,直接开多指定手数持有空头,先平掉空头再开多指定手数看多入场或空翻多它会自动反手,不是纯加仓
平多持仓大于等于指定手数,平掉对应手数持仓小于指定手数,平掉全部多头分批止盈手数超填时不会报错,只会平完为止,容易误判
开空持仓小于等于 0,直接开空指定手数持有多头,先平掉多头再开空指定手数看空入场或多翻空股票不可做空,需在策略里自行屏蔽
平空空头持仓大于等于指定手数,平掉对应手数空头持仓小于指定手数,平掉全部空头空头分批止盈与平多对称,同样不做超量校验
设置目标仓位直接把仓位设成目标值不适用尾盘清仓、按净头寸调仓官方文档的日内策略示例用该方式实现尾盘清仓,比反复调用开平仓更直观
条件单参数最新价满足限价或止价条件才触发信号不满足则不触发突破确认后入场官方口径:限价与止价更像信号的二次确认;两者同时设置时只有限价生效
Optimizer

参数优化:三类参数与官方示例的读法

优化器用多进程并行回测,最后汇总结果。官方给出了一套完整的示例流程,这里把方法和结论拆开看。

参数类型用法适合的参数资源开销注意点
固定参数遍历过程中不变K 线周期、回溯条数、标的代码把不参与寻优的参数固定住,能显著减少组合数
数值可变参数给定起点、终点与步长通道系数、止盈止损点数等数值型参数随步长线性增长步长过细会放大组合数并与并行进程数争夺 CPU
列表可变参数给定候选列表标的代码、周期等离散取值等于列表长度适合枚举而非连续寻优
并行进程数启动时设定工作进程数不适用直接影响总耗时官方示例建议与 CPU 核心数匹配;官方桌面端案例显示 8 核并行 100 组参数约 118 秒,而单次回测约 35 秒
结果汇总输出汇总文件与标记文件不适用可按收益风险比、卡玛率等指标排序后人工挑选,不要只看单项最优
官方示例给出的结论具体内容能怎么用不能怎么用
基础参数寻优某个突破类策略在股指期货主力合约上,一组参数在官方示例区间内的绩效分析显示较高的年化收益与较低回撤作为「优化器能跑出可用参数」的流程参照不能当作收益预期;官方未公布样本期外的验证结果
加入止盈的影响官方示例中止盈逻辑对收益风险比有明显提升,且在某个点位区间趋于稳定理解止盈参数对指标的影响方向不能推广为「所有策略加止盈都更好」
加入止损的影响官方示例中止损逻辑并未带来正向改善,反而牺牲了部分收益理解止损不是必选项,需要按策略验证不能推广为「止损无用」;官方也说明了该结果可能与止损区间设置有关
风险提示:以上均为官方文档示例中的历史回测结果,仅用于说明优化流程与参数影响方向,不代表任何未来表现,也不构成投资建议。回测本身存在过拟合与样本内外差异问题,是否使用以及如何使用,请自行判断并以官方文档为准。
Output

绩效与信号:三个地方可以看

只看绩效指标容易漏掉逻辑错误,官方为此专门提供了信号查看手段。三层输出配合看,问题定位最快。

输出位置能看到什么什么时候用注意点
绩效报表文件各项回测指标与资金曲线,可输出为表格文件横向比较不同参数或不同策略官方注明该绩效模块目前仅适用 CTA 策略;SEL、HFT 需另找口径
回测输出目录按策略实例名分目录存放的资金、成交与持仓数据核对逐日资金与成交明细目录结构由策略实例名决定,命名混乱会让结果难找
信号文件回测过程自动生成的买卖信号明细逐笔核对信号与逻辑是否一致官方文档提到可通过成交与信号两个 csv 文件查看
图形化信号查看器把信号叠加在行情上做回放分析,支持自定义指标复盘买卖点分布它依赖数据伺服提供基础数据访问,需要先配好数据目录与基础文件
控制台在线回测在控制台里提交回测并查看进度与结果在服务端统一管理回测任务需要先配置数据伺服,官方对在线回测管理模块有「可能取消、慎用」的提示
Troubleshooting

回测排查表

回测的问题大多不报错,只表现为「数字不对」。按现象对照语义与配置,比改代码更快。

现象可能原因核对方法处理方向
回测跑完但没有任何成交下单接口与持仓语义不匹配,或条件单在下一根 K 线前被清除在重算里打日志,打印当前仓位与信号值对照下单接口语义表,确认开平逻辑与仓位方向一致
信号出现了但仓位没变信号写在闭合回调里,或条件单未满足触发条件确认信号是在重算回调里发出的把核心逻辑集中到重算回调;条件单参数需复核
持仓方向相反开仓接口本身会自动反手对照接口语义表确认反手行为需要单纯加仓时用目标仓位接口,或先判断当前方向
回测绩效与预期差距很大佣金费率或合约倍数配置错误核对费率文件里该品种的开仓、平仓、平今费用与计费方式费率错误会系统性扭曲结果,优先排查
多标的回测明显变慢用 CTA 引擎跑了本该由 SEL 承担的多标的计算统计标的数与单次重算耗时换用 SEL 引擎,或收敛标的池
参数优化结果好得不真实过拟合,或参数区间被反复挑过看参数邻域内绩效是否骤降官方示例也提示需要关注过拟合与样本外验证;本站不提供任何收益判断
FAQ

常见问题

回测相关的问题在官方文档「回测自己的策略」「优化自己的策略」「策略模块详解」中均有出处。

四个引擎都能回测吗?

官方的说法是:除 CTA 与 SEL 策略可以回测外,HFT 策略、UFT 策略与执行单元也能回测。回测引擎通过配置项切换目标引擎,因此同一份行情与配置可以用于不同类型策略的验证。但要注意绩效分析模块官方注明目前仅适用 CTA 策略,其他引擎的指标口径需自己处理或参考官方示例。

为什么必须把核心逻辑写在重算回调里?

因为重算才是「本轮可以决策」的时点。CTA 引擎下,重算只会在主 K 线闭合、且所有已订阅 K 线都正常闭合之后触发一次;SEL 引擎下,则要到注册的重算时间才触发。底层会保证触发前应当闭合的 K 线已经触发过闭合回调。把逻辑写在闭合回调里,多标的场景会被多次触发,逻辑与盈亏都会对不上。

条件单能跨多根 K 线有效吗?

不能。官方明确:CTA 引擎的条件单在每次重算调用之前都会被清除,也就是说条件单的生命周期仅在下一根主 K 线闭合之前。这样的设计是为了把策略简化到只需要实现重算就可以了,官方说明该机制参考了通用图表软件的做法。需要长期挂单的逻辑要自己在策略里维护状态。

回测数据用 csv 还是二进制?

取决于数据来源与规模。官方说明回测配置的存储模式可选 csv 或二进制形式(二进制两种写法同义)。csv 的好处是外部数据可直接用,首次读取后框架会把它转成自有压缩格式以便后续快速读取;代价是 csv 体积大、首次读取开销高。数据量上规模后建议转成自有格式。

参数优化的结果可以直接上实盘吗?

不建议直接上。官方示例本身也提示了过拟合与样本外验证的问题,也就是说优化出的参数需要额外验证。官方示例里演示的是「先找基础参数、再叠加止盈、最后联合优化」的流程,结论也只是该示例区间内的历史表现。任何收益判断都应由你自己基于样本外测试得出,本文不做收益承诺。

回测能不能用 EasyClaw 代替?

不能等同。EasyClaw 侧存在研究分析类技能,可做向量化研究、风险指标与组合优化这类工作,适合在写策略前验证想法;但本框架的回测是事件驱动、与实盘共用同一套引擎语义,能做到研究口径与实盘口径一致,这一点是研究类技能不提供的。两者之间没有已证实的集成关系,选择哪种取决于你的目标口径。

回测通过,才谈实盘

实盘由数据组件与交易进程协同完成,启动顺序和两处配置一致性是当天最容易出问题的环节。