Sinir ağları konusunda danışmanlar, deneyim paylaşımı. - sayfa 9

 
Andrey Emelyanov :

Ben de 2013'te benzer bir algoritma uygulamaya çalıştım... Doğru, 7 gösterge kullandım ve Zigzag NN'nin öğrenme vektörünü oluştururdu. Ama öz aynı - ben ters pozisyonlar arıyordum ... ne göstergelerden gelen verilerden ne de onlardan gelen ticaret sinyallerinden iyi bir şey gelmedi ... kazara kalıplara rastlayana kadar. Bu da aracımı kökten değiştirdi. Şimdi algoritmam daha basit:

1. Geçen yıl için dakika ve saat zaman dilimlerinde kalıpların hesaplanması;

2. Bir dönüm noktası sözlüğünün derlenmesi ("dakika düzeni - saat düzeni" çiftleri);

3. Dönüş noktaları sözlüğüne göre NS öğretimi (150-160 çift için);

İşte yaklaşımımın sonucu:

Yaklaşımımın dezavantajlarına:

1) Yüksek TS riski - kırılma fiyatının değerini doğru bir şekilde belirlemek imkansız olduğundan, TS lotlu 9 bekleyen emir verir: 1, 1, 3, 6, 14, 31, 70, 158, 355;

2) Çıkış algoritmasını (TS trolünü) uygulamak zordur;

Yani NN ticaret için kullanılabilir, ancak soru NN'ye ne öğretileceğidir...

P/s: kalıplarla, A. Merrill'in (M & W) kalıplarını kastediyorum.

Akıllı yaklaşım. Ve kalıplar, gerçek fiyat deltasını hesaba katmadan sadece çubukların matristeki konumu olarak tanımlandı - sadece göreceli konum mu?

Gösterge modellerini denemek için bir fikrim var, ancak farklı bir çerçeveyle - son 5 göstergedeki göstergelerin ilk beş çubuğunu ve trend analizi için iki göstergeyi analiz ediyoruz - 10'luk artışlarla analiz ediyoruz ve aynı zamanda hesap mutlak değişiklikler.

Zig-zag hakkında mantıklı bir fikir, ancak düz yalpalardan tepe noktaları nasıl filtrelenebilir ki, bir trend değişikliğinin yanlış noktaları olabilir?

 
-Aleks- :

Akıllı yaklaşım. Ve kalıplar, gerçek fiyat deltasını hesaba katmadan sadece çubukların matristeki konumu olarak tanımlandı - sadece göreceli konum mu?

Gösterge modellerini denemek için bir fikrim var, ancak farklı bir çerçeveyle - son 5 göstergedeki göstergelerin ilk beş çubuğunu ve trend analizi için iki göstergeyi analiz ediyoruz - 10'luk artışlarla analiz ediyoruz ve aynı zamanda hesap mutlak değişiklikler.

Zig-zag hakkında mantıklı bir fikir, ancak düz yalpalardan tepe noktaları nasıl filtrelenebilir ki, bir trend değişikliğinin yanlış noktaları olabilir?

Bunu seviyorum:

Yalnızca kalıp çiftlerini depolayan dinamik bir dizi var (ben buna sözlük diyorum), sözlüğe ikinci kez bir çift kalıp girerse, onu yazmam; ve daha yüksek ve daha düşük olanın sayacının iki dizisi - sözlüğe yazılmamış olsa bile, kalıbın çift oluşumuna ne sıklıkta katıldığını sayarlar.

Öğrenme vektörünün oluşumu sözlüğe göre gerçekleşir, ayrı bir kalıbın ağırlığı = kalıp_sayıcı / maksimum_sayıcı. Onlar. çiftlerin oluşumunda en sık yer alan model 1'dir ve diğerlerinin tümü 1'den küçüktür. NN'yi eğittikten sonra elde edilen bir tablo:

Ana Desen Ana Sayım köle desen Köle Sayısı Sum_Multilayer_Perceptron
W2 on sekiz W2 21 0.94914702
W14 on dört W2 21 0.84972197
M15 20 M15 on dört 0,83269191
W1 on bir W2 21 0.77499075
W13 on W2 21 0.75006553
M15 20 M3 on 0.73813147
M15 20 M10 on 0.73812512
M15 20 M16 on 0.738099
W5 dokuz W2 21 0.72506739
W10 dokuz W2 21 0.72505412
M15 20 M11 dokuz 0,71431236
W2 on sekiz W1 on bir 0.71204136
W2 on sekiz W5 on bir 0.7118911
W4 sekiz W2 21 0.70017271
W2 on sekiz W4 on 0.68815217
W2 on sekiz W7 on 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
W2 on sekiz W13 sekiz 0.64045346
M3 12 M15 on dört 0.63254238
W9 5 W2 21 0.62522345
W3 5 W2 21 0.62509623
W7 5 W2 21 0.62505511
M15 20 M12 5 0,61917222
M15 20 M8 5 0.6191331
W14 on dört W1 on bir 0.61210667
W6 4 W2 21 0.60012943
W2 on sekiz W14 6 0,59301682

NS yapısı: Girişte 64 nöron, 4 dahili, 1 çıkış. Onlar. bir giriş nöronu bir modeli tanımlar. Şebeke 40-50 dakikada eğitilir, NN hatası 0.00001'i geçmez.

Böylece, daha önce sözlükte olmasa bile, kalıp çiftlerinin önemini tahmin edebilen bir modelim var.

Uzun zamandır düz ve yanlış tepelerle uğraşıyorum ama ZigZaga hesabı düzeyinde. Standart Zigzag kodunu biraz değiştirdim, yani bazında bir yüzde ZZ uyguladım. Şimdiye kadar, az ya da çok gerekli kod şöyle görünür:

int MyCExtremum::GetCombiZigzag(const double    &high[],     // буфер цен high

                                const double    &low[],      // буфер цен low

                                const datetime  &time[],     // буфер время 

                                int             ExtDepth,    // глубина поиска экстремумов(первого прохода)

                                double          ExtDeviation,// "пороговое значение": жесткая ступенька + % роста цены

                                int             ExtBackstep  // глубина поиска экстремумов(второго прохода)

                               )

  {

   //--- value

   int    shift=0, whatlookfor=0, lasthighpos=0, lastlowpos=0, Deviat=1;

   double lasthigh=0.0, lastlow=0.0, percent=0.0;

   int    rates_total = ArraySize(time);          // размер входных таймсерий

   int    limit       = rates_total - ExtDepth;   // лимит на расчеты...

   //+---------------------------------------------------------------+

   //| ОЧЕНЬ ВАЖНАЯ ПРОВЕРКА ВЛИЯЮЩАЯ НА КОРРЕКТНОСТЬ ВЫЧИСЛЕНИЙ!    |

   //+---------------------------------------------------------------+

   if(ArrayIsSeries(high)) ArraySetAsSeries(high,false);

   if(ArrayIsSeries(low))  ArraySetAsSeries(low,false);

   if(ArrayIsSeries(time)) ArraySetAsSeries(time,false);

   //+---------------------------------------------------------------+

   //| ПРОВЕРКИ ВХОДНЫХ ПЕРЕМЕННЫХ                                   |

   //+---------------------------------------------------------------+

   if(rates_total<20)

     { 

      Print(__FUNCTION__," ERROR: the small size of the buffer.");

      return(-1);                                     

     }

   if(ExtDeviation<0 || ExtDeviation>100)

     { 

      Print(__FUNCTION__," ERROR: Is\'not correct a Deviation. The value of Deviation should be in the interval [0..100].");

      return(-1);                                     

     }

   //--- Проверка: Depth and Backstep

   if((ExtDepth < ExtBackstep)||(ExtDepth < 2))

     {

      Print(__FUNCTION__+" ERROR: Is\'not correct a Depth and Backstep. The value of Depth should be greater than Backstep.");

      return(-1);

     }

   //--- готовим буфер ZigzagBuffer[]

   if(ArraySize(ZigzagBuffer)>0) ArrayFree(ZigzagBuffer);               // Удаляем старые данные

   ArrayResize(ZigzagBuffer,rates_total, EXTREMUM_RESERVE);

   ArrayFill(ZigzagBuffer,0,rates_total,0.0);

   if(ArrayIsSeries(ZigzagBuffer))  ArraySetAsSeries(ZigzagBuffer,  false);

   //---

   if(ArraySize(HighMapBuffer)>0) ArrayFree(HighMapBuffer);             // Удаляем старые данные

   ArrayResize(HighMapBuffer,rates_total, EXTREMUM_RESERVE);

   ArrayFill(HighMapBuffer,0,rates_total,0.0);

   if(ArrayIsSeries(HighMapBuffer)) ArraySetAsSeries(HighMapBuffer, false);

   //---

   if(ArraySize(LowMapBuffer)>0) ArrayFree(LowMapBuffer);               // Удаляем старые данные

   ArrayResize(LowMapBuffer,rates_total, EXTREMUM_RESERVE);

   ArrayFill(LowMapBuffer,0,rates_total,0.0);

   if(ArrayIsSeries(LowMapBuffer))  ArraySetAsSeries(LowMapBuffer,  false);   

   //---

   if(ArraySize(TimeBuffer)>0) ArrayFree(TimeBuffer);                   // Удаляем старые данные

   ArrayResize(TimeBuffer,     rates_total, EXTREMUM_RESERVE);

   ArrayFill(TimeBuffer,    0, rates_total,   0);

   if(ArrayIsSeries(TimeBuffer))  ArraySetAsSeries(TimeBuffer,  false);   

   //--- корректировка Deviation

   if(ExtDeviation < 1)

     {

      Deviat = 1;

     }else

        {

         Deviat = (int)ExtDeviation;

        }

   //--- получаем "свежие" минимумы и максимумы

   if(GetHighMapZigzag(high,ExtDepth,Deviat,ExtBackstep) < 0) return(0);

   if(GetLowMapZigzag(low,ExtDepth,Deviat,ExtBackstep)   < 0) return(0);

   //--- final rejection

   for(shift=ExtDepth;shift<rates_total;shift++)

     {

      switch(whatlookfor)

        {

         case Start: // search for peak or lawn

            if(lastlow==0 && lasthigh==0)

              {

               if(HighMapBuffer[shift]!=0)

                 {

                  lasthigh=high[shift];

                  lasthighpos=shift;

                  whatlookfor=Sill;

                  ZigzagBuffer[shift]=lasthigh;

                  TimeBuffer[shift]=time[shift];

                 }

               if(LowMapBuffer[shift]!=0)

                 {

                  lastlow=low[shift];

                  lastlowpos=shift;

                  whatlookfor=Pike;

                  ZigzagBuffer[shift]=lastlow;

                  TimeBuffer[shift]=time[shift];

                 }

              }

            break;

         case Pike: // search for peak

            if(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)

              {

               //---

               ZigzagBuffer[lastlowpos] = 0.0;

               TimeBuffer[lastlowpos]   = 0;

               //---

               lastlowpos=shift;

               lastlow=LowMapBuffer[shift];

               ZigzagBuffer[shift]=lastlow;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            //--- Обход "двойственности"

            if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow)

              {

               //---

               ZigzagBuffer[lastlowpos] = 0.0;

               TimeBuffer[lastlowpos]   = 0;

               //---

               lastlowpos=shift;

               lastlow=LowMapBuffer[shift];

               ZigzagBuffer[shift]=lastlow;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)

              {

               //--- Проверка: % роста цены

               percent = (HighMapBuffer[shift]-lastlow)/(lastlow/100);

               if(percent > ExtDeviation)

                 {

                  lasthigh=HighMapBuffer[shift];

                  lasthighpos=shift;

                  ZigzagBuffer[shift]=lasthigh;

                  TimeBuffer[shift]=time[shift];

                  whatlookfor=Sill;

                 }

               percent = 0.0;

              }            

            break;

         case Sill: // search for lawn

            if(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)

              {

               //--- 

               ZigzagBuffer[lasthighpos] = 0.0;

               TimeBuffer[lasthighpos]   = 0;

               //---

               lasthighpos=shift;

               lasthigh=HighMapBuffer[shift];

               ZigzagBuffer[shift]=lasthigh;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh)

              {

               //--- 

               ZigzagBuffer[lasthighpos] = 0.0;

               TimeBuffer[lasthighpos]   = 0;

               //---

               lasthighpos=shift;

               lasthigh=HighMapBuffer[shift];

               ZigzagBuffer[shift]=lasthigh;

               TimeBuffer[shift]=time[shift];

               //--- Обязательно: покинуть switch

               break;

              }

            if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)

              {

               //--- Проверка: % роста цены

               percent = (lasthigh-LowMapBuffer[shift])/(lasthigh/100);

               if(percent > ExtDeviation)

                 {

                  lastlow=LowMapBuffer[shift];

                  lastlowpos=shift;

                  ZigzagBuffer[shift]=lastlow;

                  TimeBuffer[shift]=time[shift];

                  whatlookfor=Pike;                  

                 }

               percent = 0.0;

              }

            break;

         default: 

            return(-1);

        }

     }

   //--- return value of prev_calculated for next call

   return(rates_total);   

  }

MyCextremum dosyasında - ZigZag hesaplamak için bir sınıf...

Dosyalar:
MyCExtremum.mqh  37 kb
 
-Aleks- :

Akıllı yaklaşım. Ve kalıplar, gerçek fiyat deltasını hesaba katmadan sadece çubukların matristeki konumu olarak tanımlandı - sadece göreceli konum mu?

Gösterge modellerini denemek için bir fikrim var, ancak farklı bir çerçeveyle - son 5 göstergedeki göstergelerin ilk beş çubuğunu ve trend analizi için iki göstergeyi analiz ediyoruz - 10'luk artışlarla analiz ediyoruz ve aynı zamanda hesap mutlak değişiklikler.

Zig-zag hakkında mantıklı bir fikir, ancak düz yalpalardan tepe noktaları nasıl filtrelenebilir ki, bir trend değişikliğinin yanlış noktaları olabilir?

Kalıpları kullanarak göstergelerin analizine gelince, bu çok ilginç ... Göstergelerde daha az gürültü olduğunu düşünüyorum, ancak bazılarının "düşük gürültüyü" ve diğerlerinin "yüksek gürültüyü" bastırması için göstergeler seçmeniz gerekiyor, o zaman bir çoklu filtre.
 

Andrey Emelyanov :

NS yapısı: Girişte 64 nöron, 4 dahili, 1 çıkış. Onlar. bir giriş nöronu bir modeli tanımlar.

Bu modelle sonuç almayı umuyor musunuz? İç katmanınız bir sınıflandırıcı değil, bir ara kompresör görevi görür.
 
Andrey Emelyanov :

Bunu seviyorum:

Yalnızca kalıp çiftlerini depolayan dinamik bir dizi var (ben buna sözlük diyorum), sözlüğe ikinci kez bir çift kalıp girerse, onu yazmam; ve daha yüksek ve daha düşük olanın sayacının iki dizisi - sözlüğe yazılmamış olsa bile, kalıbın çift oluşumuna ne sıklıkta katıldığını sayarlar.

Öğrenme vektörünün oluşumu sözlüğe göre gerçekleşir, ayrı bir kalıbın ağırlığı = kalıp_sayıcı / maksimum_sayıcı. Onlar. çiftlerin oluşumunda en sık yer alan model 1'dir ve diğerlerinin tümü 1'den küçüktür. NN'yi eğittikten sonra elde edilen bir tablo:

Ana Desen Ana Sayım köle desen Köle Sayısı Sum_Multilayer_Perceptron
W2 on sekiz W2 21 0.94914702
W14 on dört W2 21 0.84972197
M15 20 M15 on dört 0,83269191
W1 on bir W2 21 0.77499075
W13 on W2 21 0.75006553
M15 20 M3 on 0.73813147
M15 20 M10 on 0.73812512
M15 20 M16 on 0.738099
W5 dokuz W2 21 0.72506739
W10 dokuz W2 21 0.72505412
M15 20 M11 dokuz 0,71431236
W2 on sekiz W1 on bir 0.71204136
W2 on sekiz W5 on bir 0.7118911
W4 sekiz W2 21 0.70017271
W2 on sekiz W4 on 0.68815217
W2 on sekiz W7 on 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
W2 on sekiz W13 sekiz 0.64045346
M3 12 M15 on dört 0.63254238
W9 5 W2 21 0.62522345
W3 5 W2 21 0.62509623
W7 5 W2 21 0.62505511
M15 20 M12 5 0,61917222
M15 20 M8 5 0.6191331
W14 on dört W1 on bir 0.61210667
W6 4 W2 21 0.60012943
W2 on sekiz W14 6 0,59301682

NS yapısı: Girişte 64 nöron, 4 dahili, 1 çıkış. Onlar. bir giriş nöronu bir modeli tanımlar. Şebeke 40-50 dakikada eğitilir, NN hatası 0.00001'i geçmez.

Böylece, daha önce sözlükte olmasa bile, kalıp çiftlerinin önemini tahmin edebilen bir modelim var.

Uzun zamandır düz ve yanlış tepelerle uğraşıyorum ama ZigZaga hesabı düzeyinde. Standart Zigzag kodunu biraz değiştirdim, yani bazında bir yüzde ZZ uyguladım. Şimdiye kadar, az ya da çok gerekli kod şöyle görünür:

Bir dizi hakkında ilginç bir çözüm. Çiftler/dönemler arasında istatistiklerde herhangi bir fark var mı, olumlu bir tahmin sonucu veren bir kalıbın ortaya çıkma sıklığındaki değişkenliğin kararlılığı nedir?

Zigzag hakkında da bir yüzde çözümüm var, ancak referans zikzak segmentini hesaplamak için daha derin bir geçmiş kullanıyorum, bununla diğerlerindeki değişimi yüzde olarak karşılaştırıyorum.

 
Andrey Emelyanov :
Kalıpları kullanarak göstergelerin analizine gelince, bu çok ilginç ... Göstergelerde daha az gürültü olduğunu düşünüyorum, ancak bazılarının "düşük gürültüyü" ve diğerlerinin "yüksek gürültüyü" bastırması için göstergeler seçmeniz gerekiyor, o zaman bir çoklu filtre.
Birçok farklı gösterge var. Standart osilatörlerle (ve faizsiz benzerlikleriyle) deneyler yaptım ve hepsinden kar etmeyi başardım - hepsi ayarlara bağlı... tek soru bunun bir tesadüf mü yoksa bir kalıp mı olduğu.
 
Комбинатор :
Bu modelle sonuç almayı umuyor musunuz? İç katmanınız bir sınıflandırıcı değil, bir ara kompresör görevi görür.
64 girişten bir noktada (geçerli çubukta) sıkıştırmaya ihtiyacım var, sadece 2 giriş sıfırdan farklı... ve ağın görevi al/sat ile bölmek değil, Verilen girdiler için bir geri tepme olasılığını ölçün. Yoksa ben öyle konuşmuyor muyum?
 
-Aleks- :

Bir dizi hakkında ilginç bir çözüm. Çiftler/dönemler arasında istatistiklerde herhangi bir fark var mı, olumlu bir tahmin sonucu veren bir kalıbın ortaya çıkma sıklığındaki değişkenliğin kararlılığı nedir?

Zigzag hakkında da bir yüzde çözümüm var, ancak referans zikzak segmentini hesaplamak için daha derin bir geçmiş kullanıyorum, bununla diğerlerindeki değişimi yüzde olarak karşılaştırıyorum.

Herkesin bildiği gibi, A. Merrill'in kalıpları, kalıbın daha da gelişeceği (eğilimi sürdüreceği) veya başka bir kalıba geçeceği (fiyat toparlanması) konusunda kesin bir cevap vermez. Bu nedenle, bir saat ve bir dakikalık iki zaman dilimini kullanarak bir cevap aramaya karar verdim. Çiftlerin sıklığına ilişkin istatistikler topluyorum ve şu ana kadar evrensel bir öğrenme sözlüğüm yok. Ancak, bu bağlantının olması gerektiğinden eminim... aksi takdirde uyumlu desenler olmazdı: kelebekler, yarasalar vb.
 
Andrey Emelyanov :
Herkesin bildiği gibi, A. Merrill'in kalıpları, kalıbın daha da gelişeceği (eğilimi sürdüreceği) veya başka bir kalıba geçeceği (fiyat toparlanması) konusunda kesin bir cevap vermez. Bu nedenle, bir saat ve bir dakikalık iki zaman dilimini kullanarak bir cevap aramaya karar verdim. Çiftlerin sıklığına ilişkin istatistikler topluyorum ve şu ana kadar evrensel bir öğrenme sözlüğüm yok. Ancak, bu bağlantının olması gerektiğinden eminim... aksi takdirde uyumlu desenler olmazdı: kelebekler, yarasalar vb.
Bir kişi tarafından görsel olarak "kelebekler, yarasalar vb" olarak algılanan modeller. sadece insan beyninde doğarlar ve bence bu faktör dikkate alınmalıdır - beyin için neyin gerekli olduğunu ve neyin algısında olmadığını anlamak için bu konuda bilişsel psikoloji çalışmak gerekir. desen, yani hangi hatalar kabul edilebilir ve hangileri değildir. Beyin genellikle görmeyi beklediği şeyi kendi kendine çizer - kalıp sözlüğü sınırlıdır, bu da benzer mum kombinasyonlarını tek bir resme koyduğu anlamına gelir, yani. gördüklerini açıklamak için kesin bir matematiksel model kullanmaz.
 

Bebeğim hala dilsiz, ama zaten bir şeyler biliyor.. Girişte 8 gösterge, 1 çıkış, örtülü katmanda 15 nöron. 2000 girdi vektörü, 10000 eğitim dönemi.

Genel olarak, bu zaten 3. veya 4., tüm sonuçlar yaklaşık olarak aynı. Bence öyle, daha fazla nörona ve bir girdi vektörüne ihtiyacımız var, ancak öğrenene kadar uzun bir süre bekleyin.

Yakalaması gereken modeli kabaca hayal ediyorum ve özellikle farklı TF'lerden göstergeleri aldım ve çıkışlara görünüşte anlamlı bilgiler verildi.