신경망에 대한 고문, 경험 공유. - 페이지 9

 
Andrey Emelyanov :

저도 2013년에 비슷한 알고리즘을 구현하려고 했는데... 사실, 7개의 지표를 사용했고 지그재그를 사용하여 NN의 학습 벡터를 구성했습니다. 그러나 본질은 동일합니다. 저는 역포지션을 찾고 있었습니다. 지표의 데이터나 지표의 거래 신호로는 좋은 결과가 없었습니다. 우연히 패턴을 발견하기 전까지는. 내 차량을 근본적으로 변화시킨 것. 이제 내 알고리즘이 더 간단해졌습니다.

1. 작년의 분 및 시 시간대 패턴 계산

2. 전환점 사전 편집 (쌍 "분 패턴 - 시간 패턴");

3. 전환점 사전에 따라 NS 교육(150-160 쌍)

내 접근 방식의 결과는 다음과 같습니다.

내 접근 방식의 단점:

1) TS의 높은 위험 - 할인 가격의 값을 정확하게 결정할 수 없기 때문에 TS는 1, 1, 3, 6, 14, 31, 70, 158, 355의 로트가 있는 9개의 보류 주문을 배치합니다.

2) 탈출 알고리즘(TS 트롤)을 구현하기 어렵다.

따라서 NN은 거래에 사용할 수 있지만 문제는 NN을 가르치는 것입니다...

P/s: 패턴이란 A. Merrill(M & W)의 패턴을 의미합니다.

스마트 접근. 그리고 패턴은 실제 가격 델타를 고려하지 않고 매트릭스에서 막대의 위치로 간단하게 설명되었습니다. 상대 위치만?

지표 패턴을 시도할 생각이 있지만 다른 프레임으로 - 우리는 마지막 5개 지표에 대한 지표의 처음 5개 막대와 추세 분석을 위한 2개의 지표를 분석합니다 - 우리는 10 단위로 분석하고 동시에 계정 절대 변경.

지그재그에 관한 것은 합리적인 생각이지만 평평한 흔들림에서 필터링된 피크가 어떻게 추세 변화의 잘못된 점이 될 수 있습니까?

 
-Aleks- :

스마트 접근. 그리고 패턴은 실제 가격 델타를 고려하지 않고 매트릭스에서 막대의 위치로 간단하게 설명되었습니다. 상대 위치만?

지표 패턴을 시도할 생각이 있지만 다른 프레임으로 - 우리는 마지막 5개 지표에 대한 지표의 처음 5개 막대와 추세 분석을 위한 2개의 지표를 분석합니다 - 우리는 10 단위로 분석하고 동시에 계정 절대 변경.

지그재그에 관한 것은 합리적인 생각이지만 평평한 흔들림에서 필터링된 피크가 어떻게 추세 변화의 잘못된 점이 될 수 있습니까?

나는 이것을 좋아한다:

패턴 쌍만 저장 하는 동적 배열 이 있습니다(저는 사전이라고 부릅니다). 패턴 쌍이 사전에 두 번째로 입력되면 기록하지 않습니다. 더 높은 시간 프레임과 더 낮은 시간의 카운터의 두 배열 - 사전에 작성되지 않은 경우에도 패턴이 쌍 형성에 얼마나 자주 참여했는지 계산합니다.

학습 벡터의 형성은 사전에 따라 별도 패턴의 가중치 = pattern_counter / maximum_counter가 발생합니다. 저것들. 쌍의 형성에 가장 자주 관련된 패턴은 1이고 다른 패턴은 모두 1보다 작습니다. 다음은 NN을 훈련한 후 얻은 표입니다.

메인 패턴 메인 카운트 슬레이브 패턴 슬레이브 수 Sum_Multilayer_Perceptron
승2 십팔 승2 21 0.94914702
W14 십사 승2 21 0.84972197
M15 20 M15 십사 0.83269191
W1 열하나 승2 21 0.77499075
W13 승2 21 0.75006553
M15 20 M3 0.73813147
M15 20 M10 0.73812512
M15 20 M16 0.738099
W5 아홉 승2 21 0.72506739
W10 아홉 승2 21 0.72505412
M15 20 M11 아홉 0.71431236
승2 십팔 W1 열하나 0.71204136
승2 십팔 W5 열하나 0.7118911
W4 여덟 승2 21 0.70017271
승2 십팔 W4 0.68815217
승2 십팔 W7 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
승2 십팔 W13 여덟 0.64045346
M3 12 M15 십사 0.63254238
W9 5 승2 21 0.62522345
W3 5 승2 21 0.62509623
W7 5 승2 21 0.62505511
M15 20 M12 5 0.61917222
M15 20 M8 5 0.6191331
W14 십사 W1 열하나 0.61210667
W6 4 승2 21 0.60012943
승2 십팔 W14 6 0.59301682

