Blankly实战:Golden Cross策略等14个月只触发一次信号,2笔交易盈利31%
一个能无缝切换回测和实盘的统一交易框架
Blankly 的设计理念和之前写过的所有回测框架都有一个根本性的差异:它的回测 API 和实盘 API 是完全一致的。你在回测里写的策略代码,不用改一行就能直接挂到 Alpaca、Coinbase、Binance 上跑实盘。大多数框架的回测模式和实盘模式需要两套不同的代码——回测用 BacktestEngine.run(),实盘用 Broker.place_order()。Blankly 把这两者抽象成了同一个接口,切换只需要改一个参数。
我拿它用苹果跑了一个最经典的 Golden Cross 策略——SMA50 上穿 SMA200 时买入、下穿时卖出。两年只产生了两笔交易(一买一卖),收益 +31.56%,夏普 0.97,最大回撤仅 -13.82%。等了整整 14 个月才等到第一个买入信号——2025 年 9 月 Golden Cross 触发,一把买入,拿到回测结束时卖出。
起步
从 EasyClaw 官网下载安装。不需要手动装 Blankly、不需要注册交易所 API Key。
打开后左侧找「Skill」→「Skill Creator」。灰显的话去「设置 → 通用」打开「开发者模式」重启。
创建 Skill
在 Skill Creator 里告诉 EasyClaw:
帮我把 GitHub 上的 Blankly(https://github.com/Blankly-Finance/Blankly)做成一个回测 Skill。我希望输入股票代码、起止日期和均线参数就能跑 Golden Cross 策略,用 Blankly 原生的 price_event 事件驱动 + Bokeh 仪表盘输出,支持 Keyless Exchange 本地回测。
Skill 创建好后:
用 Blankly 回测 AAPL 的 Golden Cross 策略,SMA50 上穿 SMA200 买入、下穿卖出,从 2024 年中到现在


回测结果:等了 14 个月,换来一笔 31% 的盈利交易
| 指标 | 值 | 怎么看 |
|---|---|---|
| 初始资金 | $100,000 | |
| 最终净值 | $131,564 | 净赚 3.1 万美元 |
| 总收益率 | +31.56% | |
| CAGR | 14.61% | 年化可观 |
| 夏普比率 | 0.968 | 接近 1——优秀水平 |
| 索提诺 | 1.381 | 下行风险控制良好——回撤期间的波动很小 |
| 最大回撤 | -13.82% | 在可接受范围内 |
| 交易次数 | 2 | 一买一卖,等待 14 个月才出手 |
| 胜率 | 100% | **一笔交易盈利 |
交易明细——简单到只有两行
| 日期 | 方向 | 价格 | 金额 | 触发信号 |
|---|---|---|---|---|
| 2025-09-22 | BUY | $256.08 | $100,000 | SMA50 上穿 SMA200(Golden Cross) |
| 2026-07-27 | SELL | $336.91 | $131,564 | 持仓结束(回测终止) |
2024 年 7 月到 2025 年 9 月,整整 14 个月,账户里一分钱都没动。策略在静静等着一个信号——SMA50 从下方上穿 SMA200。2025 年 9 月 22 日,Golden Cross 终于来了,全仓买入。然后一路持有到回测结束,卖出价 $336.91,比买入价涨了 31.5%。
这个策略的 Bokeh 仪表盘有四张图:累计收益曲线叠加买卖信号标记、SMA50 和 SMA200 两条均线的交叉过程、RSI(14) 的超买超卖区间、以及日收益率分布图。收益率分布的均值是 0.064%、标准差 1.01%,基本呈正态分布——在大半年的空仓期里,日收益率都是零,分布自然地聚集在零附近。
Golden Cross 为什么在这里有效
和之前 Backtesting.py 那篇形成有趣对比——那篇文章里 SMA 10/30 在苹果上跑出了 101 笔交易、只赚了 32%,远跑输买入持有。这里 Golden Cross 在两年里只有 2 笔交易、赚了 31%。核心差异在两个维度:
- 参数周期。SMA50/200 比 SMA10/30 长得多,信号少得多。Golden Cross 在两年里只触发了一次入场——这意味着它在大部分时间空仓等待,避开了震荡市的损耗
- 回测区间。2024 中到 2026 中苹果有明显的上升趋势。长周期均线抓住了这段趋势的大部分,而短周期均线在频繁进出中被手续费和市场噪音磨损
这个对比说明了一个朴素的道理:趋势策略的参数周期应该和趋势的持续时间匹配。如果你相信苹果有年线级别的上升趋势,就应该用月线级别的均线参数。用日线参数去捕捉年线趋势,结果就是在震荡中反复止损。
事件驱动的价格信号
Blankly 的策略构建方式和 bt 的 Algo 管道完全不同——它是事件驱动的。你定义一个 price_event 回调函数,每次新价格进来时执行:
| 概念 | 对应 API | 说明 |
|---|---|---|
| 策略初始化 | Strategy.add_price_event() | 注册价格事件回调 |
| 免 Key 回测 | StrategySimulator | 不需要注册交易所 API |
| 指标计算 | blankly.indicators | 内置 SMA/RSI 等常用指标,但这里用纯 Python 等效实现 |
| 绩效获取 | BacktestResult.get_metrics() | 一键获取夏普/索提诺/CAGR/回撤/胜率 |
事件驱动的优势在于逻辑清晰——每个价格点触发一次回调,你在回调里决定是否交易。和 bt 的 Algo 管道相比,事件驱动更灵活(可以做任意复杂的条件判断),但也更手工(需要自己管理状态)。
常见报错
| 错误 | 原因 | 解决方法 |
|---|---|---|
| 回测期间无交易信号 | 均线从未交叉 | 检查 SMA 参数是否合理,或延长回测区间 |
| Keyless 模式无法获取数据 | 本地数据缓存缺失 | Skill 自动处理,手动模式需先下载数据 |
下一步
- 把 SMA50/200 换成 SMA20/50——看信号频率和收益的变化
- 尝试 Blankly 的多资产回测——同时跑 AAPL 和 MSFT 的 Golden Cross,对比信号触发时间
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=739
- Blankly GitHub:https://github.com/Blankly-Finance/Blankly
你有耐心等 14 个月才触发一次交易信号吗?还是更倾向于每个月都有几次交易的高频策略?欢迎聊聊你的交易节奏偏好。

浙公网安备 33010602011771号