English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
一项智能交易系统失败原因分析

一项智能交易系统失败原因分析

MetaTrader 5EA交易 | 26 四月 2022, 10:41
1 655 6
Richard Poster
Richard Poster

概述

智能交易系统(EA)也许会在几个月甚至几年内表现良好,但总会有一段时间的表现不佳。 EA 罕见能在很长一段时间内(比如十年)表现出稳定的利润。 如果一款 EA 在过去的一段时间内表现不佳,那么如何能期望它在未来一直表现良好呢?

在本次分析中,提出了两个问题:时间序列数据中发生了哪些变化,以至于能强烈影响 EA 的性能? 是否能有一款技术指标可以预测 EA 何时会表现不佳,何时会表现优良? 这样的指标一定是最有价值的!


移动平均线交叉触发器

为了研究这些问题,我们取货币 16 年的 15分钟数据,以及一种试验烛台策略,即移动平均交叉。 对于移动平均线交叉(MAC)触发器来说,当快速 SMA 上穿慢速 SMA 时生成买入信号,当快速 SMA 下穿慢速 SMA 时生成卖出信号。 MAC 策略理应为研究提供良好的试验平台。 MAC 策略的关键输入参数是快速和慢速 SMA 周期。 在这些研究中,快速 SMA 周期通常为 1 至 4,慢速 SMA 周期为 10 至 150,且假设这两者在试验期间是固定的。

图例 1 从 2006 年 1 月到 2021 年 12 月显示了 EURUSD 的 SMA 交叉行为触发器的利润回报。 对于优化的 SMA,快速周期和慢速周期分别为 2 和 80,EA 在某些时间段给出正回报,而在其它时间段则给出负回报。 2008 年 1 月 – 2013 年 6 月 间盈利稳步增长。 图例 2 显示了在相同时间间隔内,优化的 SMA 周期分别为 1 和 80,GBPUSD 的 SMA 交叉行为触发器的利润回报。 GBPUSD 图表显示仅有短暂的正盈利表现。

Fig_1_EURUSD_SMACross

 图例 1.  EURUSD SMA 交叉触发器盈利 (0.1 手)


     

Fig_2_GBPUSD_SMACross

  图例 2. GBPUSD SMA 交叉触发器盈利 (0.1 手)

鉴于图例 1 和图例 2 所示的时间行为,我们可以验证常见技术指标的时间行为,并判定技术指标行为时间和移动平均交叉行为盈利回报时间之间是否存在任何关系。 


传统技术指标的行为

可以检查若干个标准技术指标,看看它们在正回报和负回报的时间区域中的行为是否不同。 图例 3 示意 EURUSD 在 16 年间的月平均真实范围(ATR)指标。 ATR 指标提供了货币对波动性的度量。 它表现出明确的时间依赖行为,但与图例 1 中的利润时间行为没有对应关系。 有趣的是,图例 3 显示了 2008 年末和 2020 年初经济危机前后的极端波动。 它还建言,采用价格变化的绝对阈值作为触发逻辑是不明智的,应该考虑平滑的 ATR 值。 另一个常见的技术指标是布林带上下边界的扩张。 该指标应受到波动性和趋势强度的影响。 令人惊讶的是,它在月度的长线行为里,如图例 4 所示,几乎与 ATR 指标相同。 与 ATR 指标一样,在图例 1 的 EURUSD 数据中,它未显现出对应于正回报时间区域和负回报时间区域的行为。 GBPUSD 的数据也有类似的结果。 长期波动性不能解释图例 1 和图例 2 所示的时间行为。


Fig_3_ATRvsMth

图例 3. EURUSD ATR,月度平均值

FIg_4_BBSpreadVsMth

图例 4. EURUSD 布林带扩散,月度平均值


作为指标的自相关函数

