WonderTrader / Backtest
wondertrader 回测怎么跑:调用链、回调时机与信号核对
回测是本框架里最省成本的一环:同一个引擎覆盖 CTA、SEL、HFT、UFT 与执行单元,Python 与 C++ 策略进同一套回测逻辑。但回测结果对不对,取决于三件事 —— 调用链有没有按官方顺序串、回调有没有在正确的时点触发、下单语义有没有理解错。本文逐项给出官方原文依据。
调用链:从建环境到释放
官方 demo 的顺序是固定的,跳过任何一步都可能出现「跑完了但没有输出」。
创建回测引擎并指定引擎类型
用回测引擎构造函数传入引擎类型(CTA / SEL / HFT / EXEC / UFT 之一)。预期得到一个尚未初始化环境的引擎对象。注意引擎类型决定了后续提交策略的接口名。
初始化环境
指定公共基础文件所在目录与回测配置文件。预期加载品种、合约、节假日、主力映射、交易时间模板、佣金等配置。基础文件缺失会在这一步直接失败,比到回测中段才发现便宜得多。
配置回测区间
用开始与结束时间两个参数限定回测范围,时间精确到分钟。预期限制后续回放的行情区间。
配置回测数据存储
指定存储模式(csv 或二进制形式)与数据存储根目录。预期决定从何处读历史行情;选 csv 时存储模块配置不生效。
提交配置
把上述配置提交生效,然后创建策略实例并提交给引擎。策略实例参数通常包括实例名、标的代码、K 线回溯条数、K 线周期与策略自身参数。
运行回测
执行回测,可选择同步或异步运行。预期在输出目录生成日志目录与结果目录。
做绩效分析并释放
把回测输出目录交给绩效分析模块,指定初始资金、无风险利率与年化交易日数,生成绩效报表;核对完成后释放回测资源。官方注明该绩效模块目前仅适用 CTA 策略。
四个回调,什么时候被调用
策略基类一共只有四个接口,其中重算是核心。时序理解错就会出现「信号到了但仓位没动」。
| 回调 | 触发时机 | 典型用途 | 常见误用 | 注意点 |
|---|---|---|---|---|
| 初始化回调 | 策略启动时调用一次 | 拉取所需历史 K 线、加载自定义数据、写初始化日志 | 把交易逻辑写在初始化里 | 拉取历史 K 线的动作会同时注册 K 线闭合与逐笔事件,这是激活后续回调的开关 |
| K 线闭合回调 | K 线闭合时自动调用 | 做需要感知其他标的闭合的响应逻辑 | 把它当作主计算入口 | 多标的同周期策略会在同一时刻被多次触发;触发顺序一般按初始化时拉取 K 线的先后顺序 |
| 逐笔回调 | 收到新 tick 时调用;回测中为模拟逐笔数据 | 使用日线策略时读取当日未闭合行情 | 在分钟级策略里也用逐笔做重算 | 用日线策略时当日 K 线尚未闭合,历史数据里没有当日数据,只能靠逐笔拿到最新值 |
| 重算回调 | CTA 引擎:主 K 线闭合且所有已订阅 K 线都闭合后触发一次;SEL 引擎:到达注册的重算时间时触发 | 策略核心逻辑,写在这里 | 在重算里做耗时 IO | 底层会保证触发前应当闭合的 K 线都已经触发了闭合回调 |
| 条件单(非回调,但影响时序) | 每次重算调用之前会清除上一轮设置的条件单 | 把限价与止价作为信号二次确认 | 以为条件单会跨多根 K 线长期有效 | 条件单生命周期仅在下一根主 K 线闭合之前;同时设置限价与止价时只有限价生效 |
| 会话开始 / 结束事件 | 回测框架对交易时段起止事件提供响应接口 | 时段相关的初始化与收尾 | 与重算回调混用 | 该能力来自官方更新日志记录的回测框架增强项 |
下单接口语义:和通用图表语言对齐
CTA 引擎的四个下单接口,官方说明其语义与常见图表软件的买、卖、卖空、买平一致。理解这一点能避免大量「平不干净」的问题。
| 接口 | 当当前仓位满足条件时 | 当当前仓位不满足时 | 适用场景 | 注意点 |
|---|---|---|---|---|
| 开多 | 持仓大于等于 0,直接开多指定手数 | 持有空头,先平掉空头再开多指定手数 | 看多入场或空翻多 | 它会自动反手,不是纯加仓 |
| 平多 | 持仓大于等于指定手数,平掉对应手数 | 持仓小于指定手数,平掉全部多头 | 分批止盈 | 手数超填时不会报错,只会平完为止,容易误判 |
| 开空 | 持仓小于等于 0,直接开空指定手数 | 持有多头,先平掉多头再开空指定手数 | 看空入场或多翻空 | 股票不可做空,需在策略里自行屏蔽 |
| 平空 | 空头持仓大于等于指定手数,平掉对应手数 | 空头持仓小于指定手数,平掉全部空头 | 空头分批止盈 | 与平多对称,同样不做超量校验 |
| 设置目标仓位 | 直接把仓位设成目标值 | 不适用 | 尾盘清仓、按净头寸调仓 | 官方文档的日内策略示例用该方式实现尾盘清仓,比反复调用开平仓更直观 |
| 条件单参数 | 最新价满足限价或止价条件才触发信号 | 不满足则不触发 | 突破确认后入场 | 官方口径:限价与止价更像信号的二次确认;两者同时设置时只有限价生效 |
参数优化:三类参数与官方示例的读法
优化器用多进程并行回测,最后汇总结果。官方给出了一套完整的示例流程,这里把方法和结论拆开看。
| 参数类型 | 用法 | 适合的参数 | 资源开销 | 注意点 |
|---|---|---|---|---|
| 固定参数 | 遍历过程中不变 | K 线周期、回溯条数、标的代码 | 低 | 把不参与寻优的参数固定住,能显著减少组合数 |
| 数值可变参数 | 给定起点、终点与步长 | 通道系数、止盈止损点数等数值型参数 | 随步长线性增长 | 步长过细会放大组合数并与并行进程数争夺 CPU |
| 列表可变参数 | 给定候选列表 | 标的代码、周期等离散取值 | 等于列表长度 | 适合枚举而非连续寻优 |
| 并行进程数 | 启动时设定工作进程数 | 不适用 | 直接影响总耗时 | 官方示例建议与 CPU 核心数匹配;官方桌面端案例显示 8 核并行 100 组参数约 118 秒,而单次回测约 35 秒 |
| 结果汇总 | 输出汇总文件与标记文件 | 不适用 | 低 | 可按收益风险比、卡玛率等指标排序后人工挑选,不要只看单项最优 |
| 官方示例给出的结论 | 具体内容 | 能怎么用 | 不能怎么用 |
|---|---|---|---|
| 基础参数寻优 | 某个突破类策略在股指期货主力合约上,一组参数在官方示例区间内的绩效分析显示较高的年化收益与较低回撤 | 作为「优化器能跑出可用参数」的流程参照 | 不能当作收益预期;官方未公布样本期外的验证结果 |
| 加入止盈的影响 | 官方示例中止盈逻辑对收益风险比有明显提升,且在某个点位区间趋于稳定 | 理解止盈参数对指标的影响方向 | 不能推广为「所有策略加止盈都更好」 |
| 加入止损的影响 | 官方示例中止损逻辑并未带来正向改善,反而牺牲了部分收益 | 理解止损不是必选项,需要按策略验证 | 不能推广为「止损无用」;官方也说明了该结果可能与止损区间设置有关 |
绩效与信号:三个地方可以看
只看绩效指标容易漏掉逻辑错误,官方为此专门提供了信号查看手段。三层输出配合看,问题定位最快。
| 输出位置 | 能看到什么 | 什么时候用 | 注意点 |
|---|---|---|---|
| 绩效报表文件 | 各项回测指标与资金曲线,可输出为表格文件 | 横向比较不同参数或不同策略 | 官方注明该绩效模块目前仅适用 CTA 策略;SEL、HFT 需另找口径 |
| 回测输出目录 | 按策略实例名分目录存放的资金、成交与持仓数据 | 核对逐日资金与成交明细 | 目录结构由策略实例名决定,命名混乱会让结果难找 |
| 信号文件 | 回测过程自动生成的买卖信号明细 | 逐笔核对信号与逻辑是否一致 | 官方文档提到可通过成交与信号两个 csv 文件查看 |
| 图形化信号查看器 | 把信号叠加在行情上做回放分析,支持自定义指标 | 复盘买卖点分布 | 它依赖数据伺服提供基础数据访问,需要先配好数据目录与基础文件 |
| 控制台在线回测 | 在控制台里提交回测并查看进度与结果 | 在服务端统一管理回测任务 | 需要先配置数据伺服,官方对在线回测管理模块有「可能取消、慎用」的提示 |
回测排查表
回测的问题大多不报错,只表现为「数字不对」。按现象对照语义与配置,比改代码更快。
| 现象 | 可能原因 | 核对方法 | 处理方向 |
|---|---|---|---|
| 回测跑完但没有任何成交 | 下单接口与持仓语义不匹配,或条件单在下一根 K 线前被清除 | 在重算里打日志,打印当前仓位与信号值 | 对照下单接口语义表,确认开平逻辑与仓位方向一致 |
| 信号出现了但仓位没变 | 信号写在闭合回调里,或条件单未满足触发条件 | 确认信号是在重算回调里发出的 | 把核心逻辑集中到重算回调;条件单参数需复核 |
| 持仓方向相反 | 开仓接口本身会自动反手 | 对照接口语义表确认反手行为 | 需要单纯加仓时用目标仓位接口,或先判断当前方向 |
| 回测绩效与预期差距很大 | 佣金费率或合约倍数配置错误 | 核对费率文件里该品种的开仓、平仓、平今费用与计费方式 | 费率错误会系统性扭曲结果,优先排查 |
| 多标的回测明显变慢 | 用 CTA 引擎跑了本该由 SEL 承担的多标的计算 | 统计标的数与单次重算耗时 | 换用 SEL 引擎,或收敛标的池 |
| 参数优化结果好得不真实 | 过拟合,或参数区间被反复挑过 | 看参数邻域内绩效是否骤降 | 官方示例也提示需要关注过拟合与样本外验证;本站不提供任何收益判断 |
常见问题
回测相关的问题在官方文档「回测自己的策略」「优化自己的策略」「策略模块详解」中均有出处。
四个引擎都能回测吗?
官方的说法是:除 CTA 与 SEL 策略可以回测外,HFT 策略、UFT 策略与执行单元也能回测。回测引擎通过配置项切换目标引擎,因此同一份行情与配置可以用于不同类型策略的验证。但要注意绩效分析模块官方注明目前仅适用 CTA 策略,其他引擎的指标口径需自己处理或参考官方示例。
为什么必须把核心逻辑写在重算回调里?
因为重算才是「本轮可以决策」的时点。CTA 引擎下,重算只会在主 K 线闭合、且所有已订阅 K 线都正常闭合之后触发一次;SEL 引擎下,则要到注册的重算时间才触发。底层会保证触发前应当闭合的 K 线已经触发过闭合回调。把逻辑写在闭合回调里,多标的场景会被多次触发,逻辑与盈亏都会对不上。
条件单能跨多根 K 线有效吗?
不能。官方明确:CTA 引擎的条件单在每次重算调用之前都会被清除,也就是说条件单的生命周期仅在下一根主 K 线闭合之前。这样的设计是为了把策略简化到只需要实现重算就可以了,官方说明该机制参考了通用图表软件的做法。需要长期挂单的逻辑要自己在策略里维护状态。
回测数据用 csv 还是二进制?
取决于数据来源与规模。官方说明回测配置的存储模式可选 csv 或二进制形式(二进制两种写法同义)。csv 的好处是外部数据可直接用,首次读取后框架会把它转成自有压缩格式以便后续快速读取;代价是 csv 体积大、首次读取开销高。数据量上规模后建议转成自有格式。
参数优化的结果可以直接上实盘吗?
不建议直接上。官方示例本身也提示了过拟合与样本外验证的问题,也就是说优化出的参数需要额外验证。官方示例里演示的是「先找基础参数、再叠加止盈、最后联合优化」的流程,结论也只是该示例区间内的历史表现。任何收益判断都应由你自己基于样本外测试得出,本文不做收益承诺。
回测能不能用 EasyClaw 代替?
不能等同。EasyClaw 侧存在研究分析类技能,可做向量化研究、风险指标与组合优化这类工作,适合在写策略前验证想法;但本框架的回测是事件驱动、与实盘共用同一套引擎语义,能做到研究口径与实盘口径一致,这一点是研究类技能不提供的。两者之间没有已证实的集成关系,选择哪种取决于你的目标口径。