finmarketpy实战:SMA(200)趋势跟踪在8个G10货币对上亏损10%,波动率目标压到3%也无济于事
第一个专门做外汇回测的框架——11.5年8个货币对,趋势跟踪亏了10%
finmarketpy 和之前写过的所有框架都不太一样。它不碰股票、不做期权、不搞加密——它只做外汇和宏观策略。作者 Saeed Amen 自己就是外汇量化交易员出身,所以这个框架从设计到功能都带着浓厚的 FX 交易特色:点差成本精确到 2.5 bps、波动率目标自动调整仓位、等权组合配置、信息比率按币种拆分。
我拿它跑了 SMA(200) 趋势跟踪策略——200 日均线,可以说是最经典的趋势策略参数。标的覆盖 8 个 G10 货币对(EUR/USD、USD/JPY、GBP/USD 等),从 2015 年到 2026 年共 11.5 年。策略的波动率目标设为 5%,最大杠杆 3 倍。结果:680 笔交易、胜率 29.1%、年化 -0.81%、总亏损 -9.66%。仅 EUR/USD 上产生了微弱的正信息比率(+0.13),其他七个币种全部为负。
起步
从 EasyClaw 官网下载安装。不需要手动装 finmarketpy、不需要配 FX 数据源。
打开后左侧找「Skill」→「Skill Creator」。灰显的话去「设置 → 通用」打开「开发者模式」重启。
创建 Skill
在 Skill Creator 里告诉 EasyClaw:
帮我把 GitHub 上的 finmarketpy(https://github.com/cuemacro/finmarketpy)做成一个 FX 回测 Skill。我希望输入一组货币对、起止日期和均线参数就能跑趋势跟踪策略,自动从 findatapy 拉数据,输出 TradeAnalysis 统计表、单币种 IR 拆解和完整回测仪表盘。

Skill 创建好后:
用 finmarketpy 跑 SMA 200 趋势跟踪,标的用 EUR/USD、USD/JPY、GBP/USD 等 8 个 G10 货币对,从 2015 年初到现在,波动率目标 5%、最大杠杆 3 倍






回测结果:8 个货币对,7 个在亏方向的钱
组合层面
| 指标 | 值 | 怎么看 |
|---|---|---|
| 总收益率 | -9.66% | 11.5 年亏了近 10% |
| 年化收益 | -0.81% | 年化微亏 |
| 年化波动率 | 2.98% | 波动率目标 5% 压到了 3%——风险控制做到了 |
| 夏普比率 | -0.27 | 负数——承担风险反而亏钱 |
| 最大回撤 | -13.21% | 近两年半(2020-2022)持续回撤 |
| 总交易次数 | 680 | 8 个币种 11.5 年 |
| 胜率 | 29.1% | 极低 |
| 日胜率 | 46.53% | 日频接近 50%——但交易胜率只有 29% |
单币种信息比率——谁在亏、谁在赚
| 货币对 | 信息比率 | 结论 |
|---|---|---|
| EUR/USD | +0.132 | **正 IR——欧元曾经的趋势还在 |
| USD/JPY | +0.057 | 微正 |
| GBP/USD | +0.022 | 几乎为零 |
| AUD/USD | -0.015 | 微负 |
| USD/CHF | -0.048 | 负 |
| USD/SEK | -0.094 | 明显负 |
| USD/NOK | -0.101 | 明显负 |
| USD/CAD | -0.173 | 最差——加元的趋势在消失 |
这张表比组合层面的 -0.81% 更有价值:SMA(200) 趋势跟踪在欧元上还在微弱赚钱,在其他七个货币对上已经失效。如果单看组合收益你会以为"这个策略不行",但拆到币种层面你会发现——不是策略不行,是里面大部分标的在这个区间没有趋势。加元(USD/CAD)的 IR 是 -0.17,说明 SMA(200) 在加元上不仅没赚到趋势的钱,还亏了反向信号的钱。
波动率目标——一个被大多数回测框架忽略的功能
finmarketpy 最独特的设置是波动率目标——不是"每次交易固定仓位",而是"根据当前市场波动动态调整仓位"。它的逻辑很简单:波动率高了就减仓、波动率低了就加仓,目标是让组合的年化波动率稳定在预设值附近(这里设了 5%)。
这个功能在 FX 交易中尤其重要。因为不同货币对的波动率差异巨大——USD/SEK 的年化波动可能是 EUR/USD 的两倍。如果不做波动率调整,等权组合实际上的风险暴露完全不是等权的。波动率目标保证了每个货币对对组合的风险贡献大致相等。这次回测中波动率被压到了 2.98%(略低于 5% 的目标),说明策略在大部分时间处于低风险暴露状态——波动率低的时候不敢加太多仓位,波动率高的时已经减了仓。
为什么 FX 趋势跟踪在 2015 后失效了
这不是 finmarketpy 的问题,也不是 SMA(200) 的问题——是全球外汇市场本身发生了变化。2015 年之前,G10 货币趋势跟踪是量化对冲基金最稳定的收益来源之一。2015 年之后,三个变化打破了趋势:
- 央行干预常态化。欧元、日元、瑞郎的汇率波动被央行政策频繁打断,趋势刚起来就被拍回去
- 算法交易占比飙升。FX 市场 90%+ 的流动性由算法提供,趋势信号一旦出现就被高频套利吃掉了
- 波动率长期低迷。除 2020 年 3 月和 2022 年加息周期外,G10 波动率大部分时间在历史低位——没有波动就没有趋势
EUR/USD 是**还在产生正 IR 的货币对,因为它仍是全球流动性最深的资产,趋势形成的阻力最小。而 USD/CAD 的 IR -0.17 原因也很明显——加元高度依赖油价,油价在 2015 后进入震荡区间,CAD 的趋势信号变得毫无意义。
常见报错
| 错误 | 原因 | 解决方法 |
|---|---|---|
| "FX data not found" | findatapy 数据源需要首次下载 | Skill 自动处理,如手动安装需运行一次数据下载 |
| 波动率目标实际值与设定值偏差大 | 极端波动导致杠杆触发了最大限制 | 调整 signal_vol_max_leverage 上限 |
下一步
- 把策略改成 SMA(50) 或 SMA(20),看更短期的趋势信号在 2015 后的 FX 上是否还有效
- 尝试 finmarketpy 自带的事件驱动策略——围绕央行利率决议和 NFP 数据发布做事件交易
资源链接:
- EasyClaw 下载:https://easyclaw.cn/?f=737
- finmarketpy GitHub:https://github.com/cuemacro/finmarketpy
你做过外汇交易吗?感觉外汇的趋势性和股票比是更强还是更弱?欢迎聊聊。

浙公网安备 33010602011771号