与 ATR 和布林带指标不同,自相关函数(ACF)不依赖于波动性。 ACF 是在时间序列数据中寻找形态的有用工具。 ACF 衡量一个时间序列中的元素与该时间序列中延迟一定间隔的元素之间的相关性。 当数据中出现趋势时,对于小规模滞后,ACF 将具有正值。在该分析中,时间序列中的 Y[i] 元素被定义为柱线 [i] 的(收盘价-开盘价)。

对于拥有 N 个元素的时间序列,i=1...N,ACF 的定义如下:

ACF_EquationV2

针对价格序列数据的自相关函数,与针对柱线序列的价格变化数据的自相关函数有很大不同。 举例来说,对于数字序列 {1,2,3..14},ACF 为 0.786。 对于该数组的连续元素之间的一系列差值,ACF 将接近于零(假设值中存在少量噪声,以避免除零异常)。

ACF 的计算在以下代码段中实现:

 double GetAtCorrVal(double &ClsOpn[],int CorrPer, int LagPer,int joff ) {
   double corr;
   double AIn[],BIn[];
   double XMean,XNum,XDen;
   int jj;
   ArrayResize(AIn,CorrPer);
   ArrayResize(BIn,CorrPer);
   XMean = 0.;
   XNum = 0.;
   XDen = 0.;
   corr = 0.;
   if(CorrPer<2)
    {
     Print("No AutoCorr Processing Allowed ");
     return(corr);
    }
   // mean
   for(jj=0;jj<CorrPer;jj++)
    {
     XMean +=ClsOpn[jj+joff];
    }
   XMean = XMean/CorrPer;
  // variances
   for(jj=0;jj<CorrPer;jj++)
    {
     if(jj<(CorrPer-LagPer))
       XNum  += (ClsOpn[jj+joff]-XMean)*(ClsOpn[jj+LagPer+joff]-XMean);
     XDen += (ClsOpn[jj+joff]-XMean)*(ClsOpn[jj+joff]-XMean);
    }  
    if(XDen==0.)
     {
      corr = 0.;
     }
    else
    corr = XNum/XDen;
   return(corr);
  }
//----------------------------------------------------------------

  

图例 5 显示了 EURUSD 数据在 16 年间的月度平均 ACF,平滑期为 6 个月。 图例 1 显示了 2008 年至 2012 年底间的盈利表现,而图例 5 显示的该时间段的 ACF 值略高,表明 MAC 策略的盈利表现与 ACF 值之间可能存在相关性。


Fig_5_EURUSD_ACFvsMth

图例 5. EURUSD 自相关函数月度平均值


对于图例 6 所示的 GBUUSD 数据,可以看出利润表现(如图例 2 所示)与 ACF 值之间存在弱相关。

Fig_6_GBPUSD_ACFvsMth


 图例 6. GBPUSD 自相关函数月度平均值

自相关函数可以作为一个指标(AutoCorr.mq5),但如图例 7 所示,它不是一个好的趋势识别指标。


Fig_7_EURUSD_ACFIndicator

图例 7. ACF 指标, Lag=1

ACF 时间行为和 SMA 交叉策略

更多信息可以通过查看 SMA 交叉点(ACF 触发器)前、后的时间行为,若刚好在交叉点之后,则交易仍然可开单(交易 ACF)。 两种类型的 ACF、交易 ACF、和 ACF 触发器,均有不同的属性。 图例 8 和图例 9 显示了 EURUSD 和 GBPUSD 数据的交易 ACF。 利用策略测试器,可以将盈亏交易的 ACF 值作为时间的函数分别绘制出来。 两个图表均显示出 ACF 在盈亏交易之间的时间变化分离。 图例 1 中的盈利区域 2008 年 1 月 - 2013 年 6 月(EURUSD)大致与图例 8 中的一个区域相匹配,该区域的 ACF 分离也很大。 从 2018 年 1 月开始,盈亏交易的 ACF 值几乎没有分离。 在图例 1 中,这对应于利润回报率的平坦区域。


