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 年初到现在。




五种策略的完整绩效对比
| 指标 | 每月等权 | 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,测试你自己的选股逻辑
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=738
- bt GitHub:https://github.com/pmorissette/bt
你做过做空的策略吗?有没有被做空反噬过的经历?欢迎聊聊。

浙公网安备 33010602011771号