English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Utiliser des Cartes de Caractéristiques Auto-Organisatrices (Kohonen Maps) dans MetaTrader 5

Utiliser des Cartes de Caractéristiques Auto-Organisatrices (Kohonen Maps) dans MetaTrader 5

MetaTrader 5Experts | 12 janvier 2022, 14:43
214 0
MetaQuotes
MetaQuotes

Introduction

Une Self-Organizing Feature Map (SOM) est un type de réseau artificiel et neuronal qui est entrainé à l’aide d’un apprentissage par observation visant à produire une représentation bi-dimensionnelle discrétisée de l’espace d’entrée de l’échantillonnage de formation appelée une carte.

Ces cartes sont utiles pour la classification et la visualisation de vues de faible dimension de données de grande dimension, semblables à une mise à l'échelle multidimensionnelle. Le modèle a d'abord été décrit comme un réseau neuronal et artificiel par le professeur finlandais Teuvo Kohonen, et est parfois appelé carte de Kohonen.

Il existe plusieurs algorithmes disponibles,nous suivrons le code présenté auhttp://www.ai-junkie.com. Pour visualiser les données au terminal client de MetaTrader 5, nous utiliserons lecIntBMP - Une librairie de création d’images BMP. Dans cet article, nous examinerons plusieurs applications simples de Kohonen Maps.


1. Cartes de Caractéristiques Auto-Organisées

Les Cartes de Caractéristiques Auto-Organisatrice étaient décrites pour la première fois parTeuvo Kohonen en 1982 Contrairement à de nombreux réseaux neuronaux, il n'a pas besoin de correspondance un à un entre les données d'entrée et de sortie cible. Ce réseau neuronal est entraîné à l'aide d'un apprentissage non supervisé.

Le SOM peut être formellement décrit comme un mappage non linéaire, ordonné et lisse de données d'entrée de grande dimension sur les éléments d'un tableau régulier de faible dimension. Dans sa forme de base, il produit un graphique de similarité des données d'entrée.

Le SOM convertit les rapports statistiques non linéaires entre les données de grande dimension en une relation géométrique simple de leurs points d'image sur une grille de nœuds bidimensionnelle régulière. Les cartes SOM peuvent être utilisées pour la classification et la visualisation de données de grande dimension.


1.1. Architecture de Réseau

La carte simple de Kohonen sous forme de grille de 16 nœuds(4x4 chacun d'eux est connecté avec un vecteur d'entrée tridimensionnel) est présentée dans la Fig. 1.

Figure 1.Carte simple de Kohonen (16 nœuds)

Figure 1. Carte simple de Kohonen (16 nœuds)

Chaque nœud présente des coordonnées (x,y) dans le réseau et un vecteur de poids avec des composants, définis à base du vecteur d'entrée.


1.2. Apprentissage de l’Algorithme

Contrairement à de nombreux autres types de réseaux neuronaux, le SOM n'a pas besoin d’indiquer une sortie cible. Au lieu de cela, lorsque les poids des nœuds correspondent au vecteur d'entrée, cette zone du réseau est sélectivement optimisée pour ressembler plus étroitement aux données de la classe dont le vecteur d'entrée est membre.

A partir d'une distribution initiale de poids aléatoires, et sur de nombreuses itérations, le SOM s'installe dans une carte de zones stables. Chaque zone est en fait un classificateur d'entités, vous pouvez donc considérer la sortie graphique comme un type de carte d'entités de l'espace d'entrée.

La formation se déroule en plusieurs étapes et en plusieurs itérations :

  1. Les poids de chaque nœud sont initialisés avec des valeurs aléatoires.
  2. Un vecteur est choisi au hasard depuis l'ensemble des données d'apprentissage.
  3. Chaque nœud est examiné pour calculer quels poids ressemblent le plus au vecteur d'entrée. Le nœud gagnant est communément appelé Best Matching Unit (BMU).
  4. Le rayon du voisinage de la BMU est calculé. Initialement, cette valeur est définie sur le rayon du réseau, mais sans gradation à chaque saut de temps.
  5. Pour tous les nœuds trouvés à l'intérieur du rayon de BMU, les poids du nœud sont ajustés pour les rendre plus semblables au vecteur d'entrée. Plus un nœud est proche de la BMU, plus ses poids sont alertés.
  6. Répétez l'étape 2 pour les itérations N.

Les détails sont disponibleshttp://www.ai-junkie.com.


2. Études de cas


2.1. Exemple 1: "Bonjour le monde!" dans SOM

L'exemple classique de la carte de Kohonen est un problème de regroupement de couleurs.

Admettons que nous avons un ensemble de 8 couleurs dont chacune est représentée comme un vecteur tri-dimentionnel dansle modèle couleur RGB.

  1. clrRedRouge : (255,0,0);
  2. clrGreen Vert : (0,128,0);
  3. clrBlueBleu : (0,0,255);
  4. clrDarkGreenVert foncé : (0,100,0);
  5. clrDarkBlueBleu foncé : (0,0,139);
  6. clrYellowJaune : (255,255,0);
  7. clrOrange Orange: (255,165,0);
  8. clrPurpleViolet : (128,0,128).

Quand nous travaillons avec les cartes Kohonen enlangage MQL5,nous suivrons le paradigmeorienté-objet.

Nous avons besoin de deux classes : Classe CSOMNode pour un nœud de la grille régulière et CSOM qui est une classe de réseau de neurones.

//+------------------------------------------------------------------+
//| 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);
  };

L'implémentation des méthodes de classe peut être trouvée dans som_ex1.mq5. Le code présente plusieurs commentaires, nous allons nous concentrer sur l'idée.

La description de la classe CSOM se présente comme suit :

//+------------------------------------------------------------------+
//| 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();
  };

L'utilisation de la classe CSOM est simple :

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);
//---
  }

Le résultat est présenté en Fig 2.

Figure 2. La sortie de SOM_ex1.mq5 Expert Advisor

Figure 2. La sortie de SOM_ex1.mq5 Expert Advisor

La dynamique de l'apprentissage de la carte de Kohonen est présentée sur la figure 3 (voir les étapes sous l'image) :

Figure 3. La dynamique de l’apprentissage de la carte de Kohonen

Figure 3. La dynamique de l'apprentissage de Kohonen Map

Nous pouvons constater sur la Fig. 3, la carte de Kohonen est formée après 2400 pas.

Si nous créons le réseau de 300 nœuds et indiquons la taille de l'image comme 400x400 :

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

nous obtiendrons l'image, présentée en figure 4 :

Figure 4.La carte Kohonen avec 300 nœuds, taille de l’image 400x400

Figure 4. La carte de Kohonen avec 300 nœuds, taille d'image 400x400

Si vous lisez le livre Visual Explorations in Finance: with Self-Organizing Mapsécrit par,Guido Deboeck et Teuvo Kohonen, vous vous rappelez que les nœuds du réseau peuvent être représentés en tant que cellules hexagonales. En modifiant le code de l'Expert Advisor, nous pouvons implémenter une autre visualisation.

Le résultat de SOM-ex1-hex.mq5 est présenté en Fig. 5:

Figure 5.La carte Kohonen avec 300 nœuds, taille de l’image 400x400, les nœuds sont représentés au niveau des cellules hexagonales

Figure 5. La carte de Kohonen avec 300 nœuds, taille d'image 400x400, les nœuds sont représentés dans des cellules hexagonales

Dans cette version, nous pouvons définir l'affichage des limites des cellules en utilisant les paramètres d'entrée :

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

Dans certains cas, nous n'avons pas besoin d'afficher les limites des cellules, si vous indiquez ShowBorders=false, vous obtiendrez l'image suivante (voir Fig. 6):

Fig. 6. La carte Kohonen avec 300 nœuds, taille de l’image 400x400, nœuds tracés en tant que cellules hexagonales, les limites des cellules déactivées

Fig. 6. Carte de Kohonen avec 300 nœuds, image 400x400, nœuds tracés sous forme de cellules hexagonales, limites de cellule désactivées

Dans le premier exemple, nous avons utilisé 8 couleurs dans l'ensemble d'apprentissage avec les composants de couleur spécifiés. Nous pouvons étendre l'ensemble d'apprentissage et simplifier la spécification des composants de couleur en ajoutant deux méthodes à la classe CSOM.

Notez que dans ce cas, les Kohonen Maps sont simples car il n'y a que peu de couleurs, séparées dans l'espace colorimétrique. En conséquence, nous avons les groupes localisés.

Le problème apparaît si l'on considère plus de couleurs avec des composants de couleur plus proches.


2.2. Exemple 2: Utilisation de Web-colors comme exemples d'apprentissage

En langage MQL5 Web-couleurs sont prédéfinies par les constantes.

Figure 7. Web-couleurs

Figure 7. Couleurs Web

Et si on appliquait l'algorithme de Kohonen à un ensemble de vecteurs avec des composants similaires ?

Nous pouvons créer une classe CSOMWeb, dérivée de la classe CSOM :

//+------------------------------------------------------------------+
//| 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);
  };

Comme vous le constatez, pour simplifier le travail avec les couleurs, nous avons ajouté deux nouvelles méthodes, la spécification explicite des composants de couleur n'est plus nécessaire maintenant.

L'implémentation des méthodes de classe se présente comme suit :

//+------------------------------------------------------------------+
//| 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);
  }

Toutes les couleurs Web peuvent être combinées dans le tableau 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
  };

La fonction OnInit() présente une forme simple :

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);
  }

Si nous lançons le som-ex2-hex.mq5, nous obtiendrons l'image, présentée dans la Fig 8.

Figure 8.Carte Kohonen pour couleurs-web

Figure 8. Carte Kohonen pour Web-couleurs

Comme vous le constatez, il existe des groupes, mais certaines couleurs (comme xxxBlue) sont situées dans différentes zones.

La raison de ce fait est la structure de l'ensemble d'apprentissage, il existe de nombreux vecteurs avec des composants proches.


2.3. Exemple 3: Groupement de produits

