English Русский Español Deutsch 日本語 Português
preview
MQL5 中的范畴论 (第 7 部分):多域、相对域和索引域

MQL5 中的范畴论 (第 7 部分):多域、相对域和索引域

MetaTrader 5测试者 | 2 十月 2023, 11:40
972 0
Stephen Njuki
Stephen Njuki

概述

在上一篇文章中,我们研究了锥体和成分的变化如何影响灵敏度分析结果,从而根据指标和可交易证券,在系统设计中提供了机会。 对于这个,我们将更深入地研究人们可能遇到的各种类型的特殊/独特域,并探讨如何利用它们的关系来缓和价格波动的预期。

 

多域

在范畴论中,多域(也称为口袋或堆)是域的泛化,允许同一元素多次出现。 回想在第一篇文章中,域的严格定义要求每个元素都是唯一的。 多域所适用的状况,其中需要重复域内元素,才能正确捕获该域中这些元素的所有元数据。 例如,考虑一个由这句话中的单词组成的域:

“Sets theory deals with sets, while category theory deals with sets of sets, sets of sets of sets, and so on.”

典型地,这将在域中表示如下:

{sets, theory, deals, with, while, category, of, and, so, on}

不过,如您所见,句子的全部含义已丢失。 为了捕获这些额外的信息,多域 X 的形式被定义为


 X := (N, π)

  • N 是 X 的典型域表示,因为它只列举 X 中的元素且不重复。
  • π 是从 X 到 N 的同态。

π: X → N,

N 通常被称为 X 中的名称集,而 π 是 X 的命名函数。 给定一个名称 x ∈ N,并以 π -1(x) ∈ X 作为前像;π -1(x) 中的元素数称为 x 的多重性

将所有这些放在一起将得到下图。


故此,“集合”的多重性为 8,“交易”的多重性为 2,“类别”的多重性为 1,依此类推。

为了进一步为交易者讲述这一点,我们来研究价格的时间序列。 如果我们对价格柱线范围的变化感兴趣,并且我们想使用之前的价格柱线动作来预测这些变化,我们可拿 2 个域来解释这种关系。 

如果我们将之前的价格行为作为多维数据集,并将我们想要预测的变化作为一维,则两者之间的同态将在连接的两个域上有一个滞后,譬如说一根价格柱线。 为了清楚起见,下图可以帮助演示这一点。


这个同态集代表了一个多维域,因为当处理多个数据点(甚至在某些实例中只有一个数据点)时,我们必然会在源域中重复。 对于协域,我们可以将所有数据点常规化为从 -100 到 +100 范围的整数,作为价格范围变化幅度的百分比表示。 这种常规化意味着我们将没有重复,因此可以推测协域中的元素如下。 


{-100, -80, -60, -40, -20, 0, 20, 40, 60, 80, 100}



对于总大小为 11。 我们可以通过考虑具有两个以上维度的域数据来进一步研究这种同态集。 假设在预测价格柱线范围的变化时,我们考虑了不止一个滞后? 我们来看下图。



它类似于我们上面的内容,唯一的区别是添加了数据点。 理想情况下,我们必须训练我们的模型,从而在域和协域中积累足够的数据点,而为了使用它,我们可以在映射到协域时采用多种方法。 在本文中,我们可以考虑使用赢家通吃的方法来选择协域预测。 故此,赢家通吃的是多维数据点(简单地表示为向量或数组,因为元素类是一个数组),当其距离来自新的或当前的输入数据时,它是域中所有数据点中最接近的。 而这将被捕获,如下面的代码所示。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CTrailingCT::Morphisms_A(CHomomorphism<double,double> &H,CDomain<double> &D,CElement<double> &E,int CardinalCheck=4)
   {
      int _domain_index=-1,_codomain_index=-1;
      
      if(E.Cardinality()!=CardinalCheck){ return(_domain_index); }
      
      double _least_radius=DBL_MAX;
      for(int c=0;c<D.Cardinality();c++)
      {
         double _radius=0.0;
         
         m_element_a.Let();
         
         if(D.Get(c,m_element_a))
         {
            for(int cc=0;cc<E.Cardinality();cc++)
            {
               double _e=0.0,_d=0.0;
               if(E.Get(cc,_e) && m_element_a.Get(cc,_d))
               {
                  _radius+=pow(_e-_d,2.0);
               }  
            }
         }
         
         _radius=sqrt(_radius);
         
         if(_least_radius>_radius)
         {
            _least_radius=_radius;
            _domain_index=c;
         }
      }
      
      //
      
      for(int m=0;m<H.Morphisms();m++)
      {
         m_morphism_ab.Let();
         
         if(H.Get(m,m_morphism_ab))
         {
            if(m_morphism_ab.Domain()==_domain_index)
            {
               _codomain_index=m_morphism_ab.Codomain();
               break;
            }
         }
      }
      
      return(_codomain_index);
   }


为了在这个模型中应用范畴论,我们将参考在前面的文章中已经涉及的互通概念。 如果我们调整下图,我们将在同态 π 和 π' 下进行多域排列,而互通能力只是意味着我们有两种预测价格范围变化的方法。

我们如何用它来得到我们的预测,这可通过以下方式达成:

    1. 取两个预测的平均值
    2. 取最大值或
    3. 取它们的最小值

       

      对于共享代码,我们提供了在最小值、平均值和最大值之间进行选择的选项,如下面的代码片段所示。

      //+------------------------------------------------------------------+
      //| Checking trailing stop and/or profit for short position.         |
      //+------------------------------------------------------------------+
      bool CTrailingCT::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
        {
      //--- check
            if(position==NULL)
               return(false);
            
            Refresh();
            
            m_element_a.Let(); m_element_b.Let(); m_element_c.Let();
            m_element_bd.Let(); m_element_cd.Let();
            
            SetElement_A(StartIndex(),m_element_a);
            int _b_index=Morphisms_A(m_multi_domain.ab,m_multi_domain.ab.domain,m_element_a,4);
            int _c_index=Morphisms_A(m_multi_domain.ac,m_multi_domain.ac.domain,m_element_a,2);
            
            SetElement_B(StartIndex(),m_element_b);
            SetElement_C(StartIndex(),m_element_c);
            
            int _b_d_index=Morphisms_D(m_multi_domain.bd,m_multi_domain.bd.domain,m_element_b,2);
            int _c_d_index=Morphisms_D(m_multi_domain.cd,m_multi_domain.cd.domain,m_element_c,2);
            
            int _bd=0,_cd=0;
            if(m_multi_domain.bd.codomain.Get(_b_d_index,m_element_bd) && m_element_bd.Get(0,_bd) && m_multi_domain.cd.codomain.Get(_c_d_index,m_element_cd) && m_element_cd.Get(0,_cd))
            {
               m_high.Refresh(-1);
               m_low.Refresh(-1);
               
               int _x=StartIndex();
            
               double _type=0.5*((_bd+_cd)/100.0);                //for mean
               if(m_type==0){ _type=fmin(_bd,_cd)/100.0; }        //for minimum
               else if(m_type==2){ _type=fmax(_bd,_cd)/100.0; }   //for maximum
            
               double _atr=fmax(2.0*m_spread.GetData(_x)*m_symbol.Point(),m_high.GetData(_x)-m_low.GetData(_x))*(_type);
               
               double _sl=m_high.GetData(_x)+(m_step*_atr);
               
               double level =NormalizeDouble(m_symbol.Ask()+m_symbol.StopsLevel()*m_symbol.Point(),m_symbol.Digits());
               double new_sl=NormalizeDouble(_sl,m_symbol.Digits());
               double pos_sl=position.StopLoss();
               double base  =(pos_sl==0.0) ? position.PriceOpen() : pos_sl;
               
               sl=EMPTY_VALUE;
               tp=EMPTY_VALUE;
               if(new_sl<base && new_sl>level)
                  sl=new_sl;
            }
      //---
            return(sl!=EMPTY_VALUE);
        }


      如果我们从 2022.01.01 到 2022.08.01 的日线时间帧上基于 EURGBP 进行测试,并使用一个简单的信号,例如内置的 Awesome 振荡器('SignalAO.mqh'),我们将得到以下报告。

      7_1


      作为对照,如果我们类似地运行相同的信号,但使用一个内置的尾随类,该类在同一时间段和相同的日线时间帧上使用移动平均线,并且具有相同的持仓规模类(固定保证金),我们将得到以下报告。

      7_ctrl


      这挑明了多域的运用潜力,不仅可以预测价格柱线范围的变化,以告知尾随停止决策,甚至能用于信号或资金管理决策。 我们在本文中只介绍了尾随停止,如此读者或许可以利用自己的时间来探索其它 2 个应用程序。

       

      相对域

      相对域是上述多域概念的扩展,但维基百科还没有关于此主题的参考页面。 然而,如果我们重新审视上面使用一个简单的句子来定义多域的第一个示例,我们就能更进一步,将协域 N 作为所有英语单词的字典。 这意味着任何英语句子都会与 N 同态。从句子 A 到句子 B 的一个同态将把从 A 某处找到的每个单词发送到从 B 某处找到的同一单词。

       

      形式上,相对域在 N 上的映射,表示为 f: (E,π) à (E’,π’),函数是 f: E àE’ 如此以下三角形互通



      为了向交易者阐这一点,我们把上面所用的态射 f,修改其平方互通为没有 D 域的简单三角形。 在运用 f 时,我们将在两个域 E & E' 之间寻找态射权重,如上所述,它们是多维数据位于索引零和索引 1 处的值。 “多维性”仅仅意味着我们正在测量和记录多个数据点。 在我们的例子中,这是高点的变化,也是低点的变化。 故此,因为我们已经知道指数 1(我们的滞后)柱线的价格范围的最终变化,我们将使用态射 f 来转换我们当前的数据点,此刻我们还不知道其最终变化,并找到 E' 中的哪些元素最接近匹配。 最接近匹配的共域元素跨 π“ 将为我们提供预测的变化。

       

      如同以前一样运行测试,会为我们给出以下报告。

      7_2


      正如您所注意到的,该报告与我们的第一份报告相同,但是我执行的其它测试有一些细微的改进,尽管这些测试未在此处共享。 请记住,所有这些智能系统都采用相同的入场信号(内置的 Awesome 振荡器信号),唯一的变化是在为尾随停止的实现。

         

      索引域

      索引域等价于相对域,因为它们将上述域 N 的元素转换到域,如此令这些新域中的每一个都与 E 和 E' 中的元素有关系。 用一个快捷的例子来描述这如何能够做到,如果我们考虑一个学校,拥有一系列班级(N)。 每个班级都有一个域(E),包含所有加入该班级的学生,每个班级还有一个领域椅子(E')。 因此,域 E 和 E' 被称为 N 索引域,因为它们都与班级有关系。

       

      对于交易者,我们将升级我们的域 N,其本有 11 个值,现在则有 11 个域。 每个域都将捕获价格范围变化的更精细增量。 举例来说,代替由 40(40% 变化)表示的元素,我们可以在域中有 9 个新变化:

       

      {32.5, 35.0, 37.5, 40.0, 42.5, 45.0, 47.5, 50.0}

       

      然后,该域映射到 E 和 E' 中的所有元素,我们在上一个例子中的情况是多维数据捕获第 1 个和第 2 个滞后的变化。 如果我们退后一步,考虑索引域对交易者的更常见应用,我们可以列出一个相当多的清单。 此处是五种可能的用途。

       

      移动平均线是交易者用来平滑市场数据短期波动,以及辨别资产价格趋势的常用指标。 这种技术涉及计算资产在时间窗口内的平均价格,然后在图表上绘制图表来揭示形态和趋势。

      索引集和范畴论可以提供一种以不同方式看待移动平均线的方法。 如前所述,索引集是由另一个域中的索引元素的集合。 在移动平均线的背景下,索引域可以构成计算移动平均线的不同周期,因为每个周期构成移动平均线周期的缓冲区,可以将其视为一个域。

      我们的 E 和 E' 可以分别是由典型价格计算的移动平均线,和由中位数价格计算的移动平均线。 可能还有超出本文中研究的两个域之外的其它域,例如在这种情况下,按收盘价或加权平均价格计算的均线,等等。 可以说,这种子域分类可以在范畴论之外进行研究。 然而,范畴论对这项研究的贡献,是对相对域关系的关注。 E 和 E'(f) 之间的态射,例如周期为 21 的中位数价格 MA,和所述周期为 34 的中位数价格 MA 之间的形态可以有很多用途。 其中一种可能是绘制一个移动平均波带,如果我们跟踪这些态射中权重的变化,我们可以把趋势还剩下多少延续时间进行量化,或者是否很快就会发生逆转。 

      除了通过分类和预测价格波动来追踪持仓的应用外,向交易者列出范畴论中多域和索引域的其它一些可能会有所帮助的应用。 以下是一些关于入场信号选择的问题。

      1. 订单簿分析。 当将订单簿中的买入和卖出订单记录为多域时(因为特定证券可以在不同的时间和不同的分配下做多或做空,这意味着证券的域会有“重复”),交易者可以判定证券的供求集中在何处。 如果做多的多域大于做空的多域,这可能是买入的信号,而如果做空的多域较大,则可能是卖出的信号。
      2. 投资组合分析。 多域可以代表交易者的投资组合,每个元素代表特定的证券或资产(为什么? 因为每种证券都可能被期权合约或其它衍生工具对冲,这意味着它们出现不止一次)。 通过分析这种多域的证券,并关注其表现,交易者可以决定分配更多表现良好的证券,并将表现不佳的证券平仓甚至做空。
      3. 风险管理。 在查看过去交易时段绩效的回撤时,多域可以代表交易者投资组合中的风险分布(每个常规化的回撤范围可能穿插在导致多域应用的各个时段中,并多次出现)。 如果高风险证券的多域大于低风险证券的多域,这可能是卖出一些高风险证券,并买入一些低风险证券的信号。
      4. 交易策略。 多域可以代表交易策略,每个元素代表一个特定的交易决策,例如按市价下单、挂单、止损或止盈(这些决策注定是重复的,它们的顺序很重要,这意味着多域将有助于捕获此序列信息,并进一步帮助人们进行分析)。 通过分析成功交易的多域,交易者也许决定为这些交易长期实施类似的策略。
      5. 技术指标。 多域可以代表技术指标,诸如移动平均线或布林带,记录它们在所研究时间段内的常规化值来(每个区间的常规化值在整个研究区间内必然是重复的,且注意多域中的这些重复序列,会令分析更完整)。 如果特定技术指标的数值多域高于或低于某个阈值,则可以将其用作买入或卖出信号。
      6. 相关性。 多域可以表示不同证券或资产之间的相关性。 相关值的范围通常为 -1.0 到 +1.0,如果将这些数值常规化为第一位小数点,则得到的数值像是 {1.0, 0.4, -0.7, 0.1,…},等值,这种相关性可以跨资产、或跨同一资产的时间窗口进行衡量,再有,重复必然会发生。 在一个多域中容纳这些重复,比如说与列出证券名称的协域有关系,一些人的分析才不会错过每个相关值的重要性。 如果与证券看涨动量高度相关的多域证券大于证券看跌动量,这可能是买入信号,反之则代表卖出。
      7. 时间序列分析。 多域可以表示时间序列数据,可令交易者分析一段时间内的趋势和形态。 同样,随着时间的推移,我们必然会重复相同的趋势形态,这就是为什么简单地列出一域中的每一个,也不会告诉您每个形态在时间序列中遵循的顺序。 故此,多域在这里将可灵活多变,并且在应用中,取决于其人的策略,如果特定时间段的值高于或低于平均值,这可能表明超卖情况,而如果是反面情况,或正在考虑的额外因素,则成为卖出的信号。
      8. 情绪分析。 多域可以展示市场参与者的情绪。 如果我们关注参与者的大多数情绪,该值如果经适当量化和常规化(例如芝加哥期权交易所波动率指数(VIX)),它必然会在分析期间重复。 如果多域按顺序捕获所有这些值,并且当前的积极情绪大于消极情绪,那么这可能是一个更坚定的买入信号,因为多域中记录了额外的信息,而不限于用过的不同值。
      9. 交易信号。 如果您有多个模拟账户,每个账户都设置好根据订阅分配接收信号,则多域可以代表交易信号。 每个信号的动作是买入还是卖出,按不同的交易量,当列表后,必然会有重复。 省略此类重复的典型域会丢失诸如每个信号决策所附带的交易量之类的信息,这可能会令针对这些信号的相对绩效分析有所失真。
      10. 市场数据。 多域可以表示市场数据,例如按时间帧的设置间隔的交易量,特别是如果交易量合约额度被常规化为四分位数,以便于解释。 在审查证券期间,这些常规化数额必然会重复出现。 由于多域可以容纳这种重复,因此很容易对选择与此交易量域配对的任何协域进行更简洁的分析。

       

      如此类似,列出索引域对交易者资金管理的可能用途可能很有用,因此这里列出了一个清单:

      1. 市值权重。 索引域可以代表投资组合中不同股票的市值。 从我们上面的图表来看,这将在域 N 中,域 E,E' 和其余的表示特定市值范围内的股票。 函数 f 将指导投资组合内股票的相对规模调整。
      2. 因素投资。 索引域可以检查影响股票或投资组合表现的不同因素,例如价值、动量和增长。 从上面的图表中,常规化的性能基准将以 N 为单位,其中 E、E' 和其它域代表因素。 态射 f 将设置每个因素的相对重要性。
      3. 风险平价。 针对投资组合构造的风险等配方法,旨在依据风险权重的基础上分配投资资本,以最优方式分散投资,将整个投资组合的风险和回报视为一体。 在这种情况下,我们的风险权重为 N,单个资产占 E,E',...以及定义资产之间相对权重的函数 f。
      4. 智能公测。 智能公测旨在通过使用传统市值指数的替代指数构建规则,将被动投资的优势和主动投资策略的优势结合起来。 它强调以基于规则和透明的方式捕捉市场低迷。 域 N 将含有常规化的业绩回报基准,而 E 和 E' 可以分别是主动 ETF 和被动 ETF。 函数 f 指导其相对权重。
      5. 风险值(VaR)。 风险值(VaR)是一种量化已建持仓潜在亏损风险的方法。 可以使用方差-协方差,或蒙特卡罗(Monte Carlo)方法从历史角度计算此指标。 投资银行通常应用 VaR 建模,以便把风险限定在公司可承受范围内,因为独立交易部门可能无意中因高度相关的资产令公司受损。 最大亏损的规模将是域 N,E,E' 将是不同类型的资产,例如股票和债券,而 f 则是据以往交易绩效得出的相对投资组合权重。  


      结束语

      总之,我们研究了多集合、相对集合和索引集合,及其在分类和预测价格波动中的潜在应用。 到目前为止,我们已经避免将域称为集合,但也许在接下来的文章中,我们会将它们称为集合,因为它们更容易理解,而域虽然更合适,因为它们是其它“集合类型”(如拓扑简单复合体、和其它形式)的总称,我们将在这些系列文章中没有这样的应用程序和示例。 因此,接下来,我们将使用集合来指代我们在本文和之前文章中所称的域。


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

      附加的文件 |
      TrailingCT7_1.mqh (19.52 KB)
      TrailingCT7_2.mqh (14.79 KB)
      ct_7.mqh (62.96 KB)
      复购算法:提高效率的数学模型 复购算法:提高效率的数学模型
      在本文中,我们将使用复购算法来更深入地了解交易系统的效率,并开始研究使用数学和逻辑提高交易效率的一般原则,以及在使用任意交易系统方面应用更能提高效率的非标准方法。
      交易中的资金管理 交易中的资金管理
      我们将研究构建资金管理系统的几种新方法,并定义其主要功能。 今天,有相当多的资金管理策略可以满足各种口味。 我们将尝试根据不同的数学增长模型考察几种管理资金的方法。
      神经网络变得轻松(第三十七部分):分散关注度 神经网络变得轻松(第三十七部分):分散关注度
      在上一篇文章中,我们讨论了在其架构中使用关注度机制的关系模型。 这些模型的具体特征之一是计算资源的密集功用。 在本文中,我们将研究于自我关注度模块内减少计算操作数量的机制之一。 这将提高模型的常规性能。
      神经网络实验(第 6 部分):自给自足的价格预测工具 — 感知器 神经网络实验(第 6 部分):自给自足的价格预测工具 — 感知器
      本文提供了一个的示例,运用感知器作为自给自足的价格预测工具,展示其一般概念和最简单的已制备智能系统,然后是其优化结果。