トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 1064

 
マキシム・ドミトリエフスキー:

まだ誤差の大きいモデルが多いため^)、長く使えるモデルが必要です。

例えば、2ヶ月の学習と1週間の取引

その通りかもしれませんが、「ALPHA ZERO」アルゴのようなランダムキャンドルシミュレーションが無制限にできるようになるまで、RDFで1日でも機能するようなモデルが発見されるとは思えません。

なぜなら、市場はほぼ1時間ごとに変化しており、突然のニュースイベントや何らかの理由で市場の動きが変わると、1つのモデルは恐ろしく失敗してしまうからです。しかし、何百万回ものローソク足シミュレーションを行っていれば、おそらく相場が変わったときに最小限の損失で回復でき、その後の損失もすぐに取り戻せるシステムになっているのではないでしょうか。それは可能だと思われます。

あなたのモデル選択方法と私のキャンドルシミュレーション方法の両方を試してみて、すべてがどうなるか見てみたいと思います:))

ちなみに、1日トレーニング、5日トレーニングなどを試しましたが、翌日には失敗してしまいました:)))))))))))))))))))))))))))))))))))))))))))))))))))))))

だから、1つのモデルでうまくいかないこともある...私の勘違いかもしれないけれど...。

 

あと、もうひとつだけマキシムの要望を...。

記事を公開するときは、なるべくコードをコメント するようにして、他の人がすぐに理解できるようにすると、より早く進歩できるのでは...と思います。

そうでなければ、私がコードを理解するのに長い時間がかかるとしたら、それを修正するのにさらに時間がかかるでしょう。

そこで、できるだけ多くのコメントやコードの解説を付けていただくようお願いします。とりあえず早く理解して、わからないことがあれば質問させていただきます:))

削除済み  
FxTrader562 です。

あと、もうひとつだけマキシムの要望を...。

記事を公開するときは、なるべくコードをコメントするようにして、他の人がすぐに理解できるようにすると、より早く進歩できるのでは...と思います。

そうでなければ、私がコードを理解するのに長い時間がかかるとしたら、それを修正するのにさらに時間がかかるでしょう。

そこで、できるだけ多くのコメントやコードの解説を付けていただくようお願いします。とりあえず早く理解して、わからないことがあれば質問させていただきます:))

OK、今、私はちょうど絶えず多くのものを変更し、それをコメントする意味がない。

また、出力を変更する方法を考えることもできます。リワード機能の 代わりに、ジグザグを別の設定で使うとか。
 
マキシム・ドミトリエフスキー

OK、今、私はちょうど絶えず多くのものを変更し、それをコメントする意味がない。

また、出力を変更する方法を考えることもできます。リワード機能の 代わりに、ジグザグを別の設定で使うとか。

コードをざっと見ただけですが。しかし、今まで、どこに指標があるのか、どのようにトレードのエントリーを決定しているのか、正確に把握できていません。そのため、出力をどうしたらいいのか分からない。GDMHを使った出力ということですか?

ただ、いろいろな設定でテストを実行していますが、完全にランダムなトレードを配置するようです。

また、テスト段階では「Mtrees」テキストファイルは作成されませんよね?

つまり、あなたが提供したコードは完全なものではないのですね?それとも、最適化せずにチャートに直接貼り付ければ、トレードを行うことができるのでしょうか?

削除済み  
FxTrader562 です。

コードをざっと見ただけですが。しかし、今までのところ、どこに指標があるのか、どのようにトレードのエントリーを決定しているのか、正確にはわかっていないのです。そのため、出力をどうしたらいいのか分からない。

ただ、いろいろな設定でテストを実行したのですが、おかしな挙動を示したため、サーバーを再起動したところ、完全にランダムトレードを行うようです。VPSの実カーネルと何か関係があるのでしょうか?

また、テスト段階では「Mtrees」というテキストファイルは作成されませんよね?

テスターで最初に実行するときは、"true "を選択します。

彼はランダムな取引を行い、その時に学習し、モデルを保存します。

