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 拆解和完整回测仪表盘。

image

Skill 创建好后:

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

image

finmarketpy_backtest_dashboard

 

finmarketpy_event_study

finmarketpy_seasonality

finmarketpy_seasonality_bar

finmarketpy_trade_returns

 

回测结果: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 年之后,三个变化打破了趋势:

  1. 央行干预常态化。欧元、日元、瑞郎的汇率波动被央行政策频繁打断,趋势刚起来就被拍回去
  2. 算法交易占比飙升。FX 市场 90%+ 的流动性由算法提供,趋势信号一旦出现就被高频套利吃掉了
  3. 波动率长期低迷。除 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 数据发布做事件交易

资源链接:

你做过外汇交易吗?感觉外汇的趋势性和股票比是更强还是更弱?欢迎聊聊。

posted @ 2026-07-27 17:36  PC修复电脑医生  阅读(6)  评论(0)    收藏  举报