En suite nous examinerons un simple échantillon qui tentera d’assembler vingt-cinq aliments dans des zones similaires à base de trois paramètres qui sontprotéine, glucides etlipides

 Nourriture
Protéine Glucides Lipides
  1 Pommes
0.4
11.8
0.1
  2 Avocat
1.9
1.9
19.5
  3 Bananes
1.2
23.2
0.3
  4 Steak de bœuf
20.9
0
7.9
  5 Big Mac
13
19
11
  6 Noix du Brésil
15.5
2.9
68.3
  7 Pain
10.5
37
3.2
  8 Beurre
1
0
81
  9 Fromage
25
0.1
34.4
 10 Gâteau au fromage
6.4
28.2
22.7
 11 Biscuits
5.7
58.7
29.3
 12 Flocons de maïs
7
84
0.9
 13 Œufs
12.5
0
10.8
 14 Poulet frit
17
7
20
 15 frites
3
36
13
 16 Chocolat chaud
3.8
19.4
10.2
 17 Pepperoni
20.9
5.1
38.3
 18 Pizza
12.5
30
11
 19 Tarte Au Porc
10.1
27.3
24.2
 20 Pommes de terre
1.7
16.1
0.3
 21 Riz
6.9
74
2.8
 22 Poulet rôti
26.1
0.3
5.8
 23 Sucre
0
95.1
0
 24 Steak de thon
25.6
0
0.5
 25 L'eau
0
0
0

Tableau 1 Protéines, glucides et lipides pour 25 aliments.

Ce problème est intéressant, car les vecteurs d'entrée ont des valeurs différentes et chaque composant a sa propre plage de valeurs. C'est important pour la visualisation, car nous utilisons le modèle de couleur RGB avec des composants variant de 0 à 255.

Fort heureusement que dans ce cas, les vecteurs d’entrée sont également tri-dimensionnels et nous pouvons utiliser le modèle de couleur RGB destiné à la visualisation de la carte de 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);
  };

Comme vous le constatez, nous avons ajouté des tableaux m_max_values[] et m_min_values[] pour le stockage des valeurs maximales et minimales de l'ensemble d'entraînement. Pour la visualisation dans un modèle de couleur RGB, la "mise à l'échelle" est nécessaire, nous avons donc surchargé les méthodes Train(), Render() et ShowPattern().

La recherche des valeurs maximales et minimales est implémentée dans la méthode Train().

//--- 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]);
     }

Pour afficher les composants dans le modèle de couleur RVB, nous devons modifier la méthode 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])));

Le résultat de som_ex3.mq5 est présenté en Fig 9.

Figure 9. Carte alimentaire rassemblée en zones similaires à base de protéine, glucides et lipides

Figure 9. Carte des aliments, regroupée en zones de similitude, basée sur les protéines, les glucides et les lipides

Analyse des composants. Nous pouvons constater sur la carte que le sucre, le riz et les flocons de maïs sont tracés en vert à cause des glucides (2e composant). Le Beurre est en zone verte, il contient beaucoup de lipides (3ème composant). Beaucoup de protéines (1er composant, rouge) sont contenues dans le steak de bœuf, le poulet rôti et le steak de thon.

Vous pouvez étendre l'ensemble d'entraînement en ajoutant de nouveaux aliments à partir desFood Composition Tables (alternative table)

Comme vous le constatez, le problème est résolu pour les directions R,V,B "pures". Qu'en est-il des autres aliments avec plusieurs composants égaux (ou presque égaux) ? Plus loin, nous examinerons les plans de composants, c'est très utile, en particulier pour les cas où les vecteurs d'entrée ont une dimension supérieure à 3.


2.4. Exemple 4. Cas à 4 dimensions. Ensemble de données sur l'iris de Fisher. CMYK

Pour les vecteurs tridimensionnels, il n'y a pas de problème de visualisation. Les résultats sont clairs grâce au modèle de couleur RGB, utilisé pour visualiser les composants de couleur.

Lorsque nous travaillons avec des données de grande dimension, nous devons trouver le moyen de les visualiser. La solution simple consiste à tracer une carte de dégradé (par exemple, Noir/Blanc), avec des couleurs proportionnelles à la longueur du vecteur. L'autre moyen consiste à utiliser un autre espace de couleurs. Dans cet exemple, nous examinerons le modèle de couleur CMYK pour définir les données de Fisher’s Iris. Il y a une meilleure solution, nous l’examinerons plus loin

L'ensemble de données sur les fleurs d'iris ou l'ensemble de données sur l'iris de Fisher est un ensemble de données multivariées présenté par R. Fisher (1936) comme exemple d'analyse discriminante. L’ensemble de données se compose de 50 échantillons de chaque espèce des fleurs iris (Iris setosa, Iris virginicaet Iris versicolor).

Quatre caractéristiques ont été mesurées à partir de chaque échantillon, il s'agit de la longueur et de la largeur du sépale et du pétale, en centimètres.

Figure 10. Fleur d’iris

Figure 10. Iris flower

Chaque échantillon dispose de 4 caractéristiques :

  1. Longueur du sépale ;
  2. Largeur des sépales ;
  3. Longueur des pétales ;
  4. Largeur des pétales.

