外汇EA编写教程:在MetaTrader 5中使用自组织特征映射(Kohonen映射)

简介

自组织特征映射(SOM)是一种人工神经网络,它采用无监督学习方法进行训练,从而形成训练样本输入空间的二维离散表示,称为映射。

这些映射类似于多维尺度,适用于高维数据的低维表示的分类和可视化。这个模型最初是由芬兰教授TeuvoKohonen提出的,作为一个人工神经网络,所以有时被称为Kohonen映射。

有许多算法可用,我们将使用https://www.ai-junkie.com上提供的代码。为了在MetaTrader 5客户机中实现数据可视化,我们将使用CINTBMP,一个用于创建BMP图像的库。本文将讨论Kohonen映射的一些简单应用。

1。自组织特征映射

自组织特征映射最早由TeuvoKohonen于1982年提出。与许多神经网络相比,该映射在输入数据和目标输出数据之间不需要一一对应。采用无监督学习方法对神经网络进行训练。

SOM被正式描述为从高维输入数据到常规低维阵列元素的有序、平滑的非线性映射。就其基本形式而言,它生成输入数据的相似度图。

SOM将高维数据之间的非线性统计关系转化为传统二维网格节点上高维数据图像点之间的简单几何关系。SOM映射可用于对高维数据进行分类和可视化。

1.1。网络体系结构

图1显示了一个简单的16节点网格Kohonen映射(4×4阵列,每个节点由三维输入向量连接)。

图 1. 简单 Kohonen 映射(16 个节点)

图1。简单Kohonen映射(16个节点)

每个节点都有以光栅和矢量表示的(x,y)坐标,以及由输入矢量定义的分量权重矢量。

1.2。学习算法

与许多其他类型的神经网络不同,SOM不需要指定目标输出值。相反,网格区域在节点权重与输入向量匹配的位置有选择地进行优化,以便更准确地模拟输入向量所属类的数据。

从随机权重的初始分布开始,经过多次迭代,SOM最终演化为稳定区域的映射。实际上,每个区域都是一个特征分类器,因此您可以将图形输出视为输入空间中的特征映射。

培训通过几个步骤和多次迭代进行:

  1. 使用随机值初始化每个节点的权重。
  2. 从训练数据集中随机选择一个向量。
  3. 检查每个节点以计算哪个节点的权重最接近输入向量。最近的节点通常被称为最佳匹配单元(BMU)。
  4. 计算BMU邻域的半径。最初,该值设置为网格的半径,但逐渐减小。
  5. 对于BMU半径内的任何节点,调整节点的权重,使其更类似于输入向量。节点离BMU越近,其重量变化的警告就越频繁。
  6. 对n个迭代重复步骤2。

有关更多信息,请访问https://www.ai-junkie.com。

2。案例研究

2.1。例1。SOM中的经典示例

Kohonen映射的经典例子是颜色聚类。

假设我们有一组八种颜色,每种颜色使用RGB颜色模型表示三维矢量。

  1. clrRed红色:(255,0,0);
  2. clrGreen绿色:(0128,0);
  3. clrBlue蓝色:(0,0255);
  4. clrDarkGreen深绿:(0100,0);
  5. clrDarkBlue深蓝:(0,0139);
  6. clrYellow黄色:(255、255、0);
  7. clrOrange橙色:(255、165、0);
  8. clrPurple紫色:(128、0、128)。

在处理MQL5中的Kohonen映射时,我们将遵循面向对象的范式。

我们需要两个类:常规网格节点的CSOMNODE和神经网络的CSOM。

//+------------------------------------------------------------------+
//| CSOMNode class                                                   |
//+------------------------------------------------------------------+
class CSOMNode
  {
protected:
   int               m_x1;
   int               m_y1;
   int               m_x2;
   int               m_y2;

   double            m_x;
   double            m_y;
   double            m_weights[];
public:
   //--- class constructor
                     CSOMNode();
   //--- class destructor
                    ~CSOMNode();
   //--- node initialization
   void              InitNode(int x1,int y1,int x2,int y2);
   //--- return coordinates of the node's center
   double            X()  const { return(m_x);}
   double            Y()  const { return(m_y);}
   //--- returns the node coordinates
   void              GetCoordinates(int &x1,int &y1,int &x2,int &y2);
   //--- returns the value of weight_index component of weight's vector
   double            GetWeight(int weight_index);
   //--- returns the squared distance between the node weights and specified vector
   double            CalculateDistance(double &vector[]);
   //--- adjust weights of the node
   void              AdjustWeights(double &vector[],double learning_rate,double influence);
  };

类方法的实现可以在som_ex1.mq5中找到。代码中有很多注释,我们将重点讨论概念的精化。

CSOM类描述如下:

//+------------------------------------------------------------------+
//| CSOM class                                                       |
//+------------------------------------------------------------------+
class CSOM
  {
protected:
   //--- class for using of bmp images
   cIntBMP           m_bmp;
   //--- grid mode
   int               m_gridmode;
   //--- bmp image size
   int               m_xsize;
   int               m_ysize;
   //--- number of nodes
   int               m_xcells;
   int               m_ycells;
   //--- array with nodes
   CSOMNode          m_som_nodes[];
   //--- total items in training set
   int               m_total_training_sets;
   //--- training set array
   double            m_training_sets_array[];
protected:
   //--- radius of the neighbourhood (used for training)
   double            m_map_radius;
   //--- time constant (used for training)
   double            m_time_constant;
   //--- initial learning rate (used for training)
   double            m_initial_learning_rate;
   //--- iterations (used for training)
   int               m_iterations;

public:
   //--- class constructor
                     CSOM();
   //--- class destructor
                    ~CSOM();
   //--- net initialization
   void              InitParameters(int iterations,int xcells,int ycells,int bmpwidth,int bmpheight);
   //--- finds the best matching node, closest to the specified vector
   int               BestMatchingNode(double &vector[]);
   //--- train method
   void              Train();
   //--- render method
   void              Render();
   //--- shows the bmp image on the chart
   void              ShowBMP(bool back);
   //--- adds a vector to training set
   void              AddVectorToTrainingSet(double &vector[]);
   //--- shows the pattern title
   void              ShowPattern(double c1,double c2,double c3,string name);
   //--- adds a pattern to training set
   void              AddTrainPattern(double c1,double c2,double c3);
   //--- returns the RGB components of the color
   void              ColToRGB(int col,int &r,int &g,int &b);
   //--- returns the color by RGB components
   int               RGB256(int r,int g,int b) const {return(r+256*g+65536*b);      }
   //--- deletes image from the chart
   void              NetDeinit();
  };

CSOM类的使用相当简单:

CSOM KohonenMap;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
  MathSrand(200);
//--- initialize net, 10000 iterations will be used for training
//--- the net contains 15x20 nodes, bmp image size 400x400
   KohonenMap.InitParameters(10000,15,20,400,400);
//-- add RGB-components of each color from training set
   KohonenMap.AddTrainPattern(255,  0,  0);   // Red
   KohonenMap.AddTrainPattern(  0,128,  0);   // Green
   KohonenMap.AddTrainPattern(  0,  0,255);   // Blue
   KohonenMap.AddTrainPattern(  0,100,  0);   // Dark green
   KohonenMap.AddTrainPattern(  0,  0,139);   // Dark blue
   KohonenMap.AddTrainPattern(255,255,  0);   // Yellow
   KohonenMap.AddTrainPattern(255,165,  0);   // Orange
   KohonenMap.AddTrainPattern(128,  0,128);   // Purple
//--- train net
   KohonenMap.Train();
//--- render map to bmp
   KohonenMap.Render();
//--- show patterns and titles for each color
   KohonenMap.ShowPattern(255,  0,  0,"Red");
   KohonenMap.ShowPattern(  0,128,  0,"Green");
   KohonenMap.ShowPattern(  0,  0,255,"Blue");
   KohonenMap.ShowPattern(  0,100,  0,"Dark green");
   KohonenMap.ShowPattern(  0,  0,139,"Dark blue");
   KohonenMap.ShowPattern(255,255,  0,"Yellow");
   KohonenMap.ShowPattern(255,165,  0,"Orange");
   KohonenMap.ShowPattern(128,  0,128,"Purple");
//--- show bmp image on the chart
   KohonenMap.ShowBMP(false);
//---
  }

结果如图2所示。

图 1. 简单 Kohonen 映射(16 个节点)0

图2。som_ex1.mq5 ea事务的输出

Kohonen映射的学习动态如图3所示(见以下步骤):

图 1. 简单 Kohonen 映射(16 个节点)1

图3。Kohonen映射的学习动力学

如图3所示,在2400步之后形成了Kohonen映射。

如果我们创建一个包含300个节点的网格,并指定图像大小为400 x 400:

//--- lattice of 15x20 nodes, image size 400x400
   KohonenMap.InitParameters(10000,15,20,400,400);

我们将得到如图4所示的图像:

图 1. 简单 Kohonen 映射(16 个节点)2

图4。具有300个节点和400 x 400图像大小的Kohonen映射

如果你阅读guido deboeck和teuvo kohonen的书《金融中的视觉探索:使用自组织地图》,你会记住网格节点也可以表示为六边形单元。通过修改EA事务代码,我们可以实现其他可视化方式。

som-ex1-hex.mq 5的结果如图5所示。

图 1. 简单 Kohonen 映射(16 个节点)3

图5。具有300个节点和400 x 400图像大小的Kohonen映射,由六角形单元表示

在此版本中,我们可以使用输入参数定义单元格边框的显示:

// input parameter, used to show hexagonal cells
input bool HexagonalCell=true;
// input parameter, used to show borders
input bool ShowBorders=true;

在某些情况下,我们不需要显示单元格边框。如果指定showborders=false,将得到以下图像(参见图6):

图 1. 简单 Kohonen 映射(16 个节点)4

图6。Kohonen映射
包含300个节点,图像大小为400 x 400,以六角形单元描述节点,不显示单元边界。

在第一个例子中,我们在一个训练集中使用了八种颜色,其中有一个指定的颜色组件。我们可以通过在CSOM类中添加两种方法来扩展训练集并简化颜色组件的分配。

注意,在这种情况下,Kohonen映射很简单,因为在颜色空间中只有少数颜色是分开的。因此,我们得到了本地化的集群。

如果我们考虑使用更多的颜色,并且颜色成分之间的距离更近,就会出现问题。

2.2。例2。使用Web颜色作为培训示例

在MQL5中,Web颜色是一个预定义的常量。

图 1. 简单 Kohonen 映射(16 个节点)5

图7。网页色彩

如果我们把Kohonen算法应用到一组具有相似分量的向量上呢?

我们可以从CSOM类派生一个CSOM Web类:

//+------------------------------------------------------------------+
//| CSOMWeb class                                                    |
//+------------------------------------------------------------------+
class CSOMWeb : public CSOM
  {
public:
//--- adds a color to training set (used for colors, instead of AddTrainPattern)
   void              AddTrainColor(int col);
//--- method of showing of title of the pattern (used for colors, instead of ShowPattern)
   void              ShowColor(int col,string name);
  };

如您所见,为了简化颜色处理过程,我们添加了两个新方法,现在不需要显式地指定颜色组件。

class方法的实现如下:

//+------------------------------------------------------------------+
//| Adds a color to training set                                     |
//| (used for colors, instead of AddTrainPattern)                    |
//+------------------------------------------------------------------+
void CSOMWeb::AddTrainColor(int col)
  {
   double vector[];
   ArrayResize(vector,3);
   int r=0;
   int g=0;
   int b=0;
   ColToRGB(col,r,g,b);
   vector[0]=r;
   vector[1]=g;
   vector[2]=b;
   AddVectorToTrainingSet(vector);
   ArrayResize(vector,0);
  }
//+------------------------------------------------------------------+
//| Method of showing of title of the pattern                        |
//| (used for colors, instead of ShowPattern)                        |
//+------------------------------------------------------------------+
void CSOMWeb::ShowColor(int col,string name)
  {
   int r=0;
   int g=0;
   int b=0;
   ColToRGB(col,r,g,b);
   ShowPattern(r,g,b,name);
  }

所有Web颜色都可以合并到数组Web_colors[]:

//--- web colors array
color web_colors[132]=
  {
   clrBlack, clrDarkGreen, clrDarkSlateGray, clrOlive, clrGreen, 
   clrTeal, clrNavy, clrPurple, clrMaroon, clrIndigo, clrMidnightBlue, 
   clrDarkBlue, clrDarkOliveGreen, clrSaddleBrown, clrForestGreen, clrOliveDrab, 
   clrSeaGreen, clrDarkGoldenrod, clrDarkSlateBlue, clrSienna, clrMediumBlue, 
   clrBrown, clrDarkTurquoise, clrDimGray, clrLightSeaGreen, clrDarkViolet, 
   clrFireBrick, clrMediumVioletRed, clrMediumSeaGreen, clrChocolate, clrCrimson, 
   clrSteelBlue, clrGoldenrod, clrMediumSpringGreen, clrLawnGreen, clrCadetBlue, 
   clrDarkOrchid, clrYellowGreen, clrLimeGreen, clrOrangeRed, clrDarkOrange, 
   clrOrange, clrGold, clrYellow, clrChartreuse, clrLime, clrSpringGreen, 
   clrAqua, clrDeepSkyBlue, clrBlue, clrMagenta, clrRed, clrGray, 
   clrSlateGray, clrPeru, clrBlueViolet, clrLightSlateGray, clrDeepPink, 
   clrMediumTurquoise, clrDodgerBlue, clrTurquoise, clrRoyalBlue, clrSlateBlue, 
   clrDarkKhaki, clrIndianRed, clrMediumOrchid, clrGreenYellow, clrMediumAquamarine, 
   clrDarkSeaGreen, clrTomato, clrRosyBrown, clrOrchid, clrMediumPurple, 
   clrPaleVioletRed, clrCoral, clrCornflowerBlue, clrDarkGray, clrSandyBrown, 
   clrMediumSlateBlue, clrTan, clrDarkSalmon, clrBurlyWood, clrHotPink, 
   clrSalmon, clrViolet, clrLightCoral, clrSkyBlue, clrLightSalmon, 
   clrPlum, clrKhaki, clrLightGreen, clrAquamarine, clrSilver, 
   clrLightSkyBlue, clrLightSteelBlue, clrLightBlue, clrPaleGreen, clrThistle, 
   clrPowderBlue, clrPaleGoldenrod, clrPaleTurquoise, clrLightGray, clrWheat, 
   clrNavajoWhite, clrMoccasin, clrLightPink, clrGainsboro, clrPeachPuff, 
   clrPink, clrBisque, clrLightGoldenrod, clrBlanchedAlmond, clrLemonChiffon, 
   clrBeige, clrAntiqueWhite, clrPapayaWhip, clrCornsilk, clrLightYellow, 
   clrLightCyan, clrLinen, clrLavender, clrMistyRose, clrOldLace, 
   clrWhiteSmoke, clrSeashell, clrIvory, clrHoneydew, clrAliceBlue, 
   clrLavenderBlush, clrMintCream, clrSnow, clrWhite
  };

OnInit()函数的形式很简单:

CSOMWeb KohonenMap;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
   MathSrand(200);
   int total_web_colors=ArraySize(web_colors);
//--- initialize net, 10000 iterations will be used for training
//--- the net contains 15x20 nodes, bmp image size 400x400
   KohonenMap.InitParameters(10000,50,50,500,500);
//-- add all web colors to training set
   for(int i=0; i<total_web_colors; i++)
     {
      KohonenMap.AddTrainColor(web_colors[i]);
     }
//--- train net
   KohonenMap.Train();
//--- render map to bmp
   KohonenMap.Render();
//--- show patterns and titles for each color
   for(int i=0; i<total_web_colors; i++)
     {
      KohonenMap.ShowColor(web_colors[i],ColorToString(web_colors[i],true));
     }
//--- show bmp image on the chart
   KohonenMap.ShowBMP(false);
  }

如果我们启动som-ex2-hex.mq5,我们将得到图8所示的图片。

图 1. 简单 Kohonen 映射(16 个节点)6

图8。网络颜色的Kohonen映射

如您所见,有一些簇,但有些颜色(如XXblue)位于不同的区域。

其原因在于训练集的结构,它有许多向量,且分量很近。

2.3。例3。产品聚类

接下来我们将看一个简单的例子,尝试根据三个参数(蛋白质、碳水化合物和脂肪)及其相似性对25种食物进行分组。

nbsp; 食品 蛋白质 &碳水化合物 &脂肪
1; &苹果 0.4 11.8 0.1
2; &牛油果 1.9 1.9 19.5
3; &香蕉 1.2 23.2 0.3
4; &牛排 20.9 0 7.9
5; &nbsp;巨无霸汉堡 13 19 11
6; &巴西螺母 15.5 2.9 68.3
7; &nbsp;面包 10.5 37 3.2
8; &黄油 1 0 81
9; &奶酪 25 0.1 34.4
10; &奶酪蛋糕 6.4 28.2 22.7
11; &饼干 5.7 58.7 29.3
12; &nbsp;玉米片 7 84 0.9
13; &鸡蛋 12.5 0 10.8
14; &nbsp;炸鸡 17 7 20
15; &nbsp;法式炸薯条 3 36 13
16; &热巧克力 3.8 19.4 10.2
17; &意大利辣香肠 20.9 5.1 38.3
18; &比萨 12.5 30 11
19; &nbsp;猪肉派
*
10.1 27.3 24.2
20; &马铃薯 1.7 16.1 0.3
21; &大米 6.9 74 2.8
22; &烧鸡 26.1 0.3 5.8
23; &nbsp;糖 0 95.1 0
24; &nbsp;金枪鱼牛排 25.6 0 0.5
25; &水 0 0 0

表1。25种食物中的蛋白质、碳水化合物和脂肪。

这个问题很有趣,因为输入向量的值是不同的,并且每个分量都有自己的值范围。这对于可视化非常重要,因为我们使用组件范围在0到255之间的RGB颜色模型。

幸运的是,在这种情况下,输入向量也是三维的,因此我们可以使用RGB颜色模式来可视化Kohonen映射。

//+------------------------------------------------------------------+
//| CSOMFood class                                                   |
//+------------------------------------------------------------------+
class CSOMFood : public CSOM
  {
protected:
   double            m_max_values[];
   double            m_min_values[];
public:
   void              Train();
   void              Render();
   void              ShowPattern(double c1,double c2,double c3,string name);
  };

如您所见,我们添加了数组m_max_values[]和m_min_values[],以存储训练集的最大值和最小值。为了可视化RGB颜色模型,我们需要“校准”,因此我们重载了train()、render()和showPattern()方法。

列()可用于查找最大值和最小值。

//--- find minimal and maximal values of the training set
   ArrayResize(m_max_values,3);
   ArrayResize(m_min_values,3);

   for(int j=0; j<3; j++)
     {
      double maxv=m_training_sets_array[3+j];
      double minv=m_training_sets_array[3+j];
      for(int i=1; i<m_total_training_sets; i++)
        {
         double v=m_training_sets_array[3*i+j];
         if(v>maxv) {maxv=v;}
         if(v<minv) {minv=v;}
        }
      m_max_values[j]=maxv;
      m_min_values[j]=minv;
      Print(j,"m_min_value=",m_min_values[j],"m_max_value=",m_max_values[j]);
     }

为了在RGB颜色模型中显示组件,我们需要修改render()方法:

// int r = int(m_som_nodes[ind].GetWeight(0));
// int g = int(m_som_nodes[ind].GetWeight(1));
// int b = int(m_som_nodes[ind].GetWeight(2));

int r=int ((255*(m_som_nodes[ind].GetWeight(0)-m_min_values[0])/(m_max_values[0]-m_min_values[0])));
int g=int ((255*(m_som_nodes[ind].GetWeight(1)-m_min_values[1])/(m_max_values[1]-m_min_values[1])));
int b=int ((255*(m_som_nodes[ind].GetWeight(2)-m_min_values[2])/(m_max_values[2]-m_min_values[2])));

som_ex3.mq5的结果如图9所示。

图 1. 简单 Kohonen 映射(16 个节点)7

图9。基于蛋白质、碳水化合物和脂肪含量按相似性分组的食物图谱

成分分析。从地图上可以看出,由于碳水化合物(第二种成分)的存在,糖、大米和玉米片被涂成绿色。黄油位于蓝色区域,含有大量脂肪(第三种成分)。牛排、烤鸡和金枪鱼牛排含有大量蛋白质(第一种成分)。

您可以通过在食物组成表(备用表)中添加新食物来扩展培训集。

如你所见,用“纯”R、G和B色表示的方向问题已经解决了。其他含有等量(或几乎等量)的食物呢?我们将进一步研究组件平面,这是非常有用的,特别是当输入向量的维数大于3时。

2.4。例4.4尺寸箱。Fisher Iris数据集。CMYK

对于三维矢量,可视化没有问题。由于使用了RGB颜色模型来可视化颜色组件,因此结果是清晰的。

在处理高维数据时,我们需要找到可视化的方法。一个简单的解决方案是使用与向量长度成比例的颜色来绘制渐变(例如黑白渐变)。另一种方法是使用其他颜色空间。在这个例子中,我们将研究费希尔虹膜数据集的CMYK颜色模型。有更好的解决方案,我们将进一步讨论。

虹膜数据集,又称Fisher-Iris数据集,是R.Fisher(1936)提出的多元数据集,作为判别分析的一个例子。数据集包括来自三个虹膜物种(鸢尾、弗吉尼亚鸢尾和虹膜发色团)的50个样本。

每个样本测量了四个特征,即花萼和花瓣的长度和宽度,单位为厘米。

图 1. 简单 Kohonen 映射(16 个节点)8

图10。虹膜

每个样品有四个特点:

  1. 花萼长度;
  2. 花萼宽度;
  3. 花瓣长度;
  4. 花瓣宽度。

IRIS数据集可以在som_ex4.mq5中找到。

在这种情况下,我们将使用中间的CMYK颜色空间来绘制,也就是说,我们将节点的权重作为CMYK空间中的向量。为了使结果可视化,将CMYK模式转换为RGB模式。将新方法int csom::cmyk2col(uchar c、uchar m、uchar y、uchar k)添加到csom类中,该类在csom::render()方法中使用。我们还必须修改用于支持4维向量的类。

结果如图11所示。

图 1. 简单 Kohonen 映射(16 个节点)9

图11。用CMYK颜色模型绘制虹膜数据集的Kohonen映射

我们看到了什么?我们没有得到一个完整的聚类(因为这个问题的特点),但是我们可以看到虹膜的线性分离。

虹膜尾的线性分离是由于CMYK空间中存在一个大的“洋红色”成分(第二成分)。

2.6。构件平面分析

从上面的例子(食物和虹膜数据聚类)中,我们可以看到数据可视化中存在一个问题。

例如,对于食物问题,我们使用关于特定颜色(红、绿、蓝)的信息来分析Kohonen映射。除了基本的聚类之外,还有一些含有某些成分的食物。此外,如果成分几乎相等,分析将变得困难。

组件平面提供了查看每种食物相对强度的可能性。

我们需要将cintbmp类(array m_bmp[])的实例添加到csom类中,并修改相应的呈现方法。我们还需要一个渐变图来可视化每个组件的强度(值越小,值越蓝,值越大,越红):

clrRed0

图12。渐变调色板

我们添加了调色板[768]数组、getPalColor()方法和Blend()方法。节点的渲染放置在rendercell()方法中。

虹膜数据集

som-ex4-cpr.mq5的结果如图13所示。

clrRed1

图13。虹膜数据集的分量平面表示

在这种情况下,我们将使用一个具有30×30节点和300×300图像大小的网格。

组件平面在相关检测中起着重要作用:通过比较这些平面,甚至可以通过目视检测到一些相关变量。重新组织组件平面将更方便,以便相关平面可以彼此相邻。这样,很容易选择感兴趣的组件组合进行进一步的研究。

让我们看看下面的组件平面(图14)。

最大和最小分量的值显示在渐变表中。

clrRed2

图14。虹膜数据集。部件平面

图15显示了通过CMYK颜色模型的所有这些组件平面。

clrRed3

图15。虹膜数据集。用CMYK颜色模型表示的Kohonen映射

让我们回忆一下虹膜的类型。通过使用组件平面分析(图14),可以看出该类型在组件平面1(花萼长度)、3(花瓣长度)和4(花瓣宽度)中具有最小值。

显然,这种类型在第二组分平面(花萼宽度)有一个最大值,这与我们在CMYK颜色模型中的结果一致(图15中的洋红色组分)。

食物聚类

现在,让我们使用组件平面分析来研究较低的食物聚类问题(som-ex3-cpr.mq5)。

结果如图16所示(30×30个节点,图像大小300×300,由无边框的六角形单元表示)。

clrRed4

图16。基于分量平面表示的食品Kohonen映射

我们添加了在CSOM类的showPattern()方法中显示标题(输入参数showTitles=true)的选项。

组成平面(蛋白质、碳水化合物、脂肪)如下:

clrRed5

图17。Kohonen食物地图。组件平面和RGB颜色型号

图17所示的组分平面表示是对食品组分结构的一个新观点。此外,它还提供了在图9所示的RGB模式中不可见的其他信息。

例如,现在我们可以在第一个成分平面(蛋白质)中看到奶酪。在RGB颜色模型中,因为它包含脂肪(第二个成分),所以显示的颜色接近洋红色。

2.5。任意尺寸构件平面的实现

我们研究的例子有一些特定的功能,它们的尺寸是固定的,可视化算法根据表示方法(RGB和CMYK颜色模型)而变化。

现在,我们可以为任何维生成算法,但在这种情况下,我们只将组件平面可视化。程序必须能够从csv文件加载任意数据。

例如,food.csv如下:

Protein;Carbohydrate;Fat;Title
0.4;11.8;0.1;Apples
1.9;1.9;19.5;Avocado
1.2;23.2;0.3;Bananas
20.9;0.0;7.9;Beef Steak
13.0;19.0;11.0;Big Mac
15.5;2.9;68.3;Brazil Nuts
10.5;37.0;3.2;Bread
1.0;0.0;81.0;Butter
25.0;0.1;34.4;Cheese
6.4;28.2;22.7;Cheesecake
5.7;58.7;29.3;Cookies
7.0;84.0;0.9;Cornflakes
12.5;0.0;10.8;Eggs
17.0;7.0;20.0;Fried Chicken
3.0;36.0;13.0;Fries
3.8;19.4;10.2;Hot Chocolate
20.9;5.1;38.3;Pepperoni
12.5;30.0;11.0;Pizza
10.1;27.3;24.2;Pork Pie
1.7;16.1;0.3;Potatoes
6.9;74.0;2.8;Rice
26.1;0.3;5.8;Roast Chicken
0.0;95.1;0.0;Sugar
25.6;0.0;0.5;Tuna Steak
0.0;0.0;0.0;Water

文件的第一行包含输入数据向量的名称(标题)。我们需要使用标题来区分组件平面。我们将在渐变面板中列出它们的名称。

样品的名称在最后一列,在我们的示例中是食品的名称。

som.mq5(oniit函数)的代码很简单:

CSOM KohonenMap;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MathSrand(200);
//--- load patterns from file
   if(!KohonenMap.LoadTrainDataFromFile(DataFileName))
     {
      Print("Error in loading data for training.");
      return(1);
     }
//--- train net
   KohonenMap.Train();
//--- render map
   KohonenMap.Render();
//--- show patterns from training set
   KohonenMap.ShowTrainPatterns();
//--- show bmp on the chart
   KohonenMap.ShowBMP(false);
   return(0);
  }

在我们的示例“food”中,datafilename输入参数中指定了包含培训样本的文件名。CSV“。

结果如图18所示。

clrRed6

图18。用黑白渐变色表示的食物的Kohonen映射

我们还添加了颜色方案输入参数来选择渐变方案。