NS 구조: 입력에 64개의 뉴런, 4개의 내부, 1개의 출력. 저것들. 하나의 입력 뉴런은 하나의 패턴을 설명합니다. 그리드는 40-50분 안에 훈련되며 NN 오류는 0.00001을 초과하지 않습니다.

따라서 사전에 사전에 없었더라도 패턴 쌍의 중요성을 예측할 수 있는 모델이 있습니다.

저는 오랫동안 플랫과 거짓 피크로 고민해왔지만 ZigZaga 계산 수준입니다. 표준 지그재그 코드를 약간 변경했습니다. 즉, 이를 기반으로 백분율 ZZ를 구현했습니다. 지금까지 필요한 코드는 다음과 같습니다.

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 - ZigZag 계산을 위한 클래스...

파일:
MyCExtremum.mqh  37 kb
 
-Aleks- :

똑똑한 접근. 그리고 패턴은 실제 가격 델타를 고려하지 않고 매트릭스에서 막대의 위치로 간단하게 설명되었습니다. 상대 위치만?

지표 패턴을 시도할 생각이 있지만 다른 프레임으로 - 우리는 마지막 5개 지표에 대한 지표의 처음 5개 막대와 추세 분석을 위한 2개의 지표를 분석합니다 - 우리는 10 단위로 분석하고 동시에 계정 절대 변경.

지그재그에 관한 것은 합리적인 생각이지만 평평한 흔들림에서 필터링된 피크가 어떻게 추세 변화의 잘못된 점이 될 수 있습니까?

패턴을 사용하는 지표 분석에 관해서는, 이것은 매우 흥미롭습니다 ... 지표에 더 적은 노이즈가 있다고 생각하지만 일부는 "낮은 노이즈"를 억제하고 다른 일부는 "높은 노이즈"를 억제하도록 지표를 선택해야 합니다. 그러면 다음을 얻을 수 있습니다. 멀티 필터.
 

Andrey Emelyanov :

NS 구조: 입력에 64개의 뉴런, 4개의 내부, 1개의 출력. 저것들. 하나의 입력 뉴런은 하나의 패턴을 설명합니다.

이 모델로 결과를 원하십니까? 내부 레이어는 분류기가 아니라 중간 압축기 역할을 합니다.
 
Andrey Emelyanov :

나는 이것을 좋아한다:

패턴 쌍만 저장 하는 동적 배열 이 있습니다(저는 사전이라고 부릅니다). 패턴 쌍이 사전에 두 번째로 입력되면 기록하지 않습니다. 더 높은 시간 프레임과 더 낮은 시간의 카운터의 두 배열 - 사전에 작성되지 않은 경우에도 패턴이 쌍 형성에 얼마나 자주 참여했는지 계산합니다.

학습 벡터의 형성은 사전에 따라 별도 패턴의 가중치 = pattern_counter / maximum_counter가 발생합니다. 저것들. 쌍의 형성에 가장 자주 관련된 패턴은 1이고 다른 패턴은 모두 1보다 작습니다. 다음은 NN을 훈련한 후 얻은 표입니다.

메인 패턴 메인 카운트 슬레이브 패턴 슬레이브 수 Sum_Multilayer_Perceptron
승2 십팔 승2 21 0.94914702
W14 십사 승2 21 0.84972197
M15 20 M15 십사 0.83269191
W1 열하나 승2 21 0.77499075
W13 승2 21 0.75006553
M15 20 M3 0.73813147
M15 20 M10 0.73812512
M15 20 M16 0.738099
W5 아홉 승2 21 0.72506739
W10 아홉 승2 21 0.72505412
M15 20 M11 아홉 0.71431236
승2 십팔 W1 열하나 0.71204136
승2 십팔 W5 열하나 0.7118911
W4 여덟 승2 21 0.70017271
승2 십팔 W4 0.68815217
승2 십팔 W7 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
승2 십팔 W13 여덟 0.64045346
M3 12 M15 십사 0.63254238
W9 5 승2 21 0.62522345
W3 5 승2 21 0.62509623
W7 5 승2 21 0.62505511
M15 20 M12 5 0.61917222
M15 20 M8 5 0.6191331
W14 십사 W1 열하나 0.61210667
W6 4 승2 21 0.60012943
승2 십팔 W14 6 0.59301682

NS 구조: 입력에 64개의 뉴런, 4개의 내부, 1개의 출력. 저것들. 하나의 입력 뉴런은 하나의 패턴을 설명합니다. 그리드는 40-50분 안에 훈련되며 NN 오류는 0.00001을 초과하지 않습니다.

따라서 사전에 사전에 없었더라도 패턴 쌍의 중요성을 예측할 수 있는 모델이 있습니다.

저는 오랫동안 플랫과 거짓 피크로 고민해왔지만 ZigZaga 계산 수준입니다. 표준 지그재그 코드를 약간 변경했습니다. 즉, 이를 기반으로 백분율 ZZ를 구현했습니다. 지금까지 필요한 코드는 다음과 같습니다.