Fig_8_EURUSD_TradeACF

  图例 8.  SMA 交叉触发器针对 EURUSD 交易自相关


Fig_9_GBPUSD_TradeACF

图例 9.  SMA 交叉触发器针对 GBPUSD 交易自相关

图例 10 和 11 显示基于 EURUSD 和 GBPUSD 数据的 ACF 触发器。 这两个图表的目的是调查 ACF 触发器值是否可以用作智能交易系统的过滤器,从而提高 SMA 交叉策略的盈利能力。 与交易 ACF 数据相比,ACF 触发器数据显示正盈利回报和负利润回报之间的分离较小。 这会削弱其作为触发过滤器的价值。 然而,ACF 值在时间上基本持平,这表明固定阈值的 ACF 可用作触发滤波器。 盈利/亏损曲线彼此交错并有很大反弹,这意味着有些区域的交易在一定时间内不会盈利。


Fig_10_EURUSD_TriggerCF

 图例 10.  SMA 交叉触发器针对 EURUSD 的触发器自相关


Fig_11_GBPUSD_TriggerACF

图例 11. SMA 交叉触发器针对 GBPUSD 的触发器自相关


针对 SMA 交叉触发器的 ACF 过滤器

尽管拥有正回报和负回报的交易 ACF 之间差异很小(图例 10 和图例 11),但如果将自相关阈值需求添加到 SMA交叉触发器之中,则在盈利表现不佳的区域,智能交易系统的回报表现会大大改善。 图例 12 和 13 示意借助额外的 ACF 过滤器,针对 EURUSD 和 GBPUSD 数据,EA 的盈利回报。 采用完整的 16 年期限。 将图例 1 和图例 2 与图例 12 和图例 13 进行比较,当应用自相关阈值需求时,EURUSD 和 GBPUSD 数据的回报性能都得到了极大改善。


Fig_12_EURUSD_SMACrossCorr

图例 12. 带 ACF 滤波器的 EURUSD 交叉触发器

Fig_13_GBPUSD_SMACrossCorr

图例 13. 带 ACF 滤波器的 GBPUSD 交叉触发器


图例 14 示意策略测试器里的性能结果表格。 针对 EURUSD 和 GBPUSD 数据均有显著改善。 在这两种情况下,当启用 ACF 过滤器时,总利润将增加约 50%,并且每笔交易的利润(PO)也将大大提高。

触发器类型

交易数量 #

盈利 $

(0.1 手)

盈利/亏损 (PF)

盈利/交易 (PO)

EURUSD SMA Cross

3160

5830.

1.10

1.85

EURUSD SMA Cross + ACF

1548

8511.

1.33

5.50

GBPUSD SMA Cross

3672

5352.

1.07

1.46

GBPUSD SMA Cross + ACF

3096

8317.

1.13

2.69

图例 14. EURUSD 和 GBPUSD 数据的测试性能表格


SMA 交叉策略中 ACF 对于 SMA 慢周期的依赖性


研究盈亏交易之中,平均自相关函数对于 SMA 慢周期选择的依赖性也很有意思。 图例 15 显示的是 EURUSD M15 数据。 交易开单策略中不使用相关性阈值。 在不考虑 ACF 值的情况下,SMA 交叉策略的最佳慢周期被确定为 80。图例 15 显示,在 65 到 80之间的 SMA 慢周期,平均 ACF 值在盈利和亏损交易之间出现最大的分离。 进一步的分析可能会导致使用 ACF 信息来根据交易开单时刻所测量的自相关阈值判定最佳慢周期。 


Fig_15_AvgACVvsSlowPeriod

图例 15. 针对 EURUSD 的平均 ACF 与 SMA 慢周期

结束语

自相关函数是提高智能交易系统绩效的重要指标。 它过滤掉性能较差的区域,从而提高试验台触发器的性能。

一般来说,包括自相关函数在内的相关系数为提高交易绩效提供了一个富有成效的研究领域。 它们不受波动性影响,且对于价格形态(包括趋势形成和反转)敏感。