目前有四种颜色方案可用(颜色方案分别为0、1、2、4,分别代表黑白、深蓝、蓝、绿、黄、红、黑、绿)。

clrRed7

通过向csom::initparameters()方法添加渐变,您可以轻松地添加自己的解决方案。

颜色方案可以从EA事务的输入参数中选择:

clrRed8

同样,我们可以准备iris-fisher.csv:

Sepal length;Sepal width;Petal length;Petal width;Title
5.1;3.5;1.4;0.2;setosa
4.9;3.0;1.4;0.2;setosa
4.7;3.2;1.3;0.2;setosa
4.6;3.1;1.5;0.2;setosa
5.0;3.6;1.4;0.2;setosa
5.4;3.9;1.7;0.4;setosa
4.6;3.4;1.4;0.3;setosa
5.0;3.4;1.5;0.2;setosa
4.4;2.9;1.4;0.2;setosa
4.9;3.1;1.5;0.1;setosa
5.4;3.7;1.5;0.2;setosa
4.8;3.4;1.6;0.2;setosa
4.8;3.0;1.4;0.1;setosa
4.3;3.0;1.1;0.1;setosa
5.8;4.0;1.2;0.2;setosa
5.7;4.4;1.5;0.4;setosa
5.4;3.9;1.3;0.4;setosa
5.1;3.5;1.4;0.3;setosa
5.7;3.8;1.7;0.3;setosa
5.1;3.8;1.5;0.3;setosa
5.4;3.4;1.7;0.2;setosa
5.1;3.7;1.5;0.4;setosa
4.6;3.6;1.0;0.2;setosa
5.1;3.3;1.7;0.5;setosa
4.8;3.4;1.9;0.2;setosa
5.0;3.0;1.6;0.2;setosa
5.0;3.4;1.6;0.4;setosa
5.2;3.5;1.5;0.2;setosa
5.2;3.4;1.4;0.2;setosa
4.7;3.2;1.6;0.2;setosa
4.8;3.1;1.6;0.2;setosa
5.4;3.4;1.5;0.4;setosa
5.2;4.1;1.5;0.1;setosa
5.5;4.2;1.4;0.2;setosa
4.9;3.1;1.5;0.2;setosa
5.0;3.2;1.2;0.2;setosa
5.5;3.5;1.3;0.2;setosa
4.9;3.6;1.4;0.1;setosa
4.4;3.0;1.3;0.2;setosa
5.1;3.4;1.5;0.2;setosa
5.0;3.5;1.3;0.3;setosa
4.5;2.3;1.3;0.3;setosa
4.4;3.2;1.3;0.2;setosa
5.0;3.5;1.6;0.6;setosa
5.1;3.8;1.9;0.4;setosa
4.8;3.0;1.4;0.3;setosa
5.1;3.8;1.6;0.2;setosa
4.6;3.2;1.4;0.2;setosa
5.3;3.7;1.5;0.2;setosa
5.0;3.3;1.4;0.2;setosa
7.0;3.2;4.7;1.4;versicolor
6.4;3.2;4.5;1.5;versicolor
6.9;3.1;4.9;1.5;versicolor
5.5;2.3;4.0;1.3;versicolor
6.5;2.8;4.6;1.5;versicolor
5.7;2.8;4.5;1.3;versicolor
6.3;3.3;4.7;1.6;versicolor
4.9;2.4;3.3;1.0;versicolor
6.6;2.9;4.6;1.3;versicolor
5.2;2.7;3.9;1.4;versicolor
5.0;2.0;3.5;1.0;versicolor
5.9;3.0;4.2;1.5;versicolor
6.0;2.2;4.0;1.0;versicolor
6.1;2.9;4.7;1.4;versicolor
5.6;2.9;3.6;1.3;versicolor
6.7;3.1;4.4;1.4;versicolor
5.6;3.0;4.5;1.5;versicolor
5.8;2.7;4.1;1.0;versicolor
6.2;2.2;4.5;1.5;versicolor
5.6;2.5;3.9;1.1;versicolor
5.9;3.2;4.8;1.8;versicolor
6.1;2.8;4.0;1.3;versicolor
6.3;2.5;4.9;1.5;versicolor
6.1;2.8;4.7;1.2;versicolor
6.4;2.9;4.3;1.3;versicolor
6.6;3.0;4.4;1.4;versicolor
6.8;2.8;4.8;1.4;versicolor
6.7;3.0;5.0;1.7;versicolor
6.0;2.9;4.5;1.5;versicolor
5.7;2.6;3.5;1.0;versicolor
5.5;2.4;3.8;1.1;versicolor
5.5;2.4;3.7;1.0;versicolor
5.8;2.7;3.9;1.2;versicolor
6.0;2.7;5.1;1.6;versicolor
5.4;3.0;4.5;1.5;versicolor
6.0;3.4;4.5;1.6;versicolor
6.7;3.1;4.7;1.5;versicolor
6.3;2.3;4.4;1.3;versicolor
5.6;3.0;4.1;1.3;versicolor
5.5;2.5;4.0;1.3;versicolor
5.5;2.6;4.4;1.2;versicolor
6.1;3.0;4.6;1.4;versicolor
5.8;2.6;4.0;1.2;versicolor
5.0;2.3;3.3;1.0;versicolor
5.6;2.7;4.2;1.3;versicolor
5.7;3.0;4.2;1.2;versicolor
5.7;2.9;4.2;1.3;versicolor
6.2;2.9;4.3;1.3;versicolor
5.1;2.5;3.0;1.1;versicolor
5.7;2.8;4.1;1.3;versicolor
6.3;3.3;6.0;2.5;virginica
5.8;2.7;5.1;1.9;virginica
7.1;3.0;5.9;2.1;virginica
6.3;2.9;5.6;1.8;virginica
6.5;3.0;5.8;2.2;virginica
7.6;3.0;6.6;2.1;virginica
4.9;2.5;4.5;1.7;virginica
7.3;2.9;6.3;1.8;virginica
6.7;2.5;5.8;1.8;virginica
7.2;3.6;6.1;2.5;virginica
6.5;3.2;5.1;2.0;virginica
6.4;2.7;5.3;1.9;virginica
6.8;3.0;5.5;2.1;virginica
5.7;2.5;5.0;2.0;virginica
5.8;2.8;5.1;2.4;virginica
6.4;3.2;5.3;2.3;virginica
6.5;3.0;5.5;1.8;virginica
7.7;3.8;6.7;2.2;virginica
7.7;2.6;6.9;2.3;virginica
6.0;2.2;5.0;1.5;virginica
6.9;3.2;5.7;2.3;virginica
5.6;2.8;4.9;2.0;virginica
7.7;2.8;6.7;2.0;virginica
6.3;2.7;4.9;1.8;virginica
6.7;3.3;5.7;2.1;virginica
7.2;3.2;6.0;1.8;virginica
6.2;2.8;4.8;1.8;virginica
6.1;3.0;4.9;1.8;virginica
6.4;2.8;5.6;2.1;virginica
7.2;3.0;5.8;1.6;virginica
7.4;2.8;6.1;1.9;virginica
7.9;3.8;6.4;2.0;virginica
6.4;2.8;5.6;2.2;virginica
6.3;2.8;5.1;1.5;virginica
6.1;2.6;5.6;1.4;virginica
7.7;3.0;6.1;2.3;virginica
6.3;3.4;5.6;2.4;virginica
6.4;3.1;5.5;1.8;virginica
6.0;3.0;4.8;1.8;virginica
6.9;3.1;5.4;2.1;virginica
6.7;3.1;5.6;2.4;virginica
6.9;3.1;5.1;2.3;virginica
5.8;2.7;5.1;1.9;virginica
6.8;3.2;5.9;2.3;virginica
6.7;3.3;5.7;2.5;virginica
6.7;3.0;5.2;2.3;virginica
6.3;2.5;5.0;1.9;virginica
6.5;3.0;5.2;2.0;virginica
6.2;3.4;5.4;2.3;virginica
5.9;3.0;5.1;1.8;virginica