L’ensemble de données de la fleur d’irispeut être trouvé dans SOM_ex4.mq5.

Dans cet exemple, nous utiliserons l'espace colorimétrique CMYK intermédiaire pour le traçage, c'est-à-dire que nous considérerons les poids du nœud comme des vecteurs dans l'espace CMYK. Pour visualiser les résultats, la conversion CMYK->RGB est utilisée. Une nouvelle méthode int CSOM::CMYK2Col(uchar c,uchar m,uchar y,uchar k) est ajoutée à la classe CSOM, elle est utilisée dans la méthode CSOM::Render(). Nous devons également modifier les classes pour prendre en charge les vecteurs à 4 dimensions.

Le résultat est présenté sur la Fig 11.

Figure 11. Carte de Kohonen de l’ensemble de données de la fleur d’iris tracè dans le modèle de couleur  CMYK

Figure 11. Carte de Kohonen pour l'ensemble de données de fleurs d'iris, tracée dans le modèle de couleur CMJN

Que voit-on ? Nous n’avons pas encore le groupage complet (à cause des caractéristiques du problème) mais nous pouvons voir laséparation linéaire d’iris setosa.

La raison de cette séparation linéaire desetosa est un grand composant «Magenta» 2eme dans l’espace CMYK


2.6. Analyse du Plan des Composants