2本目はfalseを選択。それだけです。そして、彼はモデルをアップロードし、+で交換します。

次にEAでエージェントを追加し、5つのエージェント、各エージェントに100の機能、50のツリーを追加します。

CRLAgents *ag1=new CRLAgents("RlExp1iter",5,100,50,regularize,learn);

この関数では、各エージェントの終値を100個(100個の予測値)追加します。そして、データを正規化する。例えば、最初の50の特徴 - 終値、次の25のrsi、次の25のadxなど、異なる指標を追加したり、エージェントを宣言するときに予測変数の数を変更したりすることができます。

void calcSignal()
  {
   sig1=0;
       
   for(int i=0;i<ArraySize(ag1.agent);i++) - the agents are stored in "ag1.agent" array. We have 5 agents, so array size is 5
     {   
      CopyClose(_Symbol,0,0,100,ag1.agent[i].inpVector); - for each agent from array (now we have 5 agents) fill predictors (100 close prices). For each feature we fill a single value
      normalizeArrays(ag1.agent[i].inpVector);
     }
   sig1=ag1.getTradeSignal(); this function return averaged signal for all agents
  }

各取引の後、彼はポリシーを更新し、取引が終了したとき - 報酬(TD、時間差RL)を更新します。

void placeOrders()
  {
   if(countOrders(0)!=0 || countOrders(1)!=0)
     {
      for(int b=OrdersTotal()-1; b>=0; b--)
         if(OrderSelect(b,SELECT_BY_POS)==true)
            switch(OrderType())
              {
               case OP_BUY:
                  if(sig1>0.5)
                  if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red))
                     ag1.updateRewards();

                  break;

               case OP_SELL:
                  if(sig1<0.5)
                  if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red))
                     ag1.updateRewards();

                  break;
              }
      return;
     }

   if(sig1<0.5 && (OrderSend(Symbol(),OP_BUY,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_ASK),0,0,0,NULL,OrderMagic,INT_MIN)>0))
     {
      ag1.updatePolicies(sig1);
     }

   else if(sig1>0.5 && (OrderSend(Symbol(),OP_SELL,lotsOptimized(),SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0,0,NULL,OrderMagic,INT_MIN)>0))
     {
      ag1.updatePolicies(sig1);
     }

本当に簡単なライブラリの使い方

トレインモードでは、各反復のエラーとログを表示します。

2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 40 passed with errors: 0.2422178988326848  0.5097276264591439
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 41 passed with errors: 0.2295719844357977  0.4824902723735409
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 42 passed with errors: 0.2558365758754864  0.4961089494163424
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 43 passed with errors: 0.2422178988326848  0.4863813229571984
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 44 passed with errors: 0.2422178988326848  0.4766536964980545
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 45 passed with errors: 0.245136186770428  0.5379377431906615
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 46 passed with errors: 0.2587548638132296  0.4912451361867704
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 47 passed with errors: 0.2480544747081712  0.4776264591439689
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 48 passed with errors: 0.2636186770428016  0.5009727626459144
2018.09.16 01:33:27.319 2018.09.13 23:59:59   Agent 5 Model 49 passed with errors: 0.2616731517509728  0.490272373540856

テスターのトレードモードでは、各エージェントのトレーニングおよびテストサブセットでの最終的な誤差を表示します。

2018.09.16 01:34:18.107 2018.09.13 23:59:59   RlExp1iter TRAIN LOGLOSS
2018.09.16 01:34:18.107 2018.09.13 23:59:59   0.23249 0.22763 0.24222 0.24125 0.24416
2018.09.16 01:34:18.107 2018.09.13 23:59:59   RlExp1iter OOB LOGLOSS
2018.09.16 01:34:18.107 2018.09.13 23:59:59   0.46790 0.46887 0.46498 0.46790 0.47471

終値100の場合の結果です。


 
マキシム・ドミトリエフスキー

テスターで最初に実行するときは、"true "を選択します。

彼はランダムな取引を行い、その時に学習し、モデルを保存します。

2本目は偽を選択。それだけです。そして、彼はモデルをアップロードし、+を下取りに出す。

次にEAでエージェントを追加し、5つのエージェント、各エージェントに100の機能、50のツリーを追加します。

この関数では、各エージェントの終値を100個(100個の予測値)追加します。そして、データを正規化する。例えば、最初の50の特徴 - 終値、次の25のrsi、次の25のadxなど、異なる指標を追加したり、エージェントを宣言するときに予測変数の数を変更したりすることができます。

各取引の後、彼はポリシーを更新し、取引が終了したとき - 報酬(TD、時間差RL)を更新します。

シンプルなライブラリの使い方

そうですね、これはとてもシンプルであると同時に堅牢に見えますね...実験して見ましょう...素晴らしい仕事です!!!!

では、GDMHはどこに使われているのでしょうか?

私のGDMHのコードを書こうと思っていたのです。RDFの入力と出力が行われているコードや、GDMHを実装しようとしている箇所を教えていただければ、私のコードを書いてみて、あなたのコードと私のコードの結果を比較して、評価することができます。

削除済み  
FxTrader562 です。

そうですね、これはとてもシンプルであると同時に堅牢なようです。実験して見ましょう。

では、GDMHはどこに使われているのでしょうか?

私のGDMHのコードを書こうと思っていたのです。RDFの入力と出力が行われているコードや、GDMHを実装しようとしている箇所を教えていただければ、私のコードを書いてみて、あなたのコードと私のコードの結果を比較して、評価することができます。

ここでは、単純なカーネル CRLAgent::kernelizedMatrix(void) (in library) を使用しているので、この関数を gdmh 用に変更する必要があります。

 
マキシム・ドミトリエフスキー

ここでは、単純なカーネル CRLAgent::kernelizedMatrix(void) (in library) を使用しているので、この関数を gdmh 用に変更する必要があります。

よし、自分でコードを書いてみようか...。

GDMHのロジックだけであれば、GDMHアルゴをMQL5のコードに翻訳・変換するのは簡単ですが、他のカーネル関数やライブラリが関係する場合は、勉強して変換する時間が必要です......。

削除済み  
FxTrader562 です。

もう一つの特徴:各エージェントを委員会で設定することができる

CRLAgents *ag1=new CRLAgents("RlExp1iter",5,100,50,regularize,learn);
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ag1.setAgentSettings(0,100,50,0.1); for each agent you can set number of features, number of trees and r setting, individually
   ag1.setAgentSettings(1,50,50,0.2);
   ag1.setAgentSettings(2,30,50,0.05);
   ag1.setAgentSettings(3,20,50,0.1);
   ag1.setAgentSettings(4,10,50,0.05);
//---
   return(INIT_SUCCEEDED);
  }

予測値の記入は、ここを変更するだけです。

void calcSignal()
  {
   sig1=0;
       
   for(int i=0;i<ArraySize(ag1.agent);i++)
     {   
      CopyClose(_Symbol,0,0,ArraySize(ag1.agent[i].inpVector),ag1.agent[i].inpVector);
      Print(ArraySize(ag1.agent[i].inpVector));
      normalizeArrays(ag1.agent[i].inpVector);
     }
   sig1=ag1.getTradeSignal();
  }

また、異なるグループのエージェントを追加することができます

CRLAgents *ag1=new CRLAgents("RlExp1iter1",5,100,50,regularize,learn);
CRLAgents *ag2=new CRLAgents("RlExp1iter2",1,20,50,regularize,learn);
CRLAgents *ag3=new CRLAgents("RlExp1iter3",18,5,50,regularize,learn);

削除済み  
FxTrader562 です。

よし、自分でコードを書いてみようか...。

GDMHのロジックだけであれば、GDMHアルゴをMQL5のコードに翻訳・変換するのは簡単ですが、他のカーネル関数やライブラリが関係してくると、勉強と変換に時間がかかりますね......。

gmdhのロジックを変換していただければ、私のライブラリ用に変更することができますので、大変助かります。