结果如图19所示。

clrRed9

图19。虹膜数据集。使用红黑绿配色方案的组件平面(配色方案=2,iris fisher.csv)

现在我们有了实用的工具。

2.6。例5。市场热图

自组织特征映射可用于市场运作映射。有时需要市场架构图,市场热图是一个有用的工具。根据经济部门的不同,不同的股票组合在一起。

股票的当前颜色取决于当前的增长率(百分比):

clrGreen0

图20。标普500指数股票的市场热度图

图20显示了标准普尔股票的每周市场热度图(https://finviz.com)。颜色取决于增长率(以百分比为单位):

clrGreen

股票矩形的大小取决于市场价值。同样的分析可以在MetaTrader 5客户机上使用Kohonen映射完成。

我们的想法是使用几个增长时间表(以百分比计)。我们有工具来处理Kohonen映射,所以我们只需要将数据保存到中的脚本。CSV文件。

可以在 MetaQuotes Demo 服务器中找到有关美洲股票 CFD 价格的价格数据(#AA、#AIG、#AXP、#BA、#BAC、#C、#CAT、#CVX、#DD、#DIS、#EK、#GE、#HD、#HON、#HPQ、#IBM、#INTC、#IP、#JNJ、#JPM、#KFT、#KO、#MCD、#MMM、#MO、#MRK、#MSFT、#PFE、#PG、#T、#TRV、#UTX、#VZ、#WMT 和 #XOM)。

准备dj.csv文件的脚本非常简单:

//+------------------------------------------------------------------+
//|                                                           DJ.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

string s_cfd[35]=
  {
   "#AA","#AIG","#AXP","#BA","#BAC","#C","#CAT","#CVX","#DD","#DIS","#EK","#GE",
   "#HD","#HON","#HPQ","#IBM","#INTC","#IP","#JNJ","#JPM","#KFT","#KO","#MCD","#MMM",
   "#MO","#MRK","#MSFT","#PFE","#PG","#T","#TRV","#UTX","#VZ","#WMT","#XOM"
  };
//+------------------------------------------------------------------+
//| Returns price change in percents                                 |
//+------------------------------------------------------------------+
double PercentChange(double Open,double Close)
  {
   return(100.0*(Close-Open)/Close);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   ResetLastError();
   int filehandle=FileOpen("dj.csv",FILE_WRITE|FILE_ANSI);
   if(filehandle==INVALID_HANDLE)
     {
      Alert("Error opening file");
      return;
     }
//---
   MqlRates MyRates[];
   ArraySetAsSeries(MyRates,true);

   string t="M30;M60;M90;M120;M150;M180;M210;M240;Title";
   FileWrite(filehandle,t);
   Print(t);

   int total_symbols=ArraySize(s_cfd);

   for(int i=0; i<total_symbols; i++)
     {
      string cursymbol=s_cfd[i];

      int copied1=CopyRates(cursymbol,PERIOD_M30,0,8,MyRates);
      if(copied1>0)
        {
         string s="";
         s=s+DoubleToString(PercentChange(MyRates[1].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[2].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[3].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[4].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[5].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[6].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[7].open,MyRates[0].close),3)+";";
         s=s+cursymbol;
         Print(s);
         FileWrite(filehandle,s);
         }
         else
           {
            Print("Error in request of historical data on symbol ",cursymbol);
            return;
           }
     }
   Alert("OK");
   FileClose(filehandle);

  }
//+------------------------------------------------------------------+

必须下载历史数据,并且可以使用下载历史脚本来实现自动下载。

作为dj.mq5脚本的结果,我们将获得包含以下数据的dj.csv文件:

M30;M60;M90;M120;M150;M180;M210;M240;Title
0.063;-0.564;-0.188;0.376;0.251;0.313;0.627;0.439;#AA
-0.033;0.033;0.067;-0.033;0.067;-0.133;0.266;0.533;#AIG
-0.176;0.039;0.039;0.274;0.196;0.215;0.430;0.646;#AXP
-0.052;-0.328;-0.118;0.315;0.223;0.367;0.288;0.328;#BA
-0.263;-0.351;-0.263;0.000;-0.088;0.088;0.000;-0.088;#BAC
-0.224;-0.274;-0.374;-0.100;-0.274;-0.224;-0.324;-0.598;#C
-0.069;-0.550;-0.079;0.766;0.727;0.638;0.736;0.589;#CAT
-0.049;-0.168;0.099;0.247;0.187;0.049;0.355;0.266;#CVX
0.019;-0.058;0.058;0.446;0.174;0.349;0.136;-0.329;#DD
-0.073;-0.219;-0.146;0.267;0.170;0.292;0.170;0.267;#DIS
-1.099;-1.923;-1.099;0.275;0.275;0.275;-0.549;-1.374;#EK
-0.052;-0.310;-0.103;0.362;0.258;0.362;0.465;0.258;#GE
-0.081;-0.244;-0.326;-0.136;0.081;0.326;0.489;0.489;#HD
-0.137;-0.427;-0.171;0.427;0.445;0.342;0.325;0.359;#HON
-0.335;-0.363;-0.112;0.112;0.168;0.307;0.475;0.251;#HPQ
0.030;-0.095;0.065;0.190;0.071;0.214;0.279;0.327;#IBM
0.000;-0.131;-0.044;-0.088;-0.044;0.000;0.000;0.044;#INTC
-0.100;-0.200;-0.166;0.100;-0.067;0.033;-0.532;-0.798;#IP
-0.076;0.076;0.259;0.473;0.427;0.336;0.336;-0.076;#JNJ
-0.376;-0.353;-0.494;-0.259;-0.423;-0.329;-0.259;-0.541;#JPM
-0.057;-0.086;-0.029;0.086;0.114;0.057;0.257;-0.114;#KFT
0.059;-0.030;0.119;0.282;0.119;0.193;0.208;-0.119;#KO
-0.109;-0.182;0.206;0.352;0.279;0.473;0.521;0.194;#MCD
-0.043;-0.195;-0.151;0.216;0.270;0.227;0.411;0.206;#MMM
-0.036;-0.072;0.072;0.144;-0.072;-0.108;0.108;0.072;#MO
0.081;-0.081;0.027;0.081;-0.054;0.027;-0.027;-0.108;#MRK
0.083;0.083;0.041;0.331;0.083;0.248;0.166;0.041;#MSFT
0.049;0.000;0.243;0.680;0.194;0.243;0.340;0.097;#PFE
-0.045;0.060;0.104;0.015;-0.179;-0.149;-0.224;-0.224;#PG
0.097;-0.032;0.000;0.129;0.129;0.064;0.097;0.064;#T
-0.277;-0.440;-0.326;-0.358;-0.537;-0.619;-0.570;-0.733;#TRV
-0.081;-0.209;0.035;0.325;0.198;0.093;0.128;-0.035;#UTX
0.054;0.000;0.054;0.190;0.136;0.326;0.380;0.353;#VZ
-0.091;-0.091;-0.036;0.036;-0.072;0.000;0.145;-0.127;#WMT
-0.062;-0.211;0.087;0.198;0.186;0.050;0.347;0.508;#XOM

在启动som.mq5之后(colorscheme=3,cellsx=30,cellsy=30,imagexsize=200,imagexsize=200,datafilename=“dj.csv”),我们将得到8张图片,每个对应的时间间隔为30、60、90、120、150、180、210和240分钟。

2011年5月23日最后四个交易小时的市场增长率数据(美国股票)的Kohonen映射如图21所示。

clrRed

图21。Kohonen美国股票地图(2011年5月23日最后四个交易小时)。

从图21可以看出,C(花旗集团公司)、T(AT&T公司)、JPM(摩根大通公司)、BAC(美国银行)具有类似的动态。它们被分为长期的红色聚类。

在过去的1.5小时内(M30、M60、M90),动态趋势变为绿色,但总体而言(M240),库存仍处于红色区域。

利用Kohonen映射,我们可以可视化股票的相对动态,找出股票的领先和滞后及其环境。具有相似数据形式的元素形成集群。

如图21a所示,花旗集团股价下跌最快。一般来说,所有金融公司的股票都处于红色区域。

clrGreen

图21a.2011年5月23日市场热度图(来源:https://finviz.com)

同样,我们可以计算外汇市场的Kohonen映射(图22):

clrGreen

图22。Kohonen外汇市场地图(欧洲流程,2011年5月24日)

使用以下货币对:欧元兑美元、英镑兑美元、美元兑瑞士法郎、美元兑日元、美元兑加元、澳元兑美元、新西兰元兑美元、美元兑瑞典克朗、澳元兑美元、澳元兑瑞士法郎、澳元兑日元、瑞士法郎兑日元、欧元兑英镑、欧元兑美元、欧元兑瑞士法郎、欧元兑日元、欧元兑瑞士法郎、欧元兑美元、英镑兑瑞士法郎、英镑兑美元、瑞士法郎。

增长率被输出到外汇。使用FX的CSV。MQ5脚本。

M30;M60;M90;M120;M150;M180;M210;M240;Title
0.058;-0.145;0.045;-0.113;-0.038;-0.063;0.180;0.067;EURUSD
0.046;-0.100;0.078;0.094;0.167;0.048;0.123;0.160;GBPUSD
-0.048;0.109;-0.142;-0.097;-0.219;-0.143;-0.277;-0.236;USDCHF
0.042;0.097;0.043;-0.024;-0.009;-0.067;0.024;0.103;USDJPY
-0.045;0.162;0.155;0.239;0.217;0.246;0.157;0.227;USDCAD
0.095;-0.126;-0.018;-0.141;-0.113;-0.062;0.081;-0.005;AUDUSD
0.131;-0.028;0.167;0.096;-0.013;0.147;0.314;0.279;NZDUSD
-0.047;0.189;-0.016;0.107;0.084;0.076;-0.213;-0.133;USDSEK
-0.034;-0.067;-0.188;-0.227;-0.102;-0.225;-0.234;-0.291;AUDNZD
0.046;0.039;0.117;0.102;0.097;0.170;0.234;0.216;AUDCAD
0.057;-0.016;-0.158;-0.226;-0.328;-0.215;-0.180;-0.237;AUDCHF
0.134;-0.020;0.024;-0.139;-0.124;-0.127;0.107;0.098;AUDJPY
0.083;-0.009;0.184;0.084;0.208;0.082;0.311;0.340;CHFJPY
0.025;-0.036;-0.030;-0.200;-0.185;-0.072;0.058;-0.096;EURGBP
-0.036;-0.028;0.061;0.010;0.074;-0.006;0.088;0.070;EURAUD
0.008;-0.049;-0.098;-0.219;-0.259;-0.217;-0.094;-0.169;EURCHF
0.096;-0.043;0.085;-0.124;-0.049;-0.128;0.206;0.157;EURJPY
-0.073;-0.086;-0.119;-0.211;-0.016;-0.213;-0.128;-0.213;EURNZD
0.002;0.009;0.181;0.119;0.182;0.171;0.327;0.284;EURCAD
-0.008;0.004;-0.077;-0.015;-0.054;-0.127;-0.164;-0.080;GBPCHF
0.079;-0.005;0.115;0.079;0.148;-0.008;0.144;0.253;GBPJPY
0.013;-0.060;-0.294;-0.335;-0.432;-0.376;-0.356;-0.465;CADCHF

除了价格,我们还可以使用不同时间表的指标。

2.6。例6。优化结果分析

MetaTrader5客户的策略测试程序为您提供了研究参数空间结构并找出最佳策略参数集的机会。也可以通过从“最佳结果”选项卡的上下文菜单中选择“导出到XML”(MS Office Excel)选项来导出优化结果。

优化结果还包含测试程序统计信息(第41列):

  1. 结果
  2. 利润
  3. 毛利润
  4. 总损失
  5. 绘画
  6. 估计利润
  7. 利润系数
  8. 回收系数
  9. 夏普比率
  10. 预付款水平
  11. 习俗
  12. 最小余额
  13. 最大余额损失
  14. 最大余额损失(%)
  15. 余额损失的相对价值
  16. 余额损失相对值(%)
  17. 最低资产净值
  18. 最大净资产损失
  19. 最大净资产损失(%)
  20. 净资产损失的相对价值
  21. 净资产损失相对值(%)
  22. 交易时间
  23. 周转次数
  24. 短期交易数量
  25. 短期盈利交易数量
  26. 长期交易数量
  27. 可盈利的长期交易数量
  28. 盈利交易数量
  29. 丢失的事务数
  30. 最大利润贸易
  31. 最大损失交易
  32. 最大连续利润数
  33. 最大连续利润(美元)
  34. 最大持续收入
  35. 最大连续收入数
  36. 最大连续损失数
  37. 最大连续损失数(美元)
  38. 最大持续损失金额
  39. 最大连续损失数
  40. 连续利润平均数
  41. 平均连续损失数

利用测试程序的统计信息有助于分析参数空间。显然,大量的统计参数是密切相关的,并且取决于事务性能。

例如,最好的交易结果有最大利润、利润系数、回收系数和夏普比率参数值。这样,这些参数就可以用于结果分析。

移动平均.mq5 ea事务的优化结果

在本章中,我们将考虑分析移动平均值的优化结果。MQ5 EA事务,它包含在MetaTrader 5客户机标准组件中。EA交易基于价格和移动平均指数交叉。它有两个输入参数:移动周期和移动移位。所以我们有一个包含43列的XML文件。

我们不考虑43维的参数空间。我们最感兴趣的是:

  1. 收获利润;
  2. 利润系数;
  3. 回收系数;
  4. 夏比;
  5. 交易数量;
  6. 盈利交易的百分比;
  7. 移动周期;
  8. 迁移迁移;

请注意,我们添加了参数profittrades(%)(盈利交易的百分比,而不是结果),该参数表示盈利交易的百分比,将盈利交易的数量(28)除以交易的数量(22),再乘以100。

让我们准备一下最佳方案。csv文件,有九列,包含用于metatrader 5策略测试程序的400组输入参数。

Profit;Profit Factor;Recovery Factor;Sharpe Ratio;Trades;ProfitTrades(%);MovingPeriod;MovingShift;Title
-372.3;0.83;-0.51;-0.05;71;28.16901408;43;6;43
-345.79;0.84;-0.37;-0.05;66;27.27272727;50;6;50
...

因为我们将movingperiod的值用作标题列,所以它将用于在Kohonen地图上“标记”样本。

在政策测试程序中,我们通过以下参数优化了移动周期和移动移位的值:

  • 交易品种-欧元/美元,
  • 循环-H1,
  • 价格变化生成模型-“1分钟OHLC”
  • 试验间隔-2011.01.01-2011.05.24,
  • 优化-快速(遗传算法)
  • 优化-最大平衡

clrDarkGreen5

图23。移动平均EA事务优化结果的Kohonen映射(组件平面表示)

让我们看看上面一行的组件平面(利润、利润系数、回收系数和夏普比率)。

它们组合在图24中。

clrGreen

图24。利润构成面、利润系数、回收系数、利比参数

首先,我们需要找出优化结果的最佳领域。

如图24所示,具有最大值的区域位于左上角。数字对应于移动平均指数的平均周期(moving period参数,我们将其用作标题)。对于所有组件平面,数字的位置都相同。每个组件平面都有自己的值范围,这些值列在渐变面板中。

由于优化结果具有较大的利润、利润系数、回收系数和夏普比率值,因此我们在地图上得到了各个区域的相关信息(如图24所示)。

图25显示了交易数量、盈利交易百分比、移动周期和移动偏移量的组成平面。

clrGreen

图25。交易号、盈利交易号百分比、移动周期和移动偏移参数的组件平面

构件平面分析

乍一看,似乎没有什么有趣的信息。前四个组成部分(盈利能力、盈利能力、回收系数和夏普比率)看起来很相似,因为它们直接取决于交易系统的性能。

如图24所示,左上角区域非常有趣(例如,如果我们将移动周期设置为45到50,我们可能会获得最佳结果)。

EA交易根据欧元兑美元的一小时时间表进行测试,其策略取决于趋势;我们可以将这些值视为“市场趋势”内存内容。如果这是真的,2011年上半年将相当于两天的市场趋势记忆。

让我们看看其他组件平面。

clrGreen

图26。事务号移动循环组件平面

从图26中,我们可以看到移动周期(蓝色区域)的较小值扩展到事务数的较大值(黄色-红色区域)。如果移动平均周期很短,则会有多个交叉点(事务数)。

我们也可以在交易数量的组成平面上看到这一点(数字小于20的绿色区域)。

clrGreen

图27。事务数-移动偏移组件平面

如果移动偏移量增加(黄色-红色区域),则事务数减少(蓝色区域)。将移动偏移分量平面与图24进行比较,我们可以发现移动偏移参数对该交易策略的性能不是很重要。

利润率(%)作为盈利交易的百分比,并不直接取决于移动周期或迁移,而是取决于交易系统的总体特征。换句话说,分析它与输入参数的相关性是没有意义的。

类似的方法可以用来分析更复杂的交易策略。您需要识别交易系统的最重要参数,并将其用作标题。

总结

自组织特征映射的主要优点是有机会生成高维数据的二维离散表示。具有相似特征的数据形成聚类,简化了相关分析。

详细信息和其他应用可以在guido deboeck和teuvo kohonen的书《金融中的视觉探索:自组织地图》中找到。

附录

俄罗斯版出版后,亚历克斯·谢尔盖夫提出了一个改进的课程(som-alex-sergeev-en.zip)。

更改列表:

1。图像显示已更改:cintbmp::show(int ax,int ay,string abmpfilename,string aObjectname,bool afromImages=true)
2。已添加打开包含图像的文件夹的功能:

#import "shell32.dll"
   int ShellExecuteW(int hwnd, string oper, string prog, string param, string dir, int show);
#import

input bool OpenAfterAnaliz=true; // open folder with maps after finish

CSOM类的变化:

  1. 添加方法csom::hidechart-hidden chart。
  2. 类成员m_chart、m_wnd、m_x0、m_y0(图形、窗口和显示图片的坐标)已添加。
    还添加了m_-sid-对象名前缀。默认情况下,前缀使用文件名和“som”前缀。
  3. 所有地图都保存在名称中带有m_-sid的文件夹中。
  4. BMP文件以示例的列名命名。
  5. 修改了csom::showbmp方法(地图保存在/files文件夹中,而不是/images中,因此运行速度更快)。
  6. csom::netdeinit更改为csom::hidebmp。
  7. 已修改csom::readcsvdata方法。第一列包含标题。
  8. 在csom::train(bool bshow progress)中,添加一个标志以显示中间映射。
  9. 在csom::train中,中间映射(而不是迭代)每2秒显示一次,进度通过注释显示在图表中。
  10. 优化了一些变量的名称和按类别排列的类方法。

BMP文件的绘制过程非常缓慢。如果不是真的需要,不要每次都画。

压缩文件包含具有优化结果的SOM图像示例。

本文由MetaQuotes Software Corp.翻译自俄语原文
,网址为https://www.mql5.com/ru/articles/283。

附加文件下载zip som_alex-sergeev_en.zip(1162.74 kb)kohonen_maps_mql5_en.zip(58.56 kb)

 

 


MyFxtop迈投(www.myfxtop.com)-靠谱的外汇跟单社区,免费跟随高手做交易!

 

免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经(www.myfxtop.cn)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。

風險提示

MyFxtops邁投所列信息僅供參考,不構成投資建議,也不代表任何形式的推薦或者誘導行為。MyFxtops邁投非外匯經紀商,不接觸妳的任何資金。 MYFXTOPS不保證客戶盈利,不承擔任何責任。從事外彙和差價合約等金融產品的槓桿交易具有高風險,損失有可能超過本金,請量力而行,入市前需充分了解潛在的風險。過去的交易成績並不代表以後的交易成績。依據各地區法律法規,MyFxtops邁投不向中國大陸、美國、加拿大、朝鮮居民提供服務。

邁投公眾號

聯繫我們

客服QQ:981617007
Email: service@myfxtop.com

MyFxtops 邁投