Backtesting.py实战:用SMA双均线回测苹果11.5年,101笔交易为何跑输买入持有1000%
一个 pip install 就能跑的量化回测库
Backtesting.py 是一个轻量级 Python 回测库,不需要 C++ 编译器、不需要 Docker、一个 pip install 就能跑。我拿它搭配 SMA 10/30 双均线策略回测了苹果过去 11.5 年的数据——101 笔交易、胜率 35.6%、总收益 +32.8%——但同期买入持有不动的话,收益是 +1,039%。
本文用自然语言驱动的方式,把从安装到跑出 30+ 项绩效指标的完整报告压缩到了几分钟。最终产出是一个交互式 HTML 图表、一份逐笔交易 CSV、一份资金曲线 CSV 和一个可以独立运行的完整回测脚本。如果你正在找一款轻量的回测工具来验证策略想法,或者想知道为什么某些策略在超级牛股上反而不如不动,这篇文章应该对你有帮助。
起步:只需要装一个东西
从 EasyClaw 官网下载并安装。不需要手动 pip install backtesting、不需要装 Bokeh、不需要自己找数据源——这些后面都会自动处理。
打开之后,左侧找到「Skill」→「Skill Creator」。如果灰显点不了,去「设置 → 通用」打开「开发者模式」,重启就行。
| 问题 | 解决方法 |
|---|---|
| Skill Creator 灰显 | 启用开发者模式,重启 |
| 网络连接失败 | 检查代理设置 |
先把回测跑起来
打开 EasyClaw 的 Skill Creator,直接用自然语言告诉它你想做什么:
帮我把 GitHub 上的 Backtesting.py(https://github.com/kernc/backtesting.py)做成一个回测 Skill。我希望输入股票代码、起止日期和两个均线参数就能跑 SMA 交叉策略回测,输出 Bokeh 交互图表、逐笔交易明细和资金曲线 CSV。
就这一句话。EasyClaw 会自动去 GitHub 拉代码、分析项目结构、搞清楚 Backtest 类和 Strategy 基类的调用方式,然后把这个流程封装成一个可以直接用的 Skill。不需要手动配环境、不需要写策略代码、不需要折腾数据格式——这些它都自动处理了。
Skill 创建好之后,在对话框里输入:
用 Backtesting.py 回测 AAPL,从 2015 年初到 2026 年 7 月,SMA 快线 10 日、慢线 30 日
回测结果:101 笔交易,跑输买入持有 1000%
上面那条命令跑完,你会得到一份 30+ 指标的完整绩效报表。最扎眼的数据在这儿:
| 类别 | 指标 | 值 | 怎么看 |
|---|---|---|---|
| 收益 | 回测区间 | 2015-01-02 → 2026-07-23(11.5年) | 覆盖了完整的牛熊周期 |
| 总收益率 | +32.81% | 绝对收益看起来还行…… | |
| 买入持有收益 | +1,039.37% | ……但如果你什么都不做,赚了十倍 | |
| CAGR | 2.49% | 年化连通胀都跑不赢 | |
| 风险 | 最大回撤 | -55.12% | 腰斩级别 |
| 最大回撤持续期 | 2,151 天(近6年) | 回撤恢复时间极长 | |
| 年化波动率 | 27.88% | 波动很大 | |
| 风险调整 | 夏普比率 | 0.089 | 几乎为零——承担的风险基本没换来回报 |
| 卡玛比率 | 0.045 | 回撤风险远超收益 | |
| Alpha | 68.55% | Alpha 虽高但 Beta 是负的(-0.03),没帮上忙 | |
| 交易 | 总交易次数 | 101 | 远多于之前茅台策略的7笔 |
| 胜率 | 35.64% | 约1/3的交易盈利 | |
| 利润因子 | 1.24 | 勉强为正 | |
| 最佳/最差单笔 | +53.15% / -14.39% | 盈亏比尚可 |

图表里能看到三条信息:上面的 OHLC 蜡烛图叠加了 SMA 10(橙)和 SMA 30(蓝),下面跟着成交量柱子;中间的权益曲线标注了每笔买卖点(绿色三角是买入、红色倒三角是卖出);最下面是持仓状态的变化。在浏览器里打开,鼠标悬停可以看每个数据点的具体数值。
为什么策略跑输了买入持有?
这不是 Backtesting.py 的问题,也不是策略代码写错了。问题出在标的本身。
过去 11.5 年,苹果涨了十倍。对于这种长期单边上涨的超级牛股,任何择时策略都会因为频繁踏空而跑输简单持有——你卖出的每一个时点,后来看都是错的。策略赚的 32.8% 里面,大部分可能是抓住了一段上涨,但错过了另外九段。
作为对比,同一套 SMA 交叉策略在谷歌上跑出来的结果是 +462% vs 买入持有 +607%,差距小得多。不同标的对均线策略的适配度天差地别——如果标的本身是长期单边上涨的,择时就是不划算的;如果标的是大区间震荡的,择时才有可能跑赢。
还有一个容易被忽略的数据:最大回撤持续了 2,151 天,将近六年。六年里你的账户处于水下,不知道什么时候能回本——这个心理压力比 -55% 的数字本身更致命。
常用的参数调整
Skill 创建好之后,换标的、换参数都只需要说话就行,不用重新配置任何东西:
用 Backtesting.py 回测 NVDA,快线改成 5 日
用 Backtesting.py 回测 MSFT,从 2020 年到 2025 年,初始资金 5 万美元
常见报错与处理
| 错误 | 原因 | 解决方法 |
|---|---|---|
| "No data found for symbol" | 代码格式不对或日期区间没数据 | 美股用 ticker,确认区间内有交易 |
| 交易次数为 0 | 均线从未交叉 | 缩小 fast/slow 的差值,或拉长回测区间 |
| Bokeh 图表打不开 | 路径含中文或特殊字符 | 输出到纯英文路径 |
这个策略适合什么、不适合什么
SMA 双均线交叉策略不是一个万能工具。根据这次回测的结果,它明显不适合下面几种情况:
- 长期单边上涨的超级牛股。苹果就是最好的反面教材——持有不动赚十倍,来回交易赚三成。如果你看好一家公司长期前景,买入持有可能是更优解
- 高波动但无趋势的市场。均线策略在震荡市会被反复打脸,手续费累积起来不是小数目
- 无法承受大回撤的账户。夏普 0.089、回撤 -55%、水下近六年——如果你的资金有明确的使用期限,这个策略会让你睡不着觉
它更适合的场景是趋势明显的市场——比如原版文档中谷歌的回测结果就好得多。A 股大盘蓝筹也可能是一个方向,波动比美股科技股小,趋势相对规律。
下一步可以做什么
- 换标的测试——拿 NVDA、MSFT、GOOGL 各跑一遍,找哪些股票上择时比持有更好
- Backtesting.py 自带 optimize() 方法,可以对 fast/slow 做网格扫描,自动找到夏普比率最高的参数组合
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=720
- Backtesting.py GitHub:https://github.com/kernc/backtesting.py
你遇到过策略跑输买入持有的情况吗?是继续优化参数还是直接放弃?欢迎聊聊你的经历。

浙公网安备 33010602011771号