English Русский Español Deutsch 日本語 Português
preview
非线性指标

非线性指标

MetaTrader 5示例 | 3 四月 2023, 11:36
1 643 0
Aleksej Poljakov
Aleksej Poljakov

概述

非线性方法广泛用于处理金融时间序列。 特别是,MetaTrader 交易平台中有相当多的指标采用了非线性方式。 所有这些在交易中都曾被积极使用。

当信号的某些特征比一般信息更重要时,也许就需要非线性指标。 此外,非线性指标可以应对线性指标无能为力的情况。

创建非线性指标是一项相对容易的任务。 普通线性指标可以用以下方程描述:

其中 w[i] 是指标的权重系数。 现在我们将使该指标转化为非线性。 为此,我将使用价格对数,替代价格本身。 计算总和后,我会找到它的指数:

这种方式似乎很简单。 然而,指标计算却发生了重大变化。 所有乘法都转换为幂,而加法则被乘法取代。 例如,算术平均值(SMA)将被替换为几何平均值。

此外,使用对数直接表明在计算中均为正数值。 此价格转换可在任何线性指标里采用。 您可以轻松地自行完成。 与此同时,对系数的所有要求与线性指标的需求相同。 我们自这篇文章中获取指标模板,并将其转换为对数版本。

不过,也可以利用时间序列本身的变换来构建非线性指标。 在本文中,我将研究这些指标。 可以说,这篇文章是专门讨论 ArraySort 函数的。 它将成为新指标的基础。


向心趋势的度量

向心趋势是某些数据集的一些典型值。 向心趋势最常见的度量是算术平均值、中位数和众数。 算术平均值是一种线性度量,以简单移动平均线实现。 中位数和众数则是非线性的。

中位数将数据集分为两半。 前半部分包含小于中位数的值,而后半部分包含大于中位数的值。 我们来看看中位数是如何计算的。 假设我们有以下一系列数值:1, 6, 9, 3, 3, 7, 8。 我们按升序对这些数字进行排序:1, 3, 3, 6, 7, 8, 9。 然后中位数就是该系列中间的那个数字。 在我们的示例中,此数字为 6。 在数据量为偶数的情况下,中位数是最接近中心的数字之和的一半。 例如,若序列为 1, 3, 3, 6, 7, 8,则中位数是 (3 + 6)/2 = 4.5。 中位数的主要特征是它对尖峰非常压制。

众数是数据样本中出现频率最高的数值。 例如,在样本 1, 6, 9, 3, 3, 7, 8 中,最多见的数字是 3。 故它就是该系列的众数。 然而,在分析价格时,每个数值大多只能出现一次。 然后,为了计算众数,我们可以利用皮尔逊(Pearson)经验方程:

众数 = 3*中位数 – 2*平均值。

根据方程,该众数是一个不稳定的指标(系数超出了区间 -1...+1 的边界)。 但它可以作为其它指标的补充。

另一个向心度量可以考虑取范围的中间值。 为了计算它,我们需要找到时间序列的最大值与最小值之和的一半。 虽然范围中间对于尖峰敏感,且并不是很可靠,但它仍然在某些指标里使用。

这就是向心趋势的所有四个度量在图表上的样子。



贝叶斯(Bayesian)平滑

如果我们查看中位数图形,我们可以发现某个区域,中位数值在相当长的时间内没有变化。 中位数周期越长,此类区域越明显。 例如,这就是周期为 51 的中位数图形的样子。

如果我们试图让中位数对于价格变化更敏感呢? 例如,我们可以取中位数和简单平均线之和的一半,如此即结合了中位数和移动平均线的稳定性。 此选项是可能的。 但我建议采用略有不同的方式,并使用贝叶斯(Bayesian)平滑。

首先,我们需要计算所有价格的总和:

sum = price[1] + … + price[n].

接下来,我们需要选择一个数值,相对于将予以平滑的数值。 那么贝叶斯平均值可以使用以下方程来计算:

此处 p 是一个参数,允许我们设置所选数值的影响强度。 其值应至少为 1。 例如,我选择了以下数值:中位数、范围中间值、最大值和最小值。

贝叶斯平滑也可以应用于多个数值。 在该情况下,其方程将如下所示:

在指标中,此选项体现在最大值和最小值。 这是它们在图表上看到的样子。


应用贝叶斯平滑展示了如何在一个指标中组合线性和非线性方法。


中位数的中位数

我们记住如何获得三角形窗口函数。 取周期为 3 的简单移动平均线为基础。 现在我们需要找到三条移动平均线上偏移一根柱线的数值:

 

现在,剩下的所有就是找到这三个值的平均值:


现在,我们以相同的原理应用于中位数。 首先,找到三个中位数值:


然后指标值将等于这些中位数的中位数:


这就是它在图表上的样子。



伪中位数

计算伪中位数的算法有点像前一个。 唯一的区别是,在每一步中,我们寻找的不是子序列的中位数,而是它的最大值和最小值。

 

现在我们需要从找到的高点中获取最小值,从低点中获取最大值。 它们的平均值即是伪中位数。


伪中位数可以作为中位数和范围中值的替代。


您不能通过非线性破坏指标

趋势强度。我们以一个明显聚焦趋势的指标为例,例如线性加权均线。 该指标值计算如下(假设指标周期为 5):


接下来,我们将采用这些价格,并从中创建两个新序列。 在第一个(我们将其指定为 p[])中,价格将按升序(从低到高)排序。 而对于第二个序列 (P[]),价格按降序进行排序。 现在,我们将 LWMA 权重应用于这些序列。


 

我们得到了两个新值。 它们显示出如果价格形成严格准确的上行或下行趋势,指标的数值将会是什么样。


现在,我们可以直观地评估趋势的强度 — 指标越接近下边界或上边界,看涨或看跌趋势就越强。 此外,上下边界线之间的差值可以暗示市场波动。 它们彼此之间的距离越远,波动性就越高。

相对强弱指数。 RSIJ. Welles Wilder 开发,并于1978 年 6 月发表在 商品(Commodities) 杂志。 为了计算这个指标,需用到两个辅助变量 U 和 D。 需要用它们来区分价格的上涨和下跌。


计算 UD 值后,需对其数值应用指数平滑。 在本例中,指标值为:


这是一个很好的经时间证明的指标。 它已经是非线性的。 在指标输入里可以发送价格差异或零值。 我们尝试把一个非线性更改为另一个非线性 — 我们将采用它们发生的概率,替代价格差值。 直觉告诉我们,大的偏差不如小的偏差常见。 一个小测试表明,直觉没有欺骗我们。

我们将用以下数值代替价格差值:


其中 n 表示这种差异在历史上发生的次数,而 N 表示观测值的总数。 在这种情况下,指标方程如下:


指标本身如下所示。


Ichimoku Kinko Hyo。该指标由日本分析师 Goichi Hosoda 开发。 Ichimoku 结合了若干种市场分析方法。 该指标采用范围的中值绘制 Tenkan 线、Kijun 线、和 Senkou B 线。 我们尝试用更稳定的指标 — 中位数来替换它们。 我们将采用加权中位数计算 Senkou A 线。 这些替换不应影响指标的本质,同时令其更加稳定。 这就是 Ichimoku 指标修订版本的曲线的样子。 您可自行画上云图。


蜡烛形态

技术分析中有一个有趣的方向,它基于对日本烛条及其组合的研究。 相当多的文章都致力于它。 例如,“分析烛条形态”。

我将采用稍微不同的方式,并用有序统计来识别烛条形态。 我们来看看我们的行动在实践当中会是什么样子。

首先,我们需要设置用来分析的价格序列。 然后我们记录我们选取的点位的价格数值。 之后,我们将保存显示价格序列顺序的索引。

价格
数值
索引
Open[0]
1.03248
0
Low[1]
1.03133
1
High[1]
1.03204
2
Open[1]
1.03204
3
Low[2]
1.03191
4
High[2]
1.03256
5
Open[2]
1.03248
6
Low[3]
1.03217
7
High[3]
1.03296
8
Open[3]
1.03292
9

现在,我们需要按升序对价格值进行排序。

1.03133
1
1.03191
4
1.03204
3
1.03204
2
1.03217
7
1.03248
6
1.03248
0
1.03256
5
1.03292
9
1.03296
8

接下来,我们需要解决价格匹配时可能存在的歧义。 为此,将较小值的索引移到靠近数组的开头。 在我们的示例中, (3, 2) 和 (6, 0) 索引对进行了互换。

之后,分析索引序列。 为了便于分析,请将索引转换为单个数字 - 8956073241。 这个数字将是形态的最终特征。 如果您取十个以上的数值进行分析,则在组合单个数字时需要使用数字系统的相应基数。

在代码中,算法也许如下所示。

   int array[10][2];//array for writing values and indices

   /*fill the array*/
   array[0][0]=(int)MathRound(iOpen(_Symbol,PERIOD_CURRENT,1)/_Point);
   array[0][1]=0;
   for(int j=0; j<3; j++)
     {
      array[3*j+1][0]=(int)MathRound(iLow(_Symbol,PERIOD_CURRENT,j)/_Point);
      array[3*j+1][1]=3*j+1;
      array[3*j+2][0]=(int)MathRound(iHigh(_Symbol,PERIOD_CURRENT,j)/_Point);
      array[3*j+2][1]=3*j+2;
      array[3*j+3][0]=(int)MathRound(iOpen(_Symbol,PERIOD_CURRENT,j)/_Point);
      array[3*j+3][1]=3*j+3;
     }

   ArraySort(array);

   /*eliminate possible ambiguities when prices match*/
   for(int j=1; j<10; j++)
      if(array[j-1][0]==array[j][0] && array[j-1][1]>array[j][1])
        {
         int v=array[j-1][1];
         array[j-1][1]=array[j][1];
         array[j][1]=v;
         j=1;
        }

   /*gather the number*/
   ulong number=0;
   for(int j=0; j<10; j++)
      number=number+array[j][1]*(ulong)MathRound(MathPow(10,j));//10 - number system base

利用脚本,我们可以估算形态的数量,以及它们在历史上发生的次数。

该算法的唯一缺点是它对伸缩不敏感。 如果我们垂直拉伸或挤压蜡烛,形态不会改变。 例如,这三种情形被认为是雷同的。


但这个缺点不会阻止我们基于这个算法制作指标。 令指标具有一点预测性。 对于每个形态,我们将按照此形态累积柱线的(最高价 - 开盘价)和(开盘价 - 最低价)的差值之和。 当形态再次出现时,指标将评估哪个金额更大,并做出预测。 结果就是,我们将得到以下图形。


顺沿与跨越

我们在上面获得的算法也可运用在创建交易系统之时。 我们来看两个简单的例子。

顺沿 更平常,交易系统信号基于指标的当前值。 如果我们依据一定数量的先前值来生成开仓信号,会发生什么? 例如,我们可以获取最后十个指标值,并应用它们来构建形态算法。 然后,结果形态将示意指标值随时间的变化。 例如,我取最后十个开盘价来查找形态。 我还将预测范围提高到前五根柱线。 而这就是该 EA 的交易的样子。


跨越。形态计算算法也可依据一组指标。 在这种情况下,形态将示意指标相对于彼此间相对定位的顺序。 此顺序将决定交易系统的信号。 例如,我取十条移动平均线,周期为 2*n + 1 (n = 0...9)。 而这就是在这种情况下的交易。


在这两种情况下,我们都需要控制算法识别的形态数量。 它们的数量不应该很少。 若那样的话交易系统可能无法区分不同的状况。 此外,形态的数量亦不能太大,否则太多的交易状况将被识别为唯一,交易系统根本不会响应它们。 此外,在第二种情况下,有必要尽可能选取彼此区别明显的指标。 例如,只选用简单移动平均线,即使它们的周期差别很小,这明显是开发人员的错误。 但是,我们仍然要表扬他的努力。


结束语

处理市场信息的非线性方法既可用于指标,也可用于交易策略。 以前它们都已被用过,所以现在依然可以(并且应该)使用它们。 非线性指标可以帮助您重新审视价格走势。 在交易系统中使用非线性方法,将有助于获得质地不同的信号。

本文中用到的程序。

名称 类型  简介
Base LogIndicator
指标 基于价格对数变换的指标。InpCoefficient — 指标权重,您可以输入任何数字。 它们的总和不应等于零。
MMMM
指标 显示向心趋势度量的指标。iMode —- 趋势选择。 iPeriod — 指标周期(不少于 2)。
Bayesian Moving Average 指标 实现贝叶斯平滑的指示器。iMode - 选择平滑的趋势。iPeriod - 指标周期。Parameter - 平滑参数。
Median Median 指标  显示中位数之中位数的指标。 三角形窗口函数的非线性模拟。iPeriod - 指标周期。
Pseudomedian
指标  在某些情况下,伪中位数可以很好地替代中位数和中间值。iPeriod - 指标周期
Strength Trend
指标  显示价格样本中趋势成分强度的指标。iPeriod - 指标周期
nRSI  指标  基于价格增量概率的指标iMode - 平滑方法选择iPeriod - 指标周期
nIchimoku Kinko Hyo
指标 传统 Ichimoku 指标进行现代化改造的示例。 PeriodS,  PeriodM,  PeriodL - 短期,中期和长期指标周期。
Script Pattern  脚本 收集价格形态统计信息的脚本。 最终结果将保存到 “Files” 文件夹中。
Pattern  指标  计算形态的指标。 根据历史数据,它针对正在开盘的柱线预测主要价格走势。 Least - 历史中形态观测的最小数量。 预测将仅显示已观察到的 Least 次数最多的形态。
EA Along Across
EA 运用价格形态交易的 EA。Mode - 形态方向选择。Least - 历史中观测到的形态数量。Percent - 价格变动方向对另一个方向的支配百分比,影响持仓的数量。 此参数的值应在 51 - 99 范围内选择。

 

    本文由MetaQuotes Ltd译自俄文
    原文地址: https://www.mql5.com/ru/articles/11782

    附加的文件 |
    MMMM.mq5 (3.48 KB)
    Median_Median.mq5 (2.44 KB)
    Pseudomedian.mq5 (2.36 KB)
    Strength_Trend.mq5 (3.57 KB)
    nRSI.mq5 (3.51 KB)
    Script_Pattern.mq5 (4.61 KB)
    Pattern.mq5 (4.54 KB)
    MMMM.mq4 (4.44 KB)
    Pseudomedian.mq4 (3.33 KB)
    Strength_Trend.mq4 (4.53 KB)
    nRSI.mq4 (4.64 KB)
    Script_Pattern.mq4 (2.32 KB)
    Pattern.mq4 (4.58 KB)
    种群优化算法:人工蜂群(ABC) 种群优化算法:人工蜂群(ABC)
    在本文中,我们将研究人工蜂群的算法,并用研究函数空间得到的新原理来补充我们的知识库。 在本文中,我将陈列我对经典算法版本的解释。
    构建自动运行的 EA(第 07 部分):账户类型(II) 构建自动运行的 EA(第 07 部分):账户类型(II)
    今天,我们将看到如何创建一个在自动模式下简单安全地工作的智能系统。 交易者应当始终明白自动 EA 正在做什么,以便若它“偏离轨道”,交易者可以尽早将其从图表中删除,并控制事态。
    神经网络变得轻松(第三十四部分):全部参数化的分位数函数 神经网络变得轻松(第三十四部分):全部参数化的分位数函数
    我们继续研究分布式 Q-学习算法。 在之前的文章中,我们研究了分布式和分位数 Q-学习算法。 在第一种算法当中,我们训练了给定数值范围的概率。 在第二种算法中,我们用给定的概率训练了范围。 在这两个发行版中,我们采用了一个先验分布知识,并训练了另一个。 在本文中,我们将研究一种算法,其允许模型针对两种分布进行训练。
    DoEasy. 控件 (第 27 部分): 继续致力 ProgressBar(进度条)WinForms 对象 DoEasy. 控件 (第 27 部分): 继续致力 ProgressBar(进度条)WinForms 对象
    在本文中,我将继续开发进度条(ProgressBar)控件。 特别是,我将创建管理进度条和视觉效果的功能。