MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma
Tanıtım
BirSelf-Organizing Feature Map (SOM), harita adı verilen eğitim örneklerinin girdi alanının iki boyutlu ayrıklaştırılmış bir temsilini üretmek için denetimsiz öğrenme kullanılarak eğitilen bir yapay nöral ağ türüdür.
Bu haritalar, çok boyutlu ölçeklemeye benzer şekilde, yüksek boyutlu verilerin düşük boyutlu görünümlerini sınıflandırmak ve görselleştirmek için kullanışlıdır. Model ilk olarak Finli profesör Teuvo Kohonen tarafından yapay bir sinir ağı olarak tanımlandı ve bazen Kohonen Haritası olarak da adlandırılmaktadır.
Mevcut birçok algoritma vardır, http://www.ai-junkie.com adresinde sunulan kodu takip edeceğiz. Verileri MetaTrader 5 istemci terminalinde görselleştirmek için, BMP görüntülerinin oluşturulması için bir kitaplık olan cIntBMP'yi kullanacağız. Bu yazıda Kohonen Haritalarının birkaç basit uygulamasını ele alacağız.
1. Kendi Kendini Düzenleyen Özellik Haritaları
Kendi Kendini Düzenleyen Özellik Haritaları ilk olarak 1982 yılında Teuvo Kohonen tarafından tanımlanmıştır. Birçok nöral ağın aksine, giriş ve hedef çıkış verileri arasında bire bir yazışmaya ihtiyaç duymaz. Bu nöral ağ, denetimsiz öğrenme kullanılarak eğitilir.
SOM biçimsel olarak, yüksek boyutlu girdi verilerinin düzenli, düşük boyutlu bir dizinin öğeleri üzerine doğrusal olmayan, düzenli, düzgün bir eşlemesi olarak tanımlanabilir. Temel biçiminde, girdi verilerinin bir benzerlik grafiğini üretir.
SOM, yüksek boyutlu veriler arasındaki doğrusal olmayan istatistiksel ilişkileri, düzenli iki boyutlu düğüm ızgarası üzerindeki görüntü noktalarının basit geometrik ilişkisine dönüştürür. SOM haritaları, yüksek boyutlu verilerin sınıflandırılması ve görselleştirilmesi için kullanılabilir.
1.1. Ağ Mimarisi
16 düğümden oluşan basit Kohonen haritası (her biri 3 boyutlu girdi vektörü ile bağlantılı 4x4) Şekil 1'de sunulmuştur.
Şekil 1. Basit Kohonen haritası (16 düğüm)
Her düğümün kafeste (x,y) koordinatları ve girdi vektörü temelinde tanımlanan bileşenlerle ağırlık vektörü vardır.
1.2. Algoritma Öğrenme
Diğer birçok sinir ağı türünden farklı olarak, SOM'nin belirtilmesi için bir hedef çıktıya ihtiyacı yoktur. Bunun yerine, düğüm ağırlıklarının giriş vektörüyle eşleştiği yerde, kafesin bu alanı, giriş vektörünün üyesi olduğu sınıf için verilere daha yakından benzemek için seçici olarak optimize edilir.
Rastgele ağırlıkların ilk dağılımından ve birçok yinelemeden sonra, SOM sonunda bir kararlı bölge haritasına yerleşir. Her bölge etkili bir şekilde bir özellik sınıflandırıcıdır, bu nedenle grafik çıktıyı, giriş alanının bir tür özellik haritası olarak düşünebilirsiniz.
Eğitim birkaç adımda ve birçok yinelemede gerçekleşir:
- Her düğümün ağırlıkları rastgele değerlerle başlatılır.
- Eğitim veri setinden rastgele bir vektör seçilir.
- Hangisinin ağırlıklarının girdi vektörüne en çok benzediğini hesaplamak için her düğüm incelenir. Kazanan düğüm, genellikle En İyi Eşleşen Birim (BMU) olarak bilinir.
- BMU'nun komşuluğunun yarıçapı hesaplanır. Başlangıçta, bu değer kafesin yarıçapına ayarlanır, fakat her adımda azalır.
- BMU'nun yarıçapı içinde bulunan herhangi bir düğüm için düğümün ağırlıkları, onları daha çok girdi vektörü gibi yapacak şekilde ayarlanır. Bir düğüm BMU'ya ne kadar yakınsa, ağırlıkları o kadar fazla uyarı alır.
- N yineleme için 2. adımı tekrarlayın.
Ayrıntılar http://www.ai-junkie.com adresinde bulunabilir.
2. Durum çalışmaları
2.1. Örnek 1. "Merhaba Dünya!" SOM'da
Kohonen haritasının klasik örneği bir renk kümeleme problemidir.
Diyelim ki 8 renkten oluşan bir setimiz var, her biri RGB renk modelinde üç boyutlu bir vektör olarak temsil ediliyor.
- Kırmızı: (255,0,0);
- Yeşil: (0,128,0);
- Mavi: (0,0,255);
- Koyu Yeşil: (0,100,0);
- Koyu Mavi: (0,0,139);
- Sarı: (255,255,0);
- Turuncu: (255,165,0);
- Mor: (128,0,128).
MQL5 dilinde Kohonen haritaları ile çalışırken nesne yönelimli paradigmayı takip edeceğiz.
İki sınıfa ihtiyacımız var: Normal ızgaranın bir düğümü için CSOMNode sınıfı ve bir nöral ağ sınıfı olan 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); };
Sınıf yöntemlerinin uygulanması som_ex1.mq5 içinde bulunabilir. Kodda çok fazla yorum var, fikre odaklanacağız.
CSOM sınıfı açıklaması aşağıdaki gibi görünür:
//+------------------------------------------------------------------+ //| 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 sınıfının kullanımı basittir:
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); //--- }
Sonuç, Şekil 2'de sunulmuştur.
Şekil 2. SOM_ex1.mq5 Uzman Danışman çıktısı
Kohonen harita öğreniminin dinamikleri Şekil 3'te sunulmuştur (resmin altındaki adımlara bakın):
Şekil 3. Kohonen Haritası öğreniminin dinamikleri
Şekil 3'ten görülebileceği gibi, Kohonen Haritası 2400 adımdan sonra oluşturulmuştur.
300 düğümlük bir kafes oluşturup görüntü boyutunu 400x400 olarak belirtirsek:
//--- lattice of 15x20 nodes, image size 400x400 KohonenMap.InitParameters(10000,15,20,400,400);
Şekil 4'te sunulan görüntüyü alacağız:
Şekil 4. 300 düğümlü Kohonen Haritası, görüntü boyutu 400x400
Guido Deboeck ve Teuvo Kohonen tarafından yazılan Visual Explorations in Finance: with Self-Organizing Maps kitabını okursanız hatırlarsınız. bu kafes düğümleri de altıgen hücreler olarak temsil edilebilir. Uzman Danışman kodunu değiştirerek başka bir görselleştirme uygulayabiliriz.
SOM-ex1-hex.mq5'in sonucu Şekil 5'te sunulmuştur:
Şekil 5. 300 düğümlü Kohonen Haritası, görüntü boyutu 400x400, düğümler altıgen hücrelerde temsil edilir
Bu versiyonda, giriş parametrelerini kullanarak hücre sınırlarının gösterilmesini tanımlayabiliriz:
// input parameter, used to show hexagonal cells input bool HexagonalCell=true; // input parameter, used to show borders input bool ShowBorders=true;
Bazı durumlarda hücre kenarlıklarını göstermemize gerek yoktur, ShowBorders=false belirtirseniz aşağıdaki görüntüyü alırsınız (bkz. Şekil 6):
Şekil 6. 300 düğümlü Kohonen Haritası, görüntü 400x400, altıgen hücreler olarak çizilen düğümler, hücre sınırları devre dışı
İlk örnekte renk bileşenleri belirtilen eğitim setinde 8 renk kullandık. CSOM sınıfına iki metot ekleyerek eğitim setini genişletebilir ve renk bileşenlerinin belirlenmesini basitleştirebiliriz.
Bu durumda Kohonen Haritalarının basit olduğunu unutmayın çünkü renk uzayında ayrılmış sadece birkaç renk vardır. Sonuç olarak, yerelleştirilmiş kümelere sahip olduk.
Daha yakın renk bileşenleriyle daha fazla renk düşünürsek sorun ortaya çıkar.
2.2. Örnek 2. Web renklerini eğitim örnekleri olarak kullanma
MQL5 Dilinde Web renkleri önceden tanımlanmış sabitlerdir.
Şekil 7. Web Renkleri
Benzer bileşenlere sahip bir dizi vektöre Kohonen algoritmasını uygularsak ne olur?
CSOM sınıfından türetilen bir CSOMWeb sınıfı oluşturabiliriz:
//+------------------------------------------------------------------+ //| 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); };
Gördüğünüz gibi, renklerle çalışmayı basitleştirmek için iki yeni yöntem ekledik, artık renk bileşenlerinin açıkça belirtilmesine gerek yok.
Sınıf yöntemlerinin uygulanması aşağıdaki gibidir:
//+------------------------------------------------------------------+ //| 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); }
Tüm web renkleri web_colors[] dizisinde birleştirilebilir:
//--- 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() işlevi basit bir forma sahiptir:
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'i başlatırsak, Şekil 8'de gösterilen resmi elde ederiz.
Şekil 8. Web renkleri için Kohonen Haritası
Gördüğünüz gibi bazı kümeler var ama bazı renkler (xxxBlue gibi) farklı bölgelerde yer alıyor.
Bunun nedeni eğitim kümesinin yapısıdır, yakın bileşenlere sahip birçok vektör vardır.
2.3. Örnek 3. Ürün kümeleme
Daha sonra, protein, karbonhidrat ve yağ olmak üzere üç parametreye dayalı olarak yirmi beş gıdayı benzerlik bölgelerine göre gruplandırmaya çalışarak basit bir örneği ele alacağız.
Gıda | Protein | Karbonhidrat | Yağ | |
---|---|---|---|---|
1 | Elma | 0,4 | 11,8 | 0,1 |
2 | Avokado | 1,9 | 1,9 | 19,5 |
3 | Muz | 1,2 | 23,2 | 0,3 |
4 | Sığır biftek | 20,9 | 0 | 7,9 |
5 | Big Mac | 13 | 19 | 11 |
6 | Brezilya fındığı | 15,5 | 2,9 | 68,3 |
7 | Ekmek | 10,5 | 37 | 3,2 |
8 | Tereyağı | 1 | 0 | 81 |
9 | Peynir | 25 | 0,1 | 34,4 |
10 | Cheesecake | 6,4 | 28,2 | 22,7 |
11 | Kurabiye | 5,7 | 58,7 | 29,3 |
12 | Mısır gevreği | 7 | 84 | 0,9 |
13 | Yumurta | 12,5 | 0 | 10,8 |
14 | Kızarmış Tavuk | 17 | 7 | 20 |
15 | Kızartma | 3 | 36 | 13 |
16 | Sıcak Çikolata | 3,8 | 19,4 | 10,2 |
17 | Sucuk | 20,9 | 5,1 | 38,3 |
18 | Pizza | 12,5 | 30 | 11 |
19 | Domuzlu turta | 10,1 | 27,3 | 24,2 |
20 | Patates | 1,7 | 16,1 | 0,3 |
21 | Pirinç | 6,9 | 74 | 2,8 |
22 | Fırında Tavuk | 26,1 | 0,3 | 5,8 |
23 | Şeker | 0 | 95,1 | 0 |
24 | Ton Balığı Bifteği | 25,6 | 0 | 0,5 |
25 | Su | 0 | 0 | 0 |
Tablo 1. 25 gıda için protein, karbonhidrat ve yağ.
Girdi vektörlerinin farklı değerleri olduğu için ve her bileşen kendi değer aralığına sahip olduğu için bu sorun ilgi çekicidir. Bu görselleştirme için önemlidir, çünkü bileşenleri 0 ile 255 arasında değişen RGB renk modelini kullanıyoruz.
Neyse ki, bu durumda girdi vektörleri de 3 boyutludur ve Kohonen harita görselleştirmesi için https://en.wikipedia.org/wiki/RGB_color_modeltitleRGB renk modelini kullanabiliriz.title
//+------------------------------------------------------------------+ //| 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); };
Gördüğünüz gibi, eğitim setinin maksimum ve minimum değerlerinin saklanması için m_max_values[] ve m_min_values[] dizilerini ekledik. RGB renk modelinde görselleştirme için "ölçeklendirme" gereklidir, bu nedenle Train(), Render() ve ShowPattern() yöntemlerini aşırı yükledik.
Maksimum ve minimum değerlerin aranması, Train() yönteminde uygulanır.
//--- 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]); }
Bileşenleri RGB renk modelinde göstermek için Render() yöntemini değiştirmemiz gerekiyor:
// 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'in sonucu Şekil 9'da sunulmuştur.
Şekil 9. Protein, karbonhidrat ve yağa dayalı benzerlik bölgelerine göre gruplandırılmış gıda haritası
Bileşen analizi. Haritadan Şeker, Pirinç ve Mısır gevreklerinin Karbonhidrat (2. bileşen) nedeniyle yeşil renkle işaretlendiği görülebilir. Tereyağı yeşil bölgededir, çok fazla Yağ içerir (3. bileşen). Sığır Biftek, Fırında Tavuk ve Ton Balığı Bifteğinde çok fazla Protein (1. bileşen, kırmızı) bulunur.
Yiyecek Kompozisyon Tablolarından (alternatif table) yeni yiyecekler ekleyerek eğitim setini genişletebilirsiniz.
Gördüğünüz gibi, problem "saf" R,G,B yönleri için çözüldü. Birkaç eşit (veya çoğunlukla eşit) bileşene sahip diğer gıdalar ne olacak? Daha sonra Bileşen Düzlemlerini ele alacağız, özellikle girdi vektörlerinin boyutunun 3'ten büyük olduğu durumlarda çok kullanışlıdır.
2.4. Örnek 4. 4 boyutlu durum. Fisher's Iris veri seti. CMYK
Üç boyutlu vektörler için görselleştirmede sorun yoktur. Renk bileşenlerini görselleştirmek için kullanılan RGB renk modeli nedeniyle sonuçlar açıktır.
Yüksek boyutlu verilerle çalışırken, onları görselleştirmenin yolunu bulmamız gerekiyor. Basit çözüm, vektör uzunluğuyla orantılı renklerle bir degrade haritası (örneğin, Siyah/Beyaz) çizmektir. Diğer yol ise başka bir renk boşlukları kullanmaktır. Bu örnekte, Fisher's Iris veri seti için hCMYK renk modelini ele alacağız. Daha iyi bir çözüm var, bunu daha sonra ele alacağız.
Iris çiçeği veri seti veya Fisher's Iris veri seti, diskriminant analizinin bir örneği olarak R. Fisher (1936) tarafından tanıtılan çok değişkenli bir veri setidir. Veri seti, üç İris çiçeği türünün (Iris setosa, Iris virginica ve Iris versicolor) her birinden 50 örnekten oluşur.
Her numuneden dört özellik ölçüldü, bunlar çanak yaprağın ve taç yaprağın santimetre cinsinden uzunluğu ve genişliğidir.
Şekil 10. Iris çiçeği
Her numunenin 4 özelliği vardır:
- Çanak yaprak uzunluğu;
- Çanak yaprak genişliği;
- Taç yaprak uzunluğu;
- Taç yaprak genişliği.
https://en.wikipedia.org/wiki/Iris_flower_data_settitleIris çiçek veri seti titleSOM_ex4.mq5 içinde bulunabilir.
Bu örnekte, çizim için ara CMYK renk uzayını kullanacağız, yani düğümün ağırlıklarını CMYK uzayında bir vektör olarak ele alacağız. Sonuçları görselleştirmek için CMYK->RGB dönüşümü kullanılır. CSOM sınıfına yeni bir yöntem int CSOM::CMYK2Col(uchar c,uchar m,uchar y,uchar k) eklenir, CSOM::Render() yönteminde kullanılır. Ayrıca 4 boyutlu vektörleri desteklemek için sınıfları değiştirmeliyiz.
Sonuç, Şekil 11'de sunulmuştur.
Şekil 11. İris çiçeği veri seti için Kohonen Haritası, CMYK renk modelinde çizilmiş
Ne görüyoruz? Tam kümelemeye sahip değiliz (sorunun özellikleri nedeniyle), ancak iris setosa'nın doğrusal ayrımı görülebilir.
Setosa'nın bu lineer ayrılmasının nedeni, CMYK uzayındaki büyük bir "Macenta" bileşenidir (2.).
2.6. Bileşen Düzlem Analizi
Önceki örneklerden (gıda ve iris veri kümeleme) veri görselleştirme ile ilgili bir sorun olduğu görülebilir.
Örneğin, gıda sorunu için belirli renklere (kırmızı, yeşil, mavi) ilişkin bilgileri kullanarak Kohonen Haritasını analiz ettik. Temel kümelere ek olarak, birkaç bileşenli bazı yiyecekler vardı. Ayrıca, bileşenler çoğunlukla eşitse analiz zorlaşır.
Bileşen düzlemleri, her bir besinin göreli yoğunluğunu görme imkanı sağlar.
CIntBMP sınıfı örneklerini (m_bmp[] dizisi) CSOM sınıfına eklememiz ve karşılık gelen oluşturma yöntemlerini değiştirmemiz gerekiyor. Ayrıca her bir bileşenin yoğunluğunu görselleştirmek için bir gradyan haritasına ihtiyacımız var (düşük değerler mavi renkle, yüksek değerler kırmızı ile gösterilmiştir):
Şekil 12. Gradyan paleti
Palette[768] dizisini, GetPalColor() ve Blend() yöntemlerini ekledik. Bir düğümün çizimi RenderCell() yöntemine yerleştirilir.
İris Çiçeği Veri Seti
som-ex4-cpr.mq5'in sonuçları Şekil 13'te sunulmuştur.
altŞekil 13. İris çiçeği veri setinin bileşen düzlemleri gösterimialttitle Şekil 13. İris çiçeği veri setinin bileşen düzlemleri gösterimititle
Şekil 13. İris çiçeği veri setinin bileşen düzlemleri temsili
Bu durumda, 30x30 düğümlü, görüntü boyutu 300x300 olan ızgarayı kullanırız.
Bileşen düzlemleri, korelasyon tespitinde önemli bir rol oynar: Bu düzlemlerin karşılaştırılması, hatta kısmen bağıntılı değişkenler olabilir. görsel inceleme ile tespit edilir. Bileşen düzlemleri varsa bu daha kolaydır ilişkili olanlar birbirine yakın olacak şekilde yeniden düzenlenir. Bu şekilde, daha fazla bilgi için ilginç bileşen kombinasyonları seçmek kolay olur.
Bileşen düzlemlerini ele alalım (Şekil 14).
Maksimum ve minimum bileşenlerin değerleri degrade tablosunda gösterilir.
Şekil 14. İris çiçeği veri seti. Bileşen düzlemleri
CMYK renk modelinde temsil edilen tüm bu bileşen düzlemleri Şekil 15'te gösterilmektedir.
Şekil 15. İris çiçeği veri seti. CMYK renk modelinde Kohonen haritası
Setosa iris türünü hatırlatalım. Bileşen düzlem analizini kullanarak (Şekil 14) 1. (Çanak Yaprak Uzunluğu), 3. (Taç Yaprak Uzunluğu) ve 4. (Taç Yaprak Genişliği) bileşen düzlemlerinde minimum değerlere sahip olduğu görülebilir.
2. bileşen düzleminde (Çanak Yaprak Genişliği) maksimum değerlere sahip olması dikkat çekicidir, CMYK-renk modelinde elde ettiğimiz sonucun aynısıdır (Macenta bileşen, Şekil 15).
Gıda Kümeleme
Şimdi bileşen düzlemi analizini (som-ex3-cpr.mq5) kullanarak gıda kümeleme problemini ele alalım.
Sonuç, Şekil 16'da sunulmuştur (30x30 düğüm, görüntü boyutu 300x300, kenarlıksız altıgen hücreler).
Şekil 16. Gıda için Kohonen haritası, bileşen düzlemi gösterimi
CSOM sınıfının ShowPattern() yöntemine başlıkları gösterme seçeneğini ekledik (giriş parametresi ShowTitles=true).
Bileşen düzlemleri (protein, karbonhidrat, yağ) aşağıdaki gibi görünür:
Şekil 17. Gıdalar için Kohonen haritası. Bileşen düzlemleri ve RGB renk modeli
Şekil 17'de gösterilen bileşen düzlemi gösterimi, gıda bileşenlerinin yapısı hakkında yeni bir görünüm açar. Ayrıca, Şekil 9'da sunulan RGB renk modelinde görülemeyen ek bilgiler sağlar.
Örneğin, şimdi 1. bileşen düzleminde (protein) Peyniri görüyoruz. RGB renk modelinde, yağdan dolayı (2. bileşen) macentaya yakın renkli olarak gösterilmiştir.
2.5. İsteğe Bağlı Boyut Durumunda Bileşen Düzlemlerinin Uygulanması
İncelediğimiz örneklerin bazı belirli özellikleri var, boyut sabitlendi ve görselleştirme algoritması farklı temsiller için farklıydı (RGB ve CMYK renk modelleri).
Şimdi algoritmayı rastgele boyutlar için genelleştirebiliriz, ancak bu durumda sadece bileşen düzlemlerini görselleştireceğiz. Program, isteğe bağlı verileri CSV dosyasından yükleyebilmelidir.
Örneğin, food.csv aşağıdaki gibi görünür:
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
Dosyanın ilk satırı, girdi veri vektörünün adlarını (başlıklarını) içerir. Bileşen düzlemlerini ayırt etmek için başlıklar gereklidir, adlarını gradyan panelinde yazdıracağız.
Desenin adı son sütunda bulunur, bizim durumumuzda bu, yiyeceğin adıdır.
SOM.mq5 (OnInit işlevi) kodu basitleştirilmiştir:
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); }
Eğitim kalıplarına sahip dosyanın adı, bizim durumumuzda "food.csv" olan DataFileName giriş parametresinde belirtilir.
Sonuç, Şekil 18'de gösterilmektedir.
Şekil 18. Siyah/beyaz degrade renk düzeninde yiyeceklerin Kohonen Haritası
Ayrıca, degrade şeması seçimi için ColorScheme giriş parametresini ekledik.
Şu anda 4 renk şeması mevcuttur (ColorScheme=0,1,2,4=Siyah-Beyaz, DarkBlue-Mavi-Yeşil-Sarı-Kırmızı, Kırmızı-Siyah-Yeşil, Kırmızı-Beyaz-Yeşil).
Gradyanı CSOM::InitParameters() yöntemine ekleyerek kendi şemanızı kolayca ekleyebilirsiniz.
Renk şeması, Uzman Danışmanın giriş parametrelerinden seçilebilir:
Benzer şekilde İris çiçeği veri setini (iris-fisher.csv) hazırlayabiliriz:
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
Sonuç, Şekil 19'da gösterilmektedir.
Şekil 19. İris çiçeği veri seti. Kırmızı-Siyah-Yeşil renk şemasındaki bileşen düzlemleri (ColorScheme=2, iris-fisher.csv)
Artık gerçek uygulamalar için bir aracımız var.
2.6. Örnek 5. Pazar ısı haritaları
Kendi Kendini Düzenleyen Özellik Haritaları, piyasa hareket haritaları için kullanılabilir. Bazen pazarın küresel resmine ihtiyaç duyulur, piyasa ısı haritası çok kullanışlı bir araçtır. Hisse senetleri ekonomik sektörlere bağlı olarak birleştirilir.
Stokun mevcut rengi, mevcut büyüme oranına (% olarak) bağlıdır:
Şekil 20. S&P500'den hisse senetleri için piyasa ısı haritası
S&P'den (http://finviz.com) hisse senetlerinin haftalık piyasa ısı haritası Şekil 20'de gösterilmektedir. Renk, büyüme oranına bağlıdır (% olarak):
Hisse senedi dikdörtgeninin boyutu piyasa değerine bağlıdır. Aynı analiz MetaTrader 5 istemci terminalinde Kohonen Haritaları kullanılarak yapılabilir.
Buradaki fikir, büyüme oranlarını (% olarak) birkaç zaman dilimi için kullanmaktır. Kohonen haritaları ile çalışmak için aracımız var, bu nedenle gerekli olan tek şey, verileri .csv dosyasına kaydeden komut dosyasıdır.
Amerikan hisse senetlerinin CFD fiyatlarına ilişkin fiyat verileri (#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 ve #XOM) MetaQuotes Demo sunucusunda bulunabilir.
dj.csv dosyasını hazırlayan komut dizisi çok basittir:
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
Geçmiş veriler indirilmelidir, bunu DownloadHistory komut dosyasını kullanarak otomatik olarak yapabilirsiniz.
dj.mq5 betiğinin bir sonucu olarak, dj.csv'yi aşağıdaki verilerle alacağız:
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") başlatıldıktan sonra, her biri zaman aralıklarına karşılık gelen 8 resim elde edeceğiz. 30, 60, 90, 120, 150, 180, 210 ve 240 dakika.
23 Mayıs 2011 işlem seansının son 4 saatine ait piyasa büyüme oranı verilerinin (Amerikan hisse senetleri) Kohonen haritaları Şekil 21'de sunulmaktadır.
Şekil 21. Amerikan hisse senetleri için Kohonen haritaları (23 Mayıs 2011 ticaret seansının son 4 saati).
Şekil 21'den, #C (Citigroup Inc.), #T (AT&T Inc.), #JPM (JPMorgan Chase & Co), #BAC (Bank of America) dinamiklerinin benzer olduğu görülebilir. Uzun vadeli kırmızı bir kümede gruplandılar.
Son 1,5 saat boyunca (M30, M60, M90) dinamikleri yeşile döndü, ancak genel olarak (M240) stoklar kırmızı bölgedeydi.
Kohonen haritalarını kullanarak hisse senetlerinin göreli dinamiklerini görselleştirebilir, liderler ve kaybedenler ve bunların çevresini bulabiliriz. Benzer verilere sahip öğeler kümeleri oluşturur.
Şekil 21a'dan gördüğümüz gibi Citigroup Inc hisselerinin fiyatı düşüşte lider oldu. Genel olarak finans şirketlerinin tüm hisseleri kırmızı bölgedeydi.
Şekil 21a. 23 Mayıs 2011 Pazar ısı haritası (Kaynak: http://finviz.com)
Benzer şekilde FOREX piyasasının Kohonen haritalarını da hesaplayabiliriz (Şekil 22):
Şekil 22. FOREX piyasası için Kohonen haritası (24 Mayıs 2011, Avrupa oturumu)
Aşağıdaki çiftler kullanılır: EURUSD, GBPUSD, USDCHF, USDJPY, USDCAD, AUDUSD, NZDUSD, USDSEK, AUDNZD, AUDCAD, AUDCHF, AUDJPY, CHFJPY, EURGBP, EURAUD, EURCHF, EURJPY, EURNZD, EURCAD, GBPCHF, GBPJPY, CADCHF.
Büyüme oranları fx.mq5 komut dosyası kullanılarak fx.csv dosyasına aktarılır.
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
Fiyatların yanı sıra farklı zaman dilimlerinde göstergelerin değerlerini de kullanabilirsiniz.
2.6. Örnek 6. Optimizasyon Sonuçlarının Analizi
MetaTrader 5 istemci terminalinin titlehttps://www.metatrader5.com/en/automated-trading/strategy-testertitleStrateji Test Cihazı, parametre alanının yapısını keşfetme ve en iyi strateji parametreleri kümesini bulma fırsatı sunar. Ayrıca, "Optimizasyon Sonuçları" sekmesinin içerik menüsünden "XML'ye Aktar (MS Office Excel)" seçeneğini kullanarak optimizasyon sonuçlarını dışa aktarabilirsiniz.
Test Kullanıcısı İstatistikleri, optimizasyon sonuçlarına da dahildir (41 sütun):
- Sonuç
- Kâr
- Brüt Kar
- Brüt Zarar
- Para çekme
- Beklenen Geri Ödeme
- Kâr Faktörü
- Kurtarma Faktörü
- Sharpe Oranı
- Marj Düzeyi
- Özel
- Minimum Bakiye
- Bakiye DD Maksimal
- Bakiye DD Maksimal (%)
- Bakiye DD Bağıl
- Bakiye DD Bağıl (%)
- Asgari Hisse Senedi
- Hisse Senedi DD Maksimal
- Hisse Senedi DD Maksimal (%)
- Hisse Senedi DD Bağıl
- Hisse Senedi DD Bağıl (%)
- Alım satımlar
- Yatırımlar
- Kısa Alım Satımlar
- Kar Kısa Alım Satımlar
- Uzun Alım Satımlar
- Kar Uzun Alım Satımlar
- Kâr Alım Satımları
- Zarar Alım Satımları
- Maks Kâr alım satımı
- Maks zarar alım satımı
- Maks ardışık kazançlar
- Maks ardışık kazançlar ($)
- Maks ardışık kar
- Maks ardışık kâr sayısı
- Maks ardışık kayıplar
- Maks ardışık kayıplar ($)
- Maks ardışık zararlar
- Maks ardışık zarar sayısı
- Ort. ardışık kazançlar
- Ort. ardışık kayıplar
Test cihazı istatistiklerinin kullanılması, parametre alanının analizine yardımcı olur. İstatistiğin birçok parametresinin yakından ilişkili olması ve ticaret performansı sonuçlarına bağlı olması dikkat çekicidir.
Örneğin, en iyi ticaret sonuçları, Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı parametrelerinin en büyük değerlerine sahiptir. Bu gerçek, sonuçların analizinde bunları kullanmamıza izin verir.
MovingAverage.mq5 Uzman Danışman Optimizasyon Sonuçları
Bu bölümde, MetaTrader 5 istemci terminalinin standart paketinde bulunan MovingAverage.mq5 Uzman Danışmanın optimizasyon sonuçlarının analizini ele alacağız. Bu Uzman Danışman, fiyat ve hareketli ortalama göstergesinin çaprazlamasına dayanmaktadır. İki giriş parametresi vardır: MovingPeriod ve MovingShift, yani sonuç olarak 43 sütunlu XML dosyasına sahip olacağız.
43 boyutlu parametre uzayını dikkate almayacağız, en ilginç olanları:
- Kâr;
- Kâr Faktörü;
- Kurtarma Faktörü;
- Sharpe Oranı;
- Alım satımlar;
- ProfitTrades(%);
- MovingPeriod;
- MovingShift;
Not, ProfitTrades (%) parametresini ekledik (sonuçlarda yok), bu karlı işlemlerin yüzdesi anlamına gelir ve ProfitTrades'in (28) İşlemlere (22) bölünmesi, 100 ile çarpılması sonucu hesaplanır.
MetaTrader 5 Strategy Tester'ın 400 set giriş parametresi için 9 sütunlu optim.csv dosyasını hazırlayalım.
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 değerini Başlık sütunu olarak kullandığımıza dikkat edin, Kohonen haritalarındaki kalıpları "işaretlemek" için kullanılacaktır.
Strateji Test Kullanıcısında MovingPeriod ve MovingShift değerlerini aşağıdaki parametrelerle optimize ettik:
- Sembol - EURUSD,
- Dönem - H1,
- Onay oluşturma modu - "1 Dakika OHLC",
- Test aralığı - 2011.01.01-2011.05.24,
- Optimizasyon - Hızlı (genetik algoritma),
- Optimizasyon - Bakiye maks.
Şekil 23. MovingAverage EA'nın optimizasyon sonuçları için Kohonen haritası (bileşen düzlem gösterimi)
Üst sıranın bileşen düzlemlerini ele alalım (Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı).
Şekil 24'te birleştirilmiştir.
Şekil 24. Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı parametreleri için bileşen düzlemleri
İhtiyacımız olan ilki, en iyi optimizasyon sonuçlarına sahip bölgeleri bulmaktı.
Şekil 24'ten görülebileceği gibi, maksimum değerlere sahip bölgeler sol üst köşede yer almaktadır. Rakamlar Hareketli Ortalama göstergesinin ortalama periyoduna karşılık gelmektedir (MovingPeriod parametresi, başlık olarak kullandık). Sayıların konumu tüm bileşen düzlemleri için aynıdır. Her bileşen düzleminin kendi değer aralığı vardır, değerler degrade panelinde yazdırılır.
En iyi optimizasyon sonuçları, Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı gibi en büyük değerlere sahiptir, bu nedenle haritadaki bölgeler hakkında bilgi sahibiyiz (Şekil 24'te özetlenmiştir).
Trades, ProfitTrades(%), MovingPeriod ve MovingShift için bileşen düzlemleri Şekil 25'te sunulmaktadır.
Şekil 25. Trades, ProfitTrades(%), MovingPeriod ve MovingShift parametreleri için bileşen düzlemleri
Bileşen Düzlem Analizi
İlk bakışta ilginç bir bilgi yok. Doğrudan ticaret sisteminin performansına bağlı oldukları için ilk 4 bileşen düzlemi (Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı) benzer görünmektedir.
Şekil 24'ten görülebilir, sol üst bölge çok ilginçtir (örneğin, MovingPeriod'u 45'ten 50'ye ayarlarsak en iyi sonuçlara ulaşılabilir).
Uzman Danışman, EURUSD'nin saatlik zaman diliminde, trende dayalı stratejisini test etti, bu değerleri bir "piyasa trendi" hafızası olarak kabul edebiliriz. Doğruysa, 2011'in ilk yarısı için piyasa trend hafızası 2 güne eşittir.
Diğer bileşen düzlemlerini ele alalım.
Şekil 26. Bileşen uçakları Ticaret-Taşıma Dönemi
Şekil 26'ya baktığımızda, MovingPeriod'un (mavi bölgeler) daha düşük değerlerinin daha yüksek Ticaret değerlerine (sarı-kırmızı bölgeler) yol açtığını görebiliriz. Hareketli ortalama periyodu düşükse, birçok geçiş (işlem) vardır.
Ayrıca bu gerçeği Ticaret bileşen düzleminde de görebiliriz (20'nin altında sayılara sahip yeşil bölgeler).
Şekil 27. Bileşen düzlemleri Trades-MovingShift
MovingShift (sarı-kırmızı bölgeler) arttıkça işlem sayısı azalır (mavi bölgeler). MovingShift ve Fig.24 için bileşen düzlemleri karşılaştırıldığında, MovingShift parametresinin bu ticaret stratejisinin performansı için çok önemli olmadığı görülebilir.
Kârlı işlemlerin yüzdesi ProfitTrades(%) doğrudan bağlı değildir MovingPeriod veya MovingShift, ticaret sisteminin ayrılmaz bir özelliğidir. Başka bir deyişle, girdi parametreleriyle korelasyonunun analizinin bir anlamı yoktur.
Daha karmaşık ticaret stratejileri de benzer şekilde analiz edilebilir. Ticaret sisteminizin en önemli parametresini/parametrelerini bulmanız ve bir başlık olarak kullanmanız gerekir.
Sonuç
Kendi Kendini Düzenleyen Özellik Haritalarının ana avantajı, yüksek boyutlu verilerin iki boyutlu ayrıklaştırılmış bir temsilini üretme fırsatıdır. Benzer özelliklere sahip veriler kümeler oluşturur, korelasyon analizini kolaylaştırır.
Ayrıntılar ve diğer uygulamalar Guido Deboeck ve Teuvo Kohonen tarafından kaleme alınmış olan mükemmel bir kitapta bulunabilir Visual Explorations in Finance: with Self-Organizing Maps .
Ek
Rusça versiyonunun yayınlanmasından sonra, Alex Sergeev, sınıfların geliştirilmiş versiyonunu (SOM_Alex-Sergeev_en.zip) önerdi.
Değişiklik listesi:
1. Görüntülerin gösterilmesi değişti: cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)
2. Resimlerle klasörü açma özelliği eklendi:
#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 sınıfındaki değişiklikler:
- CSOM::HideChart yöntemi eklendi - grafiği gizler.
- Eklenen sınıf üyeleri m_chart, m_wnd, m_x0, m_y0 - (grafik, pencere ve görüntüleri göstermek için koordinatlar).
+ m_sID eklendi - nesne adları öneki. Ön ek dosya adını kullanır, varsayılan olarak "SOM" öneki kullanılır. - Tüm haritalar m_sID adıyla klasöre kaydedilir.
- bmp dosyaları, kalıpların sütun adına göre adlandırılır.
- CSOM::ShowBMP yöntemi değiştirildi (haritalar,\Images yerine \Files klasörüne kaydedilir, çok daha hızlı çalışır).
- CSOM::NetDeinit, CSOM::HideBMP olarak değiştirildi.
- CSOM::ReadCSVData yöntemi değiştirildi, ilk sütun başlıkları içeriyor.
- CSOM::Train(bool bShowProgress) içinde ara haritaları göstermek için bir bayrak eklendi.
- CSOM::Train'de ara haritaların gösterilmesi her 2 saniyede bir (yineleme yerine) gerçekleştirilir, ilerleme Yorum kullanılarak grafikte gösterilir.
- Bazı değişkenlerin optimize edilmiş isimleri, kategoriye göre sıralanmış sınıf yöntemleri.
Bmp çizimi çok yavaş bir işlemdir. Gerçekten ihtiyacınız yoksa, her seferinde çizmeyin.
Optimizasyon sonuçlarına sahip SOM görüntüleri örneği arşive dahil edilmiştir.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/283
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz