bt实战:五块Algo积木拼出五种策略,SMA做空杠杆回撤98%的惨痛教训

一个用"积木"搭策略的回测框架——五块积木拼出五种策略,结果天差地别

bt 是一个轻量级 Python 回测库,它的设计思路和之前写过的所有框架都不一样。大多数回测框架是"事件驱动"的——策略是一个类,你在 next() 方法里写交易逻辑。bt 是"管道"式的——策略是一串 Algo 块的链式组合:RunMonthly → SelectAll → WeighEqually → Rebalance,四块积木拼在一起就是一个完整的策略。换一个 SelectAlgo 就换了一种选股逻辑,换一个 WeighAlgo 就换了一种仓位分配方式。

我拿它在六只美股上用五种不同的 Algo 组合跑了 8.5 年。结果差异大到令人难以置信:简单的每月等权再平衡年化 28.87%,夏普 1.02。而加了做空杠杆的 SMA 交叉策略年化 -23.54%,最大回撤 -98.04%——几乎亏光了。同一个标的池、同一个时间段,策略之间的绩效差距超过 50 个百分点。

起步

EasyClaw 官网下载安装。不需要手动装 bt、不需要配 ffn 依赖。

打开后左侧找「Skill」→「Skill Creator」。灰显的话去「设置 → 通用」打开「开发者模式」重启。

创建 Skill

在 Skill Creator 里告诉 EasyClaw:

帮我把 GitHub 上的 bt(https://github.com/pmorissette/bt)做成一个回测 Skill。我希望输入一组股票代码、起止日期和 Algo 策略配置,自动跑回测并对比多个策略的绩效——包括年化收益、夏普、最大回撤、年度收益等完整统计。

Skill 创建好后:

用 bt 回测六只美股,对比五种策略:每月等权再平衡、SMA50以上持有、SMA多空交叉、波动率倒数加权、标普基准。从 2018 年初到现在。

image

bt_equity_curves

bt_return_dist

bt_annual_returns

五种策略的完整绩效对比

指标每月等权SMA50以上SMA交叉波动率倒数标普基准
总收益 +776% +416% -90% +602% +213%
CAGR 28.87% 21.15% -23.54% 25.59% 14.26%
夏普 1.02 0.88 0.60 0.96 0.79
索提诺 1.47 1.30 0.84 1.38 1.12
最大回撤 -47.89% -33.70% -98.04% -44.84% -33.72%
卡玛比率 0.60 0.63 -0.24 0.57 0.42
年度胜率 87.5% 75.0% 37.5% 87.5% 87.5%
12月胜率 82.6% 77.2% 45.7% 83.7% 85.9%

近期表现——谁在最近三个月赚钱

 每月等权SMA50以上SMA交叉波动率倒数标普
月至今 +2.31% -1.96% -8.71% +2.47% -1.15%
近 3 月 -0.84% -13.40% +1.74% +0.56% +4.46%
年初至今 +1.36% -14.63% -13.02% +1.65% +8.83%
近 1 年 +15.71% -3.30% +22.68% +15.32% +17.68%

SMA50 策略最近表现极差——近三个月跌了 13.4%、年初至今跌了 14.6%。原因是近期美股出现了一定的风格切换,SMA50 持有的标的大部分在下跌。

为什么 SMA 交叉策略亏了 98%

这是一个教科书级别的反面案例。SMA 交叉策略的回撤不是 -50%、不是 -70%,而是 -98.04%——几乎亏光了。原因是这个策略使用了做空逻辑:当 SMA50 < SMA200 时,仓位变成 -1(做空),而不是 0(空仓)。

在 2018-2026 这个区间,美股整体是牛市。做空牛市的代价是毁灭性的。SMA 交叉策略年化 -23.54%,但夏普仍然是 0.60——说明它在某些时间段(下跌行情中)能赚钱,但总体上做空牛市的损失远远超过了做空的收益。

对比 SMA50 以上持有策略——同样是基于均线,但只做多不做空。它在同一个区间赚了 416%,回撤仅 -33.7%。两者的**区别是:做空开关。关掉做空,从 -98% 变成 +416%。

bt 的 Algo 管道——搭积木式策略构建

bt 最核心的设计是Algo 管道。一个完整的策略不是写在一个类里,而是用几个独立的 Algo 块链式拼接:

Algo 块作用示例
RunAlgo 设置执行频率 RunMonthly()——每月跑一次
SelectAlgo 选股 SelectAll()——选所有;SelectWhere(data>sma50)——选价格高于均线的
WeighAlgo 分配权重 WeighEqually()——等权;WeighInvVol()——波动率倒数加权
Rebalance 执行再平衡 Rebalance()——按目标权重调仓

这种设计的最大好处是Algo 块可以复用。RunMonthly 搭配 SelectAll 搭配 WeighEqually 是"每月等权再平衡";同样的 RunMonthly,把 SelectAll 换成 SelectWhere 就变成了"SMA50 以上持有";再加上 WeighInvVol 就是"低波动精选"。换一个 WeighAlgo 不需要改动其他任何代码。

这和之前写过的 Backtrader(事件驱动、策略是一个类)形成了鲜明对比——bt 更适合"快速验证多种选股和权重方案的组合",Backtrader 更适合"精细化控制每笔交易的逻辑"。

常见报错

错误原因解决方法
Algo 管道返回空结果 SelectWhere 条件太严格,没有任何标入选 放宽选股条件
绩效统计中部分指标为 NaN 策略在回测期内没有任何交易 检查 Algo 组合是否合理

下一步

  • 把 SMA 交叉策略的做空开关关掉,对比做多和做空两个版本在同一区间的表现差异
  • 试试 bt 的自定义 Algo——自己写一个 SelectAlgo 或 WeighAlgo,测试你自己的选股逻辑

资源链接:

你做过做空的策略吗?有没有被做空反噬过的经历?欢迎聊聊。

posted @ 2026-07-28 09:55  PC修复电脑医生  阅读(4)  评论(0)    收藏  举报