本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/3299

附加的文件 |
AutoCorr.mq5 (4.12 KB)
最近评论 | 前往讨论 (6)
Richard Poster
Richard Poster | 22 2月 2022 在 16:20
计算出的ACF需要高于一个固定的阈值。 买入或卖出是由SMA交叉方向决定的,但两种类型的触发器都使用ACF阈值要求。 这在所附的EA中实现。
Marcel Fitzner
Marcel Fitzner | 24 2月 2022 在 22:33

你好,理查德。

这是一篇精彩的文章,感谢您分享您的见解!

我有一个问题,即一个运行中的EA对内部变量的依赖程度如何?

或者换句话说。在失去互联网连接/断电或电脑重启后(如强制更新windows),EA是否能够识别它之前的位置和SL/TP管理?

我只能想象,跟踪SL/TP/甚至天数的内部变量(为了决定何时最好地退出交易,等等等等)应该以某种方式持久地保存在一个文件或数据库中。

你能给出任何建议吗?

Richard Poster
Richard Poster | 25 2月 2022 在 02:42
我认为保存关键信息的最安全的方法是将其写入数据文件,例如可以由Excel读取的csv文件。 然后在重新启动时,可以读取该文件,也许可以通过时间戳检测到异常的终止。 我希望该文件可以定期手动删除,以免变得太大。
Al Bundy
Al Bundy | 1 3月 2022 在 13:41

你好。

谢谢你分享你的见解。

我的问题是

1.a "你的 "相关性是否只与移动平均线/MA交叉点有关?

1.b 如果是,是否有不同指标的相关功能?我正在寻找相关值来过滤日本蜡烛 图的信号(Nison, Bulkowski)。

2.你是如何从图8-11中详细计算出赢利和亏损交易的数值的?

3.你写道:"进一步的分析可能会导致使用ACF信息,根据交易开仓时测得的自相关值来确定最佳的慢速期。"
我怎样才能做到这一点?你能建议一个公式吗?

4.我只能做一些测试,那么你知道哪些时间段(M15,M5,M6,M2,M1)的相关性可以发挥作用?

最好的问候

Richard Poster
Richard Poster | 3 3月 2022 在 20:41

对于#2。

2.我计算了触发时的ACF,并将其与 "订单 "一起存储在注释栏中。在测试器运行完成后,我运行了存储在历史文件中的所有订单,并使用利润字段来确定赢/输的类别,还查找了存储在注释字段中的ACF值作为字符串值。 其他分析所需的数据,如SMA周期,也被存储在注释字段中。
DoEasy 函数库中的图形(第九十七部分):独立处理窗体对象移动 DoEasy 函数库中的图形(第九十七部分):独立处理窗体对象移动
在本文中,我将研究实现鼠标独立拖动任何窗体对象。 此外,我还将在该函数库里补充错误消息和之前在终端和 MQL5 中实现的新成交属性。
学习如何设计一款布林带(Bollinger Bands)交易系统 学习如何设计一款布林带(Bollinger Bands)交易系统
在本文中,我们将学习布林带,这是交易界最流行的指标之一。 我们将研究技术分析,并看看如何设计一款基于布林带(Bollinger Bands)指标的算法交易系统。
DirectX 教程(第一部分):绘制第一个三角形 DirectX 教程(第一部分):绘制第一个三角形
这是一篇关于 DirectX 的介绍性文章,介绍了使用 API 进行操作的细节。 它应有助于理解其组件的初始化顺序。 本文包含一个如何编写 MQL5 脚本的示例,该脚本使用 DirectX 渲染一个三角形。
在 MQL 应用程序中运用 CCanvas 类 在 MQL 应用程序中运用 CCanvas 类
本文研究在 MQL 应用程序中运用 CCanvas 类。 原理会伴随着详细的解释和示例,从而彻底理解 CCanvas 的基础知识。