어레이에 대한 흥미로운 솔루션입니다. 쌍/기간 사이에 통계에 차이가 있습니까? 긍정적인 예측 결과를 제공하는 패턴 발생 빈도의 변동성의 안정성은 무엇입니까?

지그재그에 관해서도 백분율 솔루션이 있지만 더 깊은 기록을 사용하여 참조 지그재그 세그먼트를 계산하고 다른 사람들의 변화를 백분율로 비교합니다.

 
Andrey Emelyanov :
패턴을 사용하는 지표 분석에 관해서는, 이것은 매우 흥미롭습니다 ... 지표에 더 적은 노이즈가 있다고 생각하지만 일부는 "낮은 노이즈"를 억제하고 다른 일부는 "높은 노이즈"를 억제하도록 지표를 선택해야 합니다. 그러면 다음을 얻을 수 있습니다. 멀티 필터.
다양한 지표가 있습니다. 나는 표준 오실레이터(및 무이자에 대한 유사성)를 실험했고, 모두에서 수익을 올릴 수 있었습니다. 모두 설정에 따라 다릅니다... 유일한 질문은 이것이 우연인지 패턴인지 여부입니다.
 
Комбинатор :
이 모델로 결과를 원하십니까? 내부 레이어는 분류기가 아니라 중간 압축기 역할을 합니다.
그래서 압축이 필요합니다... 64개의 입력 중 (현재 막대에서) 한 시점에서 2개의 입력만 0이 아닙니다... 그리고 네트워크의 작업은 구매/판매로 나누는 것이 아니라 주어진 입력에 대한 반동 확률을 측정합니다. 아니면 내가 그런 말을 하지 않는 걸까?
 
-Aleks- :

어레이에 대한 흥미로운 솔루션입니다. 쌍/기간 사이에 통계에 차이가 있습니까? 긍정적인 예측 결과를 제공하는 패턴 발생 빈도의 변동성의 안정성은 무엇입니까?

지그재그에 관해서도 백분율 솔루션이 있지만 더 깊은 기록을 사용하여 참조 지그재그 세그먼트를 계산하고 다른 사람들의 변화를 백분율로 비교합니다.

모두가 알다시피 A. Merrill의 패턴은 패턴이 더 발전할지(추세 유지) 다른 패턴으로 이동할지(가격 반등) 정확한 답을 제공하지 않습니다. 그래서 1시간 1분이라는 2개의 시간을 이용하여 답을 찾기로 했습니다. 나는 쌍의 빈도에 대한 통계를 수집하고, 지금까지 나는 보편적인 학습 사전이 없습니다. 그러나 나는 이 연결이... 그렇지 않으면 나비, 박쥐 등의 조화로운 패턴이 없을 것이라고 확신합니다.
 
Andrey Emelyanov :
모두가 알다시피 A. Merrill의 패턴은 패턴이 더 발전할지(추세 유지) 다른 패턴으로 이동할지(가격 반등) 정확한 답을 제공하지 않습니다. 그래서 1시간 1분이라는 2개의 시간을 이용하여 답을 찾기로 했습니다. 나는 쌍의 빈도에 대한 통계를 수집하고, 지금까지 나는 보편적인 학습 사전이 없습니다. 그러나 나는 이 연결이... 그렇지 않으면 나비, 박쥐 등의 조화로운 패턴이 없을 것이라고 확신합니다.
사람이 시각적으로 "나비, 박쥐 등"으로 인식하는 모델. 인간의 뇌에서만 태어날 뿐 아니라 내 생각에 이 요소를 고려해야 합니다. 뇌에 필수적인 것과 인식하지 못하는 것을 이해하려면 이 주제에 대한 인지 심리학을 연구해야 합니다. 패턴, 즉 어떤 오류가 허용되고 어떤 오류가 허용되지 않습니다. 뇌는 종종 자신이 볼 것으로 기대하는 것을 자체적으로 그립니다. 패턴의 사전은 제한되어 있습니다. 즉, 유사한 양초 조합을 단일 그림에 넣습니다. 자신이 보는 것을 설명하기 위해 정확한 수학적 모델을 사용하지 않습니다.
 

우리 아기는 여전히 멍청하지만 이미 뭔가를 알고 있습니다. 입력에 8개의 표시기, 1개의 출력에 1개, 덮인 레이어에 15개의 뉴런. 2000 입력 벡터, 10000 훈련 에포크.

일반적으로 이것은 이미 3 또는 4이며 모든 결과가 거의 동일합니다. 제 생각에는 더 많은 뉴런과 입력 벡터가 필요하지만 학습할 때까지 오랜 시간을 기다려야 합니다.

나는 그녀가 잡아야 할 패턴을 대략적으로 상상하고 다른 TF에서 지표를 특별히 집어 들었고 겉보기에 의미있는 정보가 출구로 제공되었습니다.