CADRSTECH BLOG
首页关于
CADRS TECH BLOG

探索技术世界的思考与实践,记录编程之旅的点滴感悟

© 2026 CADRS. 琼ICP备19000754号-1

首页2026-03-01:把回测跑通,比发明指标更重要
工作日志

2026-03-01:把回测跑通,比发明指标更重要

2026年3月1日 14:006 min read0

2026-03-01:把回测跑通,比发明指标更重要

今天的主线不是“又造了几个策略”,而是把回测与交易执行这条管线拧得更可靠了一点:执行器不再用业务异常当返回值,回测器也学会了“先本地、再容器”的降级逻辑。结果很现实——策略 v11~v20 大多跑输了买入持有,但至少我们更接近一个能持续迭代的实验台。

1) 交易执行器:从抛异常改成统一返回协议

把 trade_executor 的 buy/sell 从“抛业务异常”改成“返回统一结构体”,策略侧改为显式检查交易结果。

这类改动看起来偏工程,但它解决的是量化里最常见的坑:

  • 异常既是控制流又是业务语义时,策略很容易把“交易失败/部分成交/资金不足”等情况当成“程序崩了”。
  • 统一返回协议后,策略能把失败当作一种可被记录、可被回测复盘的事件。

对应提交:feat(trade_executor): 统一交易执行器的返回协议并更新策略。

2) 回测执行:本地优先 + 失败自动回退到 docker

在 run_backtest.py 里增加了执行方式的改进:

  • 优先尝试 宿主机 python3 执行
  • 失败时自动 回退到 docker exec
  • 并增加更清晰的日志提示与错误处理

随后又补了一个可选参数,让“是否允许回退”可以显式控制。

这其实是在修一条关键的“实验吞吐率”曲线:当环境偶发漂移(依赖、路径、权限、容器状态)时,不至于让整轮策略迭代停摆。

3) 策略侧:新增 v15~v20,并整理回测报告

今天新增并跑了 v15v20(以及把 v11v13、v15v17、v12/v18/v19/v20 做了回测报告整理)。从结果看,v11v20 在当前口径下整体表现不佳:

v11~v20 关键指标(回测结果摘录)

版本策略收益率买入持有超额收益
v1179.43%322.24%-242.81%
v12104.54%322.24%-217.70%
v1395.83%322.24%-226.41%
v15155.70%322.24%-166.54%
v16283.89%322.24%-38.34%
v17276.46%322.24%-45.78%
v18217.09%322.24%-105.15%
v19251.54%322.24%-70.70%
v20272.74%322.24%-49.50%

这张表的意义不在于“今天亏了多少”,而在于一个很直白的信号:

  • 在这个数据段/口径下,买入持有就是强基准
  • 这些“战术增强/状态切换/锚定预算”类策略,如果没有足够强的过滤器和退出纪律,很容易变成“少赚多赔的折腾”

其中 v16(-38.34%)、v17(-45.78%)相对没那么惨,但依然没跑赢基准。

4) 审计型策略:v193 交易执行一致性探针 + 回测起始日期下移

补了一支“探针策略” v193,用来审计交易执行器的账务一致性;同时把回测起始日期从 2019-01-01 调整为 2018-01-01。

这一步的价值是:

  • 回测越长越容易暴露“边界条件 bug”(分红复权、停牌、极端波动、数据缺失)
  • 探针策略能把“执行器是否自洽”从主策略里拆出来,减少把研究时间浪费在错误的资产曲线上

Key metrics / outcomes

  • 交易执行器返回协议统一(策略侧适配完成)
  • 回测器支持本地优先 + docker 回退(并提供显式开关)
  • 新增策略版本:v15~v20
  • v11~v20 回测汇总:整体未跑赢买入持有(v16 相对最好,仍为负超额)
  • 新增审计探针 v193,并将回测起始日扩展到 2018

Lessons & mistakes

  • 先把管线跑稳。策略再聪明,如果执行器/回测器不稳,研究得到的“结论”就是噪声。
  • 别被“策略收益率”骗了。在强趋势标的上,跑不过买入持有的“精致复杂”往往只是成本更高的自我安慰。

Next steps

  • 把 v16/v17 这种“相对不差但仍负超额”的策略拆解:到底是入场过滤不够、退出太早,还是仓位预算逻辑有系统性偏差
  • 给回测结果整理脚本加一个“自动 Top-N / Bottom-N + 关键交易片段摘录”,减少人工翻报告
  • 用 v193 探针跑一轮更长区间,确认执行器在极端场景下仍然账务一致
返回文章列表