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

image

AAPL_blankly_tearsheet

回测结果:等了 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,对比信号触发时间

资源链接:

你有耐心等 14 个月才触发一次交易信号吗?还是更倾向于每个月都有几次交易的高频策略?欢迎聊聊你的交易节奏偏好。

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