Nous pouvons constater dans les exemples précédents (regroupement de données sur les aliments et l'iris) qu'il y a un problème avec la visualisation des données.

Par exemple, pour un problème alimentaire, nous avons analysé la carte Kohonen en s’appuyant sur les informations sur certaines couleurs (rouge, vert, bleu). En plus des groupes de base, il y avait des aliments avec plusieurs composants. De plus, l'analyse devenait difficile si les composants étaient pour la plupart égaux..

Les plans composants offrent la possibilité de voir l’intensité relative de chaque aliment.

Nous devons ajouter desCIntBMP instances de classe (m_bmp[]tableau) dans la classe CSOM et modifier les méthodes du rendu correspondantes. Nous avons également besoin d'une carte de dégradé pour visualiser l'intensité de chaque composant (les valeurs les plus basses affichées en bleu, les valeurs les plus élevées affichées en rouge):

Figure 12.Palette de gradient

Figure 12. Palette de dégradé

Nous avons ajouté le tableau Palette[768], les méthodes GetPalColor() et Blend(). Le dessin d'un nœud est placé dans la méthode RenderCell().

Ensemble de données sur les fleurs d'iris

Les résultats de som-ex4-cpr.mq5 sont présentés sur la Fig 13.

Figure 13.Représentation des plans de composant de l’ensemble de données de la fleur d’iris

Figure 13. Représentation des plans de composants de l'ensemble de données de la fleur d'iris

Dans ce cas, nous utilisons la grille avec 30x30 nœuds, taille de l'image 300x300.

Les plans composants jouent un rôle important dans la détection de corrélation : en comparant ces plans même partiellement et corrélant des variables éventuellement détectées par inspection visuelle. C'est plus facile si les plans du composant sont réorganisés pour que les corrélés soient proches les uns des autres. De cette façon, il est facile de sélectionner des combinaisons de composants intéressantes pour un complément d’enquête.

Examinons les plans de composants (Fig. 14). 

Les valeurs des composants maximaux et minimaux sont indiquées dans le tableau des gradients.

Figure 14.Ensemble de données de la fleur d’iris.Plans de composant

Figure 14. Ensemble de données sur les fleurs d'iris. Plans de composants

Tous ces plans composants, représentés dans le modèle de couleur CMJN, sont illustrés en Fig. 15.

Figure 15.Ensemble de données de la fleur d’iris. Carte de Kohonen dans le modèle de couleur CMYK

Figure 15. Ensemble de données sur les fleurs d'iris. Carte Kohonen dans le modèle de couleur CMYK

Rappelons-nous du type d’irissetosa En utilisant l'analyse du plan de composant (Fig. 14), nous pouvons constater qu'il a des valeurs minimales dans les 1er (longueur de sépale), 3e (longueur de pétale) et 4e (largeur de pétale).

Il est remarquable qu'il a des valeurs maximales dans le 2ème plan de composant (Sepal Width), le même résultat que nous avons obtenu dans le modèle de couleur CMYK (composant Magenta, Fig. 15).

Regroupement alimentaire

Examinons maintenant le problème de regroupement des aliments en utilisant l'analyse du plan des composants (som-ex3-cpr.mq5).

Le résultat est présenté en Fig. 16 (30x30 nœuds, taille de l'image 300x300, cellules hexagonales sans limites).

Figure 16. Carte alimentaire de Kohonen, représentation du plan du composant

Figure 16. Carte de Kohonen pour la nourriture, représentation du plan des composants

Nous avons ajouté l'option d'affichage des titres dans la méthode ShowPattern() de la classe CSOM (paramètre d'entrée ShowTitles=true).

Les plans de composants (protéines, glucides, lipides) se présentent comme suit :

Figure 17. Carte d’aliments Kohonen. Plans de composant et modèle de couleur RGB

Figure 17. Carte de Kohonen pour les aliments. Plans de composants et modèle de couleur RVB

La représentation du plan des composants, illustrée en Fig 17, ouvre une nouvelle vue sur la structure des composants alimentaires. De plus, elle fournit des informations supplémentaires, qui ne peuvent pas être vues dans le modèle de couleur RGB, présenté en Fig. 9.

Par exemple, nous voyons maintenant le Fromage dans le 1er plan composant (protéine). Dans le modèle de couleur RGB, il est affiché en couleur, proche du magenta, à cause des lipides (2e composant).


2.5. Implémentation des plans composants pour le cas de la dimension arbitraire

Les exemples que nous avons examinés présentent des caractéristiques spécifiques, la dimension a été fixée et l'algorithme de visualisation était différent pour différentes représentations (modèles de couleurs RGB et CMYK).

Nous pouvons maintenant généraliser l'algorithme pour des dimensions arbitraires, mais dans ce cas, nous ne visualiserons que les plans des composants. Le programme doit être en mesure de charger les données arbitraires à partir du fichier CSV.

Par exemple, le fichier food.csv se présente comme suit :

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

La première ligne du fichier comporte les noms (titres) du vecteur de données d'entrée. Les titres sont nécessaires pour distinguer les plans composants, nous imprimerons leurs noms dans le panneau de dégradé.

Le nom du motif se trouve dans la dernière colonne, dans notre cas c'est le nom de l'aliment.

Le code de SOM.mq5 (fonction OnInit) est simplifié :

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);
  }

Le nom du fichier avec les modèles d'apprentissage est indiqué dans le paramètre d'entrée DataFileName, dans notre cas "food.csv".

Le résultat est illustré en Fig 18.

Figure 18.Carte alimentaire de Kohonen en schéma dégradé de couleur noir/blanc

Figure 18. Carte de Kohonen de la nourriture en dégradé du schéma de couleurs noir/blanc

Nous avons également ajouté le paramètre d'entrée ColorScheme pour la sélection du schéma de dégradé.

À l'heure actuelle, il existe 4 schémas de couleurs disponibles (ColorScheme=0,1,2,4=Noir-Blanc,Bleu foncé-Bleu-Vert-Jaune-Rouge,Rouge-Noir-Vert,Rouge-Blanc-Vert).


Vous pouvez facilement ajouter votre propre schéma en ajoutant le dégradé dans la méthode CSOM::InitParameters().

Le schéma de couleurs peut être sélectionné à partir des paramètres d'entrée d'Expert Advisor :


De même, nous pouvons préparer l'ensemble de données sur les fleurs d'iris (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

Le résultat est illustré en Fig 19.

Figure 19.  Ensemble de données de la fleur d’iris. Plans de composant en schéma de couleur Rouge-Noir-Vert (ColorScheme=2, iris-fisher.csv)

Figure 19. Ensemble de données sur les fleurs d'iris. Plans de composants dans le schéma de couleurs Rouge-Noir-Vert (ColorScheme=2, iris-fisher.csv)

Nous avons maintenant un outil pour les applications réelles.


2.6. Exemple 5: Cartes thermiques du marché

Les Cartes de Caractéristiques Auto-Organisatrices peuvent être utilisées pour les cartes de mouvement du marché. Des fois la vue d’ensemble du marché est nécessaire,la carte thermique du marchées très utile. Les valeurs sont regroupées en fonction des secteurs économiques.

La couleur actuelle du stock dépend du taux de croissance actuel (en %) :

Figure 20.Carte thermique du marché pour les actions S&P500

Figure 20. Carte thermique du marché pour les actions du S&P500

Le marché hebdomadaire de la carte thermique des actions depuis S&P (http://finviz.com) est illustré en Fig. 20. La couleur dépend du taux de croissance (en %) :

La taille du rectangle boursier dépend de la capitalisation boursière. La même analyse peut être effectuée dans le terminal client MetaTrader 5 en utilisant les cartes Kohonen.

L'idée est d'utiliser les taux de croissance (en %) sur plusieurs cadres temporels. Nous avons l'outil pour travailler avec les cartes Kohonen, donc le seul nécessaire est le script, qui enregistre les données dans un fichier .csv.

Les données de prix sur les prix CFD des valeurs boursières américaines (#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 et #XOM) peuvent être trouvés sur le serveur de démonstration MetaQuotes.

Le script, qui prépare le fichier dj.csv est très simple :

//+------------------------------------------------------------------+
//|                                                           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);

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

Les données de l’historique doivent être téléchargées, vous pouvez automatiquement le faire en utilisant le scriptDownloadHistory.

À la suite du script dj.mq5, nous obtiendrons le dj.csv avec les données suivantes :

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

Après avoir lancé le som.mq5(ColorScheme=3, CellsX=30,CellsY=30, ImageXSize=200, ImageXSize=200, DataFileName="dj.csv"), nous obtiendrons 8 images, chacune d'elles correspond aux intervalles de temps de 30, 60, 90, 120, 150, 180, 210 et 240 minutes.

Les cartes Kohonen des données de taux de croissance du marché (valeurs boursières américaines) des 4 dernières heures de la séance de bourse du 23 mai 2011 sont présentées en Fig 21.

Figure 21. Les cartes Kohonen des actions boursières américaines (dernières 4 heures du 23 mai 2011 de la session du trade).

Figure 21. Cartes de Kohonen pour les valeurs boursières américaines (dernières 4 heures de la session de trade du 23 mai 2011).

Nous pouvons constater sur la Fig 21, la dynamique de #C (Citigroup Inc.), #T (AT&T Inc.), #JPM (JPMorgan Chase & Co), #BAC (Bank of America) est similaire. Ils se sont regroupés dans un cluster rouge à long terme.

Au cours de la dernière heure et demi (M30, M60, M90) sa dynamique est devenue verte, mais généralement (M240) les indices boursiers étaient dans la zone rouge.

À l'aide des cartes de Kohonen, nous pouvons visualiser la dynamique relative des indices boursiers, trouver des leaders et des perdants et leur environnement. Les éléments avec des données similaires forment des groupes.

Comme nous le constatons en figure 21a, le prix des actions de Citigroup Inc était le leader de la baisse. Généralement, toutes les actions des sociétés de financières étaient en zone rouge.

Figure 21a.Carte thermique du marché du 23 mai 2011 (source: http://finviz.com)

Figure 21a. Carte thermique du marché du 23 mai 2011 (sourcehttp://finviz.com)

De même, on peut calculer les cartes Kohonen du marché FOREX (Fig. 22) :

Figure 22. Carte Kohonen pour le marché FOREX (24 mai 2011, session européenne)

Figure 22. Carte de Kohonen pour le marché FOREX (24 mai 2011, session européenne)

Les paires suivantes sont utilisées : EURUSD, GBPUSD, USDCHF, USDJPY, USDCAD, AUDUSD, NZDUSD, USDSEK, AUDNZD, AUDCAD, AUDCHF, AUDJPY, CHFJPY, EURGBP, EURAUD, EURCHF, EURJPY, EURNZD, EURCAD, GBPCHF, GBPJPY, CADCHF. 

Les taux de croissance sont exportés vers fx.csv à l'aide du script fx.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

En plus des prix, vous pouvez utiliser les valeurs des indicateurs à différentes périodes.


2.6. Exemple 6: Analyse des Résultats d'Optimisation

Le Strategy Tester du terminal client MetaTrader 5 offre la possibilité d'explorer la structure de l'espace des paramètres et de trouver le meilleur ensemble de paramètres de stratégie. Vous pouvez également exporter les résultats d'optimisation à l'aide de l'option "Exporter vers XML (MS Office Excel)" dans le menu contextuel de l'onglet "Résultats d'optimisation".

Les statistiques du testeur sont comprises dans les résultats de l’optimisation (41 colonnes):

  1. Résultat
  2. Bénéfice
  3. Bénéfice brut
  4. Perte brute
  5. Retrait
  6. Gain attendu
  7. Facteur de bénéfice
  8. Facteur de reprise
  9. Rapport de Sharpe
  10. Niveau de marge
  11. Personnalisé
  12. Solde minimal
  13. Solde DD maximal
  14. Solde DD Maximum (%)
  15. Solde Relatif DD
  16. Solde relatif DD (%)
  17. Capitaux propres minimaux
  18. Capitaux propres DD Maximum
  19. Capitaux propres DD Maximum (%)
  20. Capitaux propres relatifs DD
  21. Capitaux propres relatifs DD (%)
  22. Trades
  23. Deals
  24. Courts trades
  25. Bénéfices de courts trades
  26. Longs trades
  27. Bénéfice de longs trades
  28. Bénéfice trades
  29. Perte trades
  30. Trade à bénéfice maximal
  31. Trade à perte maximale
  32. Max de gains consécutifs
  33. Max de gains consécutifs ($)
  34. Bénéfice consécutif maximum
  35. Nombre maximal de bénéfices consécutifs    
  36. Pertes consécutives maximales
  37. Pertes consécutives maximales
  38. Perte consécutive maximale
  39. Nombre maximal de pertes consécutives
  40. Moyenne des gains consécutifs.
  41. Pertes consécutives maximales

L'utilisation des statistiques du testeur permet d'aider à l'analyse de l'espace des paramètres. Il est remarquable que de nombreux paramètres de la statistique soient étroitement liés et dépendent des résultats des performances de trade.

Par exemple, les meilleurs résultats de trading affichent des valeurs les plus élevées des paramètres Profit, Profit Factor, Recovery Factor et Sharpe Ratio. Ce fait permet de les utiliser dans l'analyse des résultats.

Résultats d'optimisation de MovingAverage.mq5 Expert Advisor

Dans ce chapitre, nous examinerons l'analyse des résultats d'optimisation de MovingAverage.mq5 Expert Advisor, inclus dans le package standard du terminal client MetaTrader 5. Cet Expert Advisor est basé sur le croisement du prix et de l'indicateur de moyenne mobile. Il a deux paramètres d'entrée : MovingPeriod et MovingShift, c'est-à-dire que nous aurons comme résultat le fichier XML avec 43 colonnes.

Nous ne considérerons pas l'espace des paramètres à 43 dimensions, les plus intéressants sont :

  1. Bénéfice
  2. Facteur de bénéfice
  3. Facteur de Reprise
  4. Rapport de Sharpe
  5. Trades
  6. ProfitTrades(%);
  7. MovingPeriod=12
  8. MovingShift;

Notez que nous avons ajouté le paramètre ProfitTrades (%) (il est absent dans les résultats), cela indique le pourcentage des deals rentables et calculé comme résultat de la division de ProfitTrades (28) par Trades (22), multiplié par 100..

Préparons le fichier optim.csv avec 9 colonnes pour 400 ensembles de paramètres d'entrée de MetaTrader 5 Strategy Tester.

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
...

Notez que nous avons utilisé la valeur de MovingPeriod comme colonne de titre, elle sera utilisée pour "marquer" les motifs sur les cartes de Kohonen.

Dans Strategy Tester, nous avons optimisé les valeurs de MovingPeriod et MovingShift avec les paramètres suivants :

  • Symbole=EURUSD
  • Period_H1
  • Mode génération de ticks - "1 Minute OHLC",
  • Intervalle de test - 2011.01.01-2011.05.24,
  • Optimisation - Rapide (algorithme génétique),
  • Optimisation - Solde maximal

Figure 23.Carte Kohonen pour l’optimisation des résultats de MovingAverage EA(représentation du plan du composant)

Figure 23. Carte de Kohonen pour les résultats d'optimisation de MovingAverage EA (représentation du plan des composants)

Examinons les plans composants de la rangée supérieure (Profit, Profit Factor, Recovery Factor и Sharpe Ratio).

Ils sont combinés dans la Fig. 24.

Figure 24. Plans de composant des paramètres Bénéfice, Facteur du Bénéfice, Facteur de Reprise et Rapport Sharp

Figure 24. Plans de composants pour les paramètres Profit, Profit Factor, Recovery Factor et Sharpe Ratio

Le premier dont nous avions besoin est de trouver les zones avec les meilleurs résultats d'optimisation.

Nous pouvons constater sur la figure 24, les zones avec des valeurs maximales se trouvent dans le coin supérieur gauche. Les chiffres correspondent à la période de moyennage de l'indicateur de moyenne mobile (paramètre MovingPeriod, nous l'avons utilisé comme titre). L'emplacement des numéros est le même pour tous les plans de composants. Chaque plan composant dispose de sa propre plage de valeurs, les valeurs sont imprimées dans le panneau de dégradé.

Les meilleurs résultats d'optimisation ont les valeurs les plus élevées de Bénéfice, Facteur de Bénéfice, Facteur de Reprise et le Rapport Sharpe, nous avons donc des informations sur les zones sur la carte (décrites dans la Fig. 24).

Les plans des composants pour Trades, ProfitTrades (%), MovingPeriod et MovingShift sont présentés dans la figure 25.

Figure 25. Plans de  composant pour les paramètres de  Trades, ProfitTrades(%),MovingPeriod et MovingShift

Figure 25. Plans de composants pour les paramètres Trades, ProfitTrades (%), MovingPeriod et MovingShift

Analyse du plan des composants

À première vue, il n'y a pas d'informations intéressantes. Les 4 premiers plans composants (Profit, Profit Factor, Recovery Factor et Sharpe Ratio) semblent similaires, car ils dépendent directement des performances du système du trade.

Nous pouvons constater sur la Fig 24, la région supérieure gauche est très intéressante (par exemple, les meilleurs résultats peuvent être obtenus si nous réglons la MovingPeriod de 45 à 50).

L'Expert Advisor a été testé à la tranche horaire de l' EURUSD, sa stratégie basée sur la tendance, nous pouvons considérer ces valeurs comme une mémoire de "tendance du marché". Si c'est vrai, la mémoire de tendance du marché pour le premier semestre 2011 est égale à 2 jours.

Examinons d'autres plans de composants.

Figure 26. Plans de composant de Trades-MovingPeriod

Figure 26. Plans composants Trades-MovingPeriod

En regardant la figure 26,nous pouvons constater que des valeurs inférieures de MovingPeriod (zones bleues) entraînent des valeurs plus élevées de Trades (zones -rouge). Si la période de moyenne mobile est faible, il existe de nombreux croisements (trades).

Nous pouvons également constater ce fait sur le plan des composants des Trades (zones vertes avec des nombres inférieurs à 20).

Figure 27.Plans de composant de  Trades-MovingShift

Figure 27. Plans de composants Trades-MovingShift

Le nombre de trades diminue (zones bleues) avec l'augmentation de MovingShift (zones jaune-rouge). En comparant les plans des composants pour MovingShift et Fig.24, nous pouvons constater que le paramètre MovingShift n'est pas très important pour les performances de cette stratégie de trading.

Le pourcentage de trades rentables ProfitTrades (%) ne dépend pas directement de MovingPeriod ou MovingShift, c'est une caractéristique intégrale du système de trade Autrement dit, l'analyse de sa corrélation avec les paramètres d'entrée est insignifiante.

Des stratégies de trade plus complexes peuvent être analysées de la même manière. Vous devez trouver le ou les paramètres les plus importants de votre système de trade et l'utiliser comme titre.


Conclusion

Le principal avantage des Cartes de Caractéristiques Auto-Organisatrices est la possibilité de produire une représentation discrétisée en deux dimensions de données de grande dimension. Les données aux caractéristiques similaires forment des groupes, cela simplifie l'analyse de corrélation.

Les détails et autres applications peuvent être disponibles dans l’excellent livreVisual Explorations in Finance: with Self-Organizing Mapspar Guido Deboeck et Teuvo Kohonen.


Annexe

Après la publication de la version russe, Alex Sergeev a proposé une version améliorée de classes(SOM_Alex-Sergeev_en.zip).

Liste des modifications :

1. L'affichage des images a changé : cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)
2. Ajout de la caractéristique pour ouvrir un dossier avec des images :

#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

Modifications dansCSOM class:

  1. Méthode ajoutée CSOM::HideChart - Cache le graphique.
  2. Membres de classe ajoutés m_chart, m_wnd, m_x0, m_y0 - (graphique, fenêtre et coordonnées pour afficher les images).
    + ajout de m_sID - préfixe des noms d'objets. Le préfixe utilise le nom de fichier, par défaut le préfixe "SOM" est utilisé.
  3. Toutes les cartes sont sauvegardées au fichier portant le m_sID nom.
  4. Les fichiers bmp sont nommées par arecolonne de nom des motifs.
  5. Méthode modifiée CSOM::ShowBMP cartes sauvegardées dans le dossier \ fichiers au lieu d’\ images, ça marche plus rapidement.
  6. Le CSOM::NetDeinit s’est déplacé vers CSOM::HideBMP.
  7. Modification de la CSOM::ReadCSVData méthode la premièrecolonne comporte des titres.
  8. Ajout d’un indicateur pour afficher les cartes intermédiaires dans CSOM::Train(bool bShowProgress)
  9. L’affichage des cartes intermédiaires dansCSOM::Train est effectué chaque 2 secondes (au lieu d’une itération) l’avancement est affiché dans le graphique à l’aide deCommenire.
  10. Noms optimisés de certaines variables, méthodes de classe classées par catégorie.

Le dessin de bmp est un processus très lent. Si vous n'en avez pas vraiment besoin, ne le dessinez pas à chaque fois.

L'exemple d'images SOM avec des résultats d'optimisation est compris dans l'archive.

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/283

Fichiers joints |
Création de Critères Personnalisés d’Optimisation des Expert Advisors Création de Critères Personnalisés d’Optimisation des Expert Advisors
Le terminal client MetaTrader 5 offre un large éventail de possibilités d’optimisation des paramètres de l’Expert Advisor. En plus des critères d’optimisation compris dans le testeur de stratégie, les développeurs sont offerts une opportunité de créer leurs propres critères. Cela conduit à un nombre presque illimité de possibilités de test et d’optimisation des Expert Advisors. L’article décrit des méthodes pratiques d’établir de tels critères - à la fois complexes et simples.
Estimations Statistiques Estimations Statistiques
L'estimation des paramètres statistiques d'une séquence est très importante, car la plupart des modèles et méthodes mathématiques sont axés sur des hypothèses différentes. Par exemple, la normalité de la loi de distribution ou la valeur de dispersion, ou d'autres paramètres. Ainsi, lors de l'analyse et de la prévision de séries chronologiques, nous avons besoin d'un outil simple et pratique qui permette d'estimer rapidement et clairement les principaux paramètres statistiques. L'article décrit brièvement les paramètres statistiques les plus simples d'une séquence aléatoire et plusieurs méthodes de son analyse visuelle. Il propose l’implémentation de ces méthodes en MQL5 et les méthodes de visualisation du résultat des calculs à l'aide de l'application Gnuplot.
Assistant MQL5 pour les Nuls Assistant MQL5 pour les Nuls
Début 2011, nous avons publié la première version de l'assistant MQL5. Cette nouvelle application fournit un outil simple et pratique pour générer automatiquement des robots de trading. Tout utilisateur de MetaTrader 5 peut créer un Expert Advisor personnalisé sans même savoir comment programmer en MQL5.
Traçage, Débogage et Analyse Structurelle du Code Source Traçage, Débogage et Analyse Structurelle du Code Source
L'ensemble complexe des problèmes de création d'une structure d'un code exécuté et de son traçage peut être réglé sans difficultés majeures. Cette possibilité est apparue dans MetaTrader 5 en raison de la nouvelle fonctionnalité du langage MQL5 - la création automatique de variables dont les données sont de type complexe (structures et classes) et leur élimination au moment de quitter le périmètre local. L'article comporte la description de la méthodologie et de l'outil prêt à l'emploi.