ニューラルネットワークのアドバイザー、経験を共有する。 - ページ 9

 
Andrey Emelyanov:

私も2013年に似たようなアルゴリズムを実装してみたのですが...。しかし、7つのインディケータを使い、ZigzagはNSのトレーニングのためのベクトルを形成するために使用されました。でも、本質は同じで、逆位置を探していたんです...。Zigzagを使い始めた頃は、インジケーターのデータや売買シグナルに縁がありませんでした。偶然にもいくつかのパターンに出会うまでは。それが、私のTSを根本から変えてしまったのです。これで、私のアルゴリズムはもっとシンプルになりました。

1.分単位、時間単位で、過去1年間のパターンを計算する。

2.ターニングポイントの辞書を作る(「分パターン-時間パターン」のペア)。

3.ティッピングポイント辞書を使ったNSの指導(150~160組について)。

これが私のアプローチの結果です。

私のやり方のデメリットに

1) TSの高リスク - ブレークプライスの正確な値を決定することができないため、TSはロットで9つの保留注文を配置します。1, 1, 3, 6, 14, 31, 70, 158, 355;

2) 出口アルゴリズム(トロールTS)の実装が困難である。

だからNSはトレードに使える。ただ、問題はNSに何を教えるかだ...。

P/S:パターンとは、A.メリルのパターン(M&W)のことです。

スマートなアプローチですね。そして、パターンは、実際の価格差分を考慮することなく、マトリックス内のバーの位置として、単純に記述された - 相対的な位置のみ?

私はパターンの指標をしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10の増分で分析し、アカウントの絶対的な変化を取ります。

ジグザグはスマートなアイデアですが、トレンドの変化の誤ったポイントである可能性のあるフラットなウォブルから、ピークはどのようにフィルタリングするのでしょうか?

 
-Aleks-:

理にかなったアプローチ。そして、実際の価格差は考慮せず、マトリックス内のバーの位置として単純に記述されたパターン - 相対的な位置だけですか?

私はパターンの指標をしようとするが、別のフレームで、アイデアを持っている - 最初の5つのバー我々は最後の5つの指標、およびトレンド分析のための2つの指標に指標を分析する - 我々は10のステップで分析し、同時にアカウントに絶対的な変化を取ります。

ジグザグについてはスマートなアイデアですが、フラットなウォブルからフィルターを通したピークが、トレンド変化の偽のポイントになる可能性は?

私はこの方法でやっています。

パターンのペアだけを格納する動的配列(私はこれを辞書と呼んでいます)と、シニアタイムフレームとジュニアの2つのカウンター配列があり、これらは辞書に書き込まれていなくても、パターンがペアを形成するのに何回関与したかをカウントします。

学習ベクトルは辞書に従って形成され、個々のパターンの重み=pattern_counter / maximum_counterとなる。つまり、ペア形成に多く参加するパターンを1とし、それ以外のパターンは1未満とする。NSを教えた後に得られるテーブルです。

メインパターン メインカウント スレーブパターン スレーブカウント 多層パーセプトロンの和
W2 18 W2 21 0.94914702
W14 14 W2 21 0.84972197
M15 20 M15 14 0.83269191
W1 11 W2 21 0.77499075
W13 10 W2 21 0.75006553
M15 20 M3 10 0.73813147
M15 20 M10 10 0.73812512
M15 20 M16 10 0.738099
W5 9 W2 21 0.72506739
W10 9 W2 21 0.72505412
M15 20 M11 9 0.71431236
W2 18 W1 11 0.71204136
W2 18 W5 11 0.7118911
W4 8 W2 21 0.70017271
W2 18 W4 10 0.68815217
W2 18 W7 10 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
W2 18 W13 8 0.64045346
M3 12 M15 14 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 14 W1 11 0.61210667
W6 4 W2 21 0.60012943
W2 18 W14 6 0.59301682

NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。グリッドの学習には40〜50分かかり、NSの誤差は0.00001を超えない。

こうして私は、以前は辞書に載っていなかったパターンでも、そのペアの意味を予測できるモデルを手に入れたのです。

ずっとフラットピークとフォルスピークに悩まされてきましたが、ジグザグ計算のレベルでやっています。標準的なジグザグのコードを少し修正し、それをベースに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個。つまり、1つの入力ニューロンが1つのパターンを記述する。

このモデルで結果を出すことを期待しているのでしょうか?インナーレイヤーは、分類器ではなく、中間圧縮機として機能します。
 
Andrey Emelyanov:

私は次のようなことをしています。

パターンのペアだけを格納する動的配列(私はこれを辞書と呼んでいます)があり、パターンのペアが2回目に辞書に入った場合はそれを書き留めません。

学習ベクトルは辞書に従って形成され、個々のパターンの重み=pattern_counter / maximum_counterとなる。つまり、ペア形成に多く参加するパターンを1とし、それ以外のパターンは1未満とする。NSを教えた後に得られるテーブルです。

メインパターン メインカウント スレーブパターン スレーブカウント 多層パーセプトロンの和
W2 18 W2 21 0.94914702
W14 14 W2 21 0.84972197
M15 20 M15 14 0.83269191
W1 11 W2 21 0.77499075
W13 10 W2 21 0.75006553
M15 20 M3 10 0.73813147
M15 20 M10 10 0.73812512
M15 20 M16 10 0.738099
W5 9 W2 21 0.72506739
W10 9 W2 21 0.72505412
M15 20 M11 9 0.71431236
W2 18 W1 11 0.71204136
W2 18 W5 11 0.7118911
W4 8 W2 21 0.70017271
W2 18 W4 10 0.68815217
W2 18 W7 10 0.68802818
M15 20 M7 7 0.66682395
M15 20 M14 6 0.64291215
W2 18 W13 8 0.64045346
M3 12 M15 14 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 14 W1 11 0.61210667
W6 4 W2 21 0.60012943
W2 18 W14 6 0.59301682

NSの構造:入力ニューロン64個、内部ニューロン4個、出力1個。つまり、1つの入力ニューロンが1つのパターンを記述する。グリッドの学習には40〜50分かかり、NSの誤差は0.00001を超えない。

こうして私は、以前は辞書に載っていなかったパターンでも、そのペアの意味を予測できるモデルを手に入れたのです。

ずっとフラットピークとフォルスピークに悩まされてきましたが、ジグザグ計算のレベルでやっています。標準的なジグザグのコードを少し修正し、それをベースにZZパーセントを実装しました。今のところ、だいたい次のようなコードになっています。

アレイは面白い解決策ですね。ペア/期間間で統計値に違いはあるか、ポジティブな予測結果を与えるパターンの出現頻度のばらつきは一般にどの程度安定しているか。

ジグザグについては、私もパーセントで解決していますが、さらに深い履歴でジグザグの基準区間を算出し、それに対して他の人の変化率を比較するようにしています。

 
Andrey Emelyanov:
パターンで指標を分析することについては、非常に興味深いですね......。インジケーターの方がノイズは少ないと思いますが、一方は「低いノイズ」、もう一方は「高いノイズ」を抑制するようにインジケーターを選択しないと、マルチフィルターになってしまいます。
さまざまな指標があります。私は標準的なオシレーター(とその類の無利子)を使って実験し、そのすべてで利益を上げることに成功しました - それはすべて設定次第です...。ランダムか規則性かの問題だけです。
 
Комбинатор:
このモデルで結果を出すことを期待しているのでしょうか?インナーレイヤーは、分類器ではなく、中間圧縮機として機能します。
これが必要な圧縮なんだ...。ある時点(現在のバー)で、64の入力のうち、0でない入力は2つだけです...で、ネットワークのタスクは、買い/売りで分けることではなく、与えられた入力でバウンドする確率がどのくらいかを測定することです。それとも私の推理がおかしいのでしょうか?
 
-Aleks-:

アレイは面白い解決策ですね。予測結果が正となるパターン出現頻度変動の安定性は一般的にどうなのか、ペア/期間間の統計量の差はあるのか?

ジグザグについては、私もパーセントで解決していますが、さらに深い履歴でジグザグの基準区間を算出し、それに対して他の人の変化率を比較するようにしています。

周知のように、A.メリルのパターンは、そのパターンがさらに発展(トレンドの維持)するか、別のパターンに変化(価格の反発)するかについて、正確な答えを与えるものではありません。そこで、1時間と1分という2つの時間軸で答えを探すことにしたのです。私はペアの再発の統計をとっており、普遍的なトレーニング辞書はまだ持っていません。でも、このつながりはきっとあるはず......。そうでなければ、蝶やコウモリなど、調和のとれた模様は生まれない。
 
Andrey Emelyanov:
周知のように、A.メリルのパターンは、そのパターンがさらに発展(トレンドの維持)するか、別のパターンに変化(価格の反発)するかについて、正確な答えを与えるものではありません。そこで、1時間と1分という2つの時間軸で答えを探すことにしたのです。私はペアの再発の統計をとっており、普遍的なトレーニング辞書はまだ持っていません。でも、このつながりはきっとあるはず......。そうでなければ、蝶やコウモリなど、調和の取れたモデルは存在しないでしょう。
蝶やコウモリなど、人間が視覚的に認識するモデルは、人間の脳の中でしか生まれないものであり、この要素を考えるには、このテーマで認知心理学を学び、パターン認識において脳にとって何が必須で何が不要なのか、つまり、どんな誤差が許され、何が許されないのかを理解する必要があると考えている。脳のパターン語彙は限られているので、ローソク足の似たような組み合わせを一つの絵の中に入れてしまうのです。つまり、見たものを表現するのに、正確な数学的モデルを使わないのです。
 

うちの子はまだおぼつかないけど、なんとかなりそう...。入力指標8個、出力1個、被覆層15ニューロン。2000入力ベクトル、10000学習エポック。

実はこれで3回目か4回目なのですが、どれもほとんど同じ結果になっています。ニューロンや入力ベクトルを増やせばいいのだろうが、学習に時間がかかる。

拾うべきパターンのおおよその見当はついており、異なる時間枠から指標を選択し、出力は意味のある情報を持っているようです。