English Русский 中文 Español Deutsch Português
preview
ニューラルネットワークが簡単に(第40回):大量のデータでGo-Exploreを使用する

ニューラルネットワークが簡単に(第40回):大量のデータでGo-Exploreを使用する

MetaTrader 5エキスパートアドバイザー | 21 11月 2023, 09:10
222 0
Dmitriy Gizlyk
Dmitriy Gizlyk

はじめに

前回の記事「ニューラルネットワークが簡単に(第39回):Go-Explore、探索への異なるアプローチ」では、Go-Exploreアルゴリズムとその環境探索能力について学びました。覚えていらっしゃるかもしれませんが、アルゴリズムには2つの段階があります。

  • 第1段階:探検
  • 第2段階:例を用いた方策の訓練

第1段階では、環境の全体像をできるだけ完全に把握するため、ランダムな行動選択をおこないました。このアプローチにより、1暦月の間に過去のデータでエージェントを訓練するのに十分な例データベースを収集することができました。構築したモデルで、訓練セットで利益を上げる戦略を見つけることができました。

しかし、1暦月という期間は、データを要約し、予測可能な将来に利益を上げられる戦略を構築するには短すぎます。その結果、戦略を見つけるためには、訓練期間を長くせざるを得なくなります。訓練期間を3カ月に延長したところ、ランダムな行動選択を使っても、一度も利益の出るパスがないことがわかりました。

研修期間延長 パスの結果

確率論によれば、これは完全に予想された結果です。結局のところ、全事象の確率は、その構成要素すべての確率の積に等しいのですが、個々の事象の確率は1未満であるため、ステップ数が増加するにつれて、有益なパスを得られる確率は減少します。

さらに、訓練期間が長くなるにつれて、エージェントの学習結果に影響を与えるような環境の変化があるかもしれません。したがって、エージェントのパフォーマンスを定期的に監視し、中間段階でそのパフォーマンスを分析することが重要です。

より長い期間にわたって訓練結果を改善するために、Go-Exploreアルゴリズムに様々な最適化手法を適用することができます。このアプローチは、タスクのより広い文脈を考慮し、エージェントがより多くの情報に基づいた意思決定をおこなえるようにするものでなければなりません。

この記事では、より長い訓練期間における効率を向上させるために、Go-Exploreアルゴリズムの可能な最適化方法を詳しく見ていきます。


1.訓練期間が長くなるにつれ、Go-Exploreを使用することが難しくなる

Go-Exploreアルゴリズムの訓練期間が長くなるにつれ、ある困難が生じます。その一部を紹介します。

  1. 次元の呪い:訓練期間が長くなるにつれて、エージェントが訪問できる状態の数は指数関数的に増加し、最適な戦略を見つけることが難しくなります。

  2. 環境の変化:訓練期間が長くなるにつれて、エージェントの学習結果に影響を与えるような環境の変化が起こるかもしれません。これによって、以前は成功していた戦略が効果がなくなったり、不可能になることさえあります。

  3. 行動の選択が難しい:訓練期間が長くなるにつれて、エージェントは、情報に基づいた意思決定をおこなうために、タスクのより広い文脈を考慮する必要があるかもしれません。これによって、最適な行動を選択するタスクが複雑になり、アルゴリズムを最適化するために、より複雑な方法が必要となる可能性があります。

  4. 訓練時間の増加:訓練期間が長くなると、十分なデータを集めてモデルを訓練するのに必要な時間も長くなります。これは、エージェントの訓練の効率とスピードを低下させる可能性があります。

訓練期間が長くなると、探索すべき状態空間の次元が大きくなるという問題が生じる可能性があります。これは、可能な状態の数が次元の増加とともに指数関数的に増加する「次元の呪い」問題につながる可能性があり、状態空間の探索を困難にし、アルゴリズムが無関係な状態の探索に多くの時間を費やす原因となります。

この問題を解決するために、例えばPCAのような次元削減技術を使用することができます。データ構造に関する情報を維持したまま、状態空間の次元を小さくすることができます。また、状態空間の次元を減らし、問題の最も関連性の高い側面に焦点を当てるために、重要な特徴選択技術を使うこともできます。

さらに、進化的アルゴリズムや遺伝的アルゴリズムに基づく最適化など、大規模な状態空間での最適解探索を可能にする手法も利用できます。これらの手法により、エージェントの行動に関する様々なオプションを探索し、与えられたタスクに対して最適なソリューションを選択することができます。

行動選択には、信頼度ベースの探索手法など、さまざまなアプローチを用いることができます。この手法では、エージェントは、報酬を受け取る確率だけでなく、タスクに関する知識の信頼度も考慮して、状態空間の新しい領域を探索することができます。これにより、局所最適解にはまり込む問題を回避し、状態空間をより効率的に探索することができます。

強化学習(RL)のデモンストレーションでは、通常、コンピュータゲームや、時間の経過とともに変化しない人工的にシミュレートされた環境を使用します。しかし、実世界のアプリケーションでは、時間が経つにつれて環境が変化し、エージェントの学習結果に影響を与える可能性があります。

過去のデータを取得するための環境探索ステップを含むGo-Exploreアルゴリズムを使用する場合、環境の変化は、その後エージェントが過去のデータに基づいて訓練されたときに、予期しない結果につながる可能性があります。

例えば、エージェントが数か月間データに基づいて訓練され、その間にゲームルールの変更や新しいオブジェクトの出現などの環境の変化があった場合、エージェントは新しい環境に対応できず、それまで成功していた戦略が効かなくなったり、不可能になったりする可能性があります。

環境の変化がエージェントの訓練結果に与える影響を軽減するためには、エージェントの訓練期間中、定期的に環境を監視し、その変化を分析する必要があります。環境に大きな変化が検出された場合、更新されたデータとアルゴリズムを用いてエージェントの訓練プロセスを再開する必要があります。

また、モデルベースの強化学習(RL)手法のように、訓練中の環境の変化を考慮した訓練手法を用いることもできます。この手法では、環境のモデルを構築し、それを用いて将来の状態や報酬を予測します。これにより、エージェントは環境の変化に適応し、より多くの情報に基づいた意思決定をおこなうことができます。

アルゴリズムのハイパーパラメータを変更したり、より効率的に訓練するためにアルゴリズム自体に変更を加えるなど、他の最適化技術を使用することもできます。

一般的に、Go-Exploreアルゴリズムを使用してエージェントを長期間訓練することは非常に複雑であり、多くの技術的な解決策や改善が必要となります。

その結果、Go-Exploreアルゴリズムの使用は非常に複雑になり、多くの技術的解決策や改良が必要になります。Go-Exploreアルゴリズムは、複雑な環境を探索し、多数の状態と行動を持つタスクでエージェントを訓練するための強力なツールです。しかし、訓練期間が長くなったり、タスクの条件が変わったりすると、その効果は低下する可能性があります。そのため、最良の結果を得るためには、さまざまな最適化手法やパラメータチューニングを用いる必要があります。これは非常に有益で有望な研究の方向性となるでしょう。


2.アプローチを最適化するためのオプション

上で述べたことを考慮すると、訓練期間を延長するには、ストラテジーテスターで新しい日付を指定し、追加の過去のデータを読み込むだけでなく、より慎重なアプローチが必要です。実際の取引戦略を作成するには、できるだけ多くの過去のデータでモデルを訓練する必要があります。このアプローチによってのみ、将来的に利益を生み出せるモデルを作ることができます。

この記事では、モデルを複雑にはしません。その代わりに、Go-Exploreアルゴリズムを使用したモデル訓練のために、過去のデータの深さを広げるのに役立ついくつかの簡単なアプローチを使用します。

以前に作成したアルゴリズムを最適化する前に、そのボトルネックを分析する必要があります。

最初のステップは、セル構造の定数を変更することです。この構造体は、システムの個別の状態と、その経路を保存するために使われます。技術的な理由により、この構造では静的配列のみを使用せざるを得ません。モデルの訓練期間が長くなるにつれて、記述された状態を達成するためのパスのサイズも大きくなります。配列のサイズを示す定数はすでに作ってあります。ここで、この定数の値を変更して、訓練期間の最初から最後までのエージェントの全経路を記録するのに十分なスペースがあるようにします。

定数の値を決めるには、簡単な計算を使います。平均すると、1カ月は21~22営業日です。エラーを避けるため、営業日の最大値である22日を使用します。4カ月で88営業日あります。

モデルをテストする際には、H1時間枠を使用します。1日は24時間なので、モデルを訓練するには、2112要素(88 * 24)のバッファが必要になります。これらの計算は、可能な最大値を考慮に入れており、実際のバーの数をわずかに上回っているため、配列サイズを超えるという致命的なエラーを恐れる必要はありません。ただし、週末を含む相場(例えば、暗号通貨)を訓練する場合は、訓練期間全体と商品の相場の特徴を考慮して、バッファーのサイズを計算するために暦日を使用する必要があります。

#define                    Buffer_Size  2112

2つ目のボトルネックは、保存する前に例を並べ替えることです。実践の結果、データの並べ替えには、過去のデータを調べてこれらの状態を収集するよりも時間がかかることがわかりました。訓練期間が長くなれば、並び替えのためのデータ量も増えます。そのため、データの選別は断念することにしました。その結果、Faza1.mq5アドバイザーのOnTesterDeinit関数は次のような形になりました。

//+------------------------------------------------------------------+
//| TesterDeinit function                                            |
//+------------------------------------------------------------------+
void OnTesterDeinit()
  {
//---
   int total = ArraySize(Total);
   printf("total %d", total);
   Print("Saving...");
   SaveTotalBase();
   Print("Saved");
  }

テスト中に、EAがしばしば複数のポジションを開き、長時間開いたままにすることが判明しました。全体的なアプローチをとることでこの問題に対処しようと考えたため、サンプル収集EAの仕組みにいくつかの変更を加えました。

変更のひとつは、報酬の定義に関するものです。これまでは、資本の増減を報酬としていました。このアプローチにより、モデルは累積利益と未記録利益の変化を考慮することができ、ドローダウンにペナルティを課し、利益ポジションの利益蓄積を促すことができました。しかし、このやり方では利益獲得の可能性が限られてしまいます。資本を使うことの利点を手放したくはありませんでしたが、利食い報酬も加えたいと思いました。

見つけた妥協案は資本と口座残高の変化の算術平均を使うことです。未決済ポジションに利益または損失が累積すると、資本は変動しますが、口座残高は変化しません。エージェントは、資産の変化の半分に相当する報酬またはペナルティを受け取ります。損益が計上された場合、資本は変化しませんが、累積額は口座残高に反映されます。エージェントは、保留中の報酬またはペナルティの残り半分を受け取ります。そのため、エージェントは利益を上げてポジションを決済することに関心を持つようになり、未決済のポジションを保有する傾向が弱まります。

      Base[action_count - 1].value = ( Base[action_count - 1].state[241] - state[241] + 
                                       Base[action_count - 1].state[240] - state[240] ) / 2.0f;

また、ポジションの数を減らすために、ポジションの最大数量を制限することにしました。例を作成し、モデルをテストする際、各取引に一定の最小取引量を使用しました。したがって、未決済ポジションの数量に制限を導入することは、未決済ポジションの数を制限することと全く同じです。しかし、システムの現状を説明する際には、未決済のポジションの量と累積損益に関する情報を収集します。追加計算を避けるため、ポジションの出来高を使って最大出来高を制限します。ポジションの可能な最大ボリュームの値を外部変数に移し、異なる値で実験をおこなうことができるようにしました。

input double               MaxPosition = 0.1;

ポジションの最大数量を制限する最終的な目的は、口座内のポジション数を減らし、プラスまたはマイナスロックでの取引の蓄積を避けることです。そのため、ロングとショートの差は考慮せず、別々に制限を確認します。

ここで重要なのは、モデルの制約条件を明示的に指定していないことです。その代わりに、モデルの訓練に使用する例を作成する段階で、ポジションの最大数量に制限を適用します。次に、これらの例を使ってモデルを訓練し、モデル自身が受け取った例に基づいて戦略を構築します。このアプローチにより、モデルは変化する市場状況に適応し、最も効果的な行動を選択することができます。

しかし、ポジションを建てるための行動を生成しても、課された制限のために実行できない場合、システムのその後の状態と報酬が生成された行動に対応しないことを考慮する価値があります。この問題を解決するために、生成された行動が実行されなかった場合に備えて、期待値(取引なし)に対応する行動を例のデータベースに保存しておきます。これにより、行動と報酬の対応関係が確実になり、モデルが正しく訓練されます。

   switch(act)
     {
      case 0:
         if(buy_value >= MaxPosition || !Trade.Buy(Symb.LotsMin(), Symb.Name()))
            act = 3;
         break;
      case 1:
         if(sell_value >= MaxPosition || !Trade.Sell(Symb.LotsMin(), Symb.Name()))
            act = 3;
         break;
      case 2:
         for(int i = PositionsTotal() - 1; i >= 0; i--)
            if(PositionGetSymbol(i) == Symb.Name())
               if(!Trade.PositionClose(PositionGetInteger(POSITION_IDENTIFIER)))
                 {
                  act = 3;
                  break;
                 }
         break;
     }

リスクの高い市場取引をおこなっているため、利益を得るだけでなく、起こりうる損失を最小限に抑えることも重要な課題です。そのために、ポジションを保有できる最長時間の制限をモデルに加えます。

この制限は、ポジションを保持するための最大バー数を指定する整数の外部変数です。 

input int                  MaxLifeTime = 48;

最も古いポジションの有効期間を決定し、境界値に達したら、すべてのポジションを決済する行動を強制的に作成します。

これは、大きな損失につながる可能性のある未決済のポジションを持ちすぎないようにするために必要なことです。現在の口座状況と未決済ポジションに関する情報を収集する際、最大保有時間を超えないよう、この制限を考慮します。

   int total = PositionsTotal();
   datetime time_current = TimeCurrent();
   int first_order = 0;
   for(int i = 0; i < total; i++)
     {
      if(PositionGetSymbol(i) != Symb.Name())
         continue;
      switch((int)PositionGetInteger(POSITION_TYPE))
        {
         case POSITION_TYPE_BUY:
            buy_value += PositionGetDouble(POSITION_VOLUME);
            buy_profit += PositionGetDouble(POSITION_PROFIT);
            break;
         case POSITION_TYPE_SELL:
            sell_value += PositionGetDouble(POSITION_VOLUME);
            sell_profit += PositionGetDouble(POSITION_PROFIT);
            break;
        }
      first_order = MathMax((int)(PositionGetInteger(POSITION_TIME) - time_current) / PeriodSeconds(TimeFrame), first_order);
     }

しかし、この制限を超えることを許せば、適切な措置を講じる必要があります。この場合、時間切れ後に単純に1つのポジションを決済するのではなく、すべてのポジションを決済する行動を指定し、すべてのポジションを決済します。これにより、完了した行動、新しい状態、報酬の対応関係を維持することができます。これはモデルが正しく動作するために重要です。

   int act = (first_order < MaxLifeTime ? SampleAction(4) : 2);

このように、未決済ポジションを保有するための最長制限時間の使用は、不確実な市場環境の場合にリスクをコントロールし、より安定した結果を達成するのに役立つ、当モデルのもう1つのメカニズムです。

モデルテスト中に明らかになった欠点に基づき、アルゴリズムを最適化するアプローチについて説明しました。次に、より多くの過去のデータを使ってモデルを訓練します。大きな訓練セットを小さな部分に分割し、それぞれの部分でエージェントを訓練する可能性を考えてみましょう。あるアルゴリズムが小さな期間でうまく機能するのであれば、より長い期間でもうまく機能すると考えることができます。したがって、大量のデータに対するモデル学習を改善するために、このアプローチを使用することができます。

このアプローチにより、モデルはより効果的に市場動向を捉えることができ、外部要因の変化に対する耐性が高まります。これは、トレンドの方向性の変化を予測することが重要である実際の市場の取引にモデルを使用する場合に特に重要です。さらに、このアプローチにより、モデルは最新の観測データだけでなく、利用可能なすべてのデータをより効果的に利用できるようになり、その結果、予測の質も向上します。

重要なことは、データの重複や予測における偏りを避けるために、訓練セットをより小さな期間に分割することは、データの時系列的な順序を考慮しておこなうべきであるということです。また、データを小さなセグメントに分割すると、各セグメントで学習に利用できるデータ量が少なくなり、モデルの予測精度が低下する可能性があることも考慮する必要があります。

したがって、訓練セットをより小さな時間セグメントに分割することは、アルゴリズムを最適化する効果的なアプローチであり、モデルの予測品質を大幅に向上させることができます。

訓練セットをより小さなエピソードに分割する場合、訓練セット全体をうまく通過させる一般的な戦略を開発する必要性に直面します。そのためには、ランダムな行動サンプリングと、指示されたステップバイステップの訓練を組み合わせることで、最も成功し利益を生む戦略を見つけることができます。

このアイデアは、小さなエピソードを順次プレイし、各エピソードで無作為に抽出された行動を使用するというものです。そして、最も収益性の高いパスを選び、次のエピソードの出発点とします。こうして、訓練セット全体を順次見ていき、利益の出る戦略の例を蓄積していきます。

このアプローチは、ランダムサンプリングとディレクテッド訓練という、一見相反するアイデアを組み合わせたものです。ランダムサンプリングを使って環境を探索し、訓練サンプルの指示された通過によって、最も成功する戦略を見つけることができます。その結果、エージェントにとって、より一般化された有益な戦略を得ることができます。

一般に、ランダムサンプリングと有向性訓練を組み合わせることで、ランダム性とすでに蓄積された成功行動の経験の両方を利用して、訓練サンプルを通過するための最適な戦略を得ることができます。

このアプローチを実行するために、3つの外部変数を導入します。

  • MinStartSteps:サンプリング開始までの最小ステップ数.
  • MaxSteps:サンプリングステップの最大数(シーケンスサイズ)
  • MinProfit:例データベースに保存する最小利益

input int                  MinStartSteps = 96;
input int                  MaxSteps = 120;
input double               MinProfit = 10;

アルゴリズムの最適化について議論しているうちに、保存する前に例を並び替えるのは非効率的であることがわかりました。その代わりに、MinProfit変数を使用して、データベースに含まれる例に必要な最低利益を決定することにしました。これによって、その後のサンプリングの出発点として使用する例の優先順位を決めることができます。さらに、MinStartSteps変数を使用して、開始点として使用するために必要な例の最小ステップ数を設定します。これによって、サンプリングプロセス中に中間ステップで立ち往生することを避け、次のエピソードに進むことができます。

また、エピソードの最大長を決定するMaxSteps変数も使用します。この値を超えると、サンプリングは効果がなくなるので、移動したパスを保存する必要があります。こうすることで、リソースをより効率的に使用し、訓練をスピードアップすることができます。

Faza1.mq5 EAのOnInitメソッドでは、以前に作成した例のデータベースを読み込んだ後、まず完了したステップ数の要件を満たす例を選択します。

   if(LoadTotalBase())
     {
      int total = ArraySize(Total);
      Cell temp[];
      ArrayResize(temp, total);
      int count = 0;
      for(int i = 0; i < total; i++)
         if(Total[i].total_actions >= MinStartSteps)
           {
            temp[count] = Total[i];
            count++;
           }

その後、無作為抽出で1つの例を選びます。この無作為に選ばれた例をサンプリングの出発点とします。

      if(count > 0)
        {
         count = (int)(((double)(MathRand() * MathRand()) / MathPow(32768.0, 2.0)) * (count - 1));
         StartCell = temp[count];
        }
      else
        {
         count = (int)(((double)(MathRand() * MathRand()) / MathPow(32768.0, 2.0)) * (total - 1));
         StartCell = Total[count];
        }
     }

EAのOnTickメソッドでは、まずエピソードのスタートポイントに到達するまで、パス全体を無条件に実行します。

void OnTick()
  {
//---
   if(!IsNewBar())
      return;
   bar++;
   if(bar < StartCell.total_actions)
     {
      switch(StartCell.actions[bar])
        {
         case 0:
            Trade.Buy(Symb.LotsMin(), Symb.Name());
            break;
         case 1:
            Trade.Sell(Symb.LotsMin(), Symb.Name());
            break;
         case 2:
            for(int i = PositionsTotal() - 1; i >= 0; i--)
               if(PositionGetSymbol(i) == Symb.Name())
                  Trade.PositionClose(PositionGetInteger(POSITION_IDENTIFIER));
            break;
        }
      return;
     }

行動サンプリング作業に移るのは、エピソードの冒頭を迎えてからです。同時に、ランダムに実行される行動の数もコントロールします。その数はエピソードの最大長を超えてはなりません。

最大ステップ数に達した場合、まずすべてのポジションを決済する行動を生成します。

   int act = (action_count < MaxSteps || first_order < MaxLifeTime ? SampleAction(4) : 2);

1回動いただけで、EAの仕事は終わりです。

   if(action_count > MaxSteps)
      ExpertRemove();

ストラテジーテスターで通過を完了した後、通過の結果受け取った利益の大きさを確認します。最低収益率のしきい値に達するという条件が満たされれば、例のデータベースに追加するデータを転送します。

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret = 0.0;
//---
   double profit = TesterStatistics(STAT_PROFIT);
   action_count--;
   if(profit >= MinProfit)
      FrameAdd(MQLInfoString(MQL_PROGRAM_NAME), action_count, profit, Base);
//---
   return(ret);
  }

ここでは、前回の記事で詳しく説明したEAコードのマイナーな変更点のみを提供し、説明します。完全なEAコードは添付ファイルにあります。


3.検証

前回と同様に、EURUSD H1の過去のデータを使ってモデルを訓練するための例を収集します。ただし、今回は2023年の4か月間の過去のデータを使用します。

研修期間

環境を最も効果的に探索するためには、サンプル採取時にさまざまな外部パラメータ値を使用する必要があります。この場合、これらのパラメータを最適化されたものとして使用し、パスごとに値を変更できるようにします。

最適化プロセスを開始するために、2つのパラメータ(MaxStepsとMaxLifeTime)を選択します。最初のパラメータは、エピソードの最大長を決定し、それを超えると例の収集が効かなくなります。2つ目のパラメータは、1つのエピソードにおけるポジションの最長保有期間を示します。事例を収集する過程で、これらのパラメータの値を使い分けることで、可能な限り環境を調査することができます。

例えば、MaxStepsとMaxLifeTimeの値を使い分けることで、ポジション保持の期間や期間の異なる例を集めることができます。これによって、環境で起こりうるさまざまな状況の例を得ることができます。こうすることで、さまざまなシナリオを考慮した、より普遍的で効果的な訓練モデルを作ることができます。

最初の最適化パスのパラメータ

閾値は0に近く設定します。結局のところ、これは最初のパスであり、わずかな利益を上げればいいのです。

最適化プロセスの最初のパスの結果、いくつかのパスが成功し、2023年1月の最初の2週間で46ドルの利益を達成しました。このようなパスの利益率は1.55に達します。

最初の最適化結果

最適化を実行する前に、パラメータをいくつか変更します。異なる時間間隔でサンプルが収集されるように、サンプリング開始前に最適化された変数に最小ステップ数を追加します。この変数の値は、1週間から3週間まで1週間単位で変化します。さらに、利益のしきい値を40ドルに引き上げることで、得られた結果を改善します。

第2最適化パスのパラメータ

2回目の最適化パスの結果に基づき、2023年1月の利益は84ドルに増加すると見ています。プロフィットファクターは1.38に減少していますが。

最適化パス2回目の結果

にもかかわらず、サンプル収集プロセスを最適化するための努力が実を結び始めていることがわかります。まだ最終的な成功には至っていませんが、全般的な流れは私たちの目標と期待に一致しています。 

2023年1月の第2週にサンプリングを開始するまでの最小ステップ数を増やし、再度最適化処理を実施しましょう。今回、最低収益率を80ドルに引き上げます。結局のところ、私たちは最も収益性の高い戦略を見つけようと努力しています。

第3最適化パスのパラメータ

予想通り、その後の事例収集プロセスの最適化の結果、さらに高い収益性を達成しました。最も成功したパスの総収入は125ドルに増加しました。同時に、プロフィットファクターはわずかに低下し、1.36となりました。これは依然として利益が費用を上回っていることを意味します。この収益性の向上は、サンプル収集プロセスの改善によって達成されたものであり、その効率性には自信を持ってよくなります。ただし、訓練はまだ完了していないことを覚えておいてください。

最適化パス3回目の結果

ストラテジーテスターの最適化モードで、サンプリングの開始点を順次ずらし、利益の閾値を変えながら、例の収集を繰り返し続けました。このアプローチにより、訓練セット全体を何度か通過して成功した例を得ることができました。その中で最も収益性が高かったのは281ドルの収入で、利益率は1.5でした。これらの結果は、ケース回収プロセスを最適化する私たちの戦略がプラスの効果をもたらし、より高い利益率の達成に役立っていることを裏付けています。しかし、このプロセスは完全ではなく、さらなる最適化と改善が必要であることは理解しています。

事例収集の結果

例を収集するプロセスが完了したら、得られたデータに基づいて、Go-Exploreアルゴリズムを使ったモデルの訓練に移ります。その後、強化訓練法を用いてモデルを再学習させ、さらに性能を向上させます。

学習したモデルの品質と効率を確認するために、訓練サンプルとテストサンプルでテストします。私たちのモデルは、訓練セットには含まれていませんでしたが、訓練セットに直接従った2023年5月の第1週の履歴データから利益を得ることができたことに注意することが重要です。

テストサンプル(2023年5月) テストサンプル(2023年5月)


結論

この記事では、Go-Exploreアルゴリズムを最適化するためのシンプルでありながら効果的な方法を検討しました。これにより、大量の訓練データでモデルを訓練するためにGo-Exploreアルゴリズムを使用できるようになります。モデルは4か月間の履歴データで訓練されましたが、最適化手法の使用により、Go-Exploreアルゴリズムはより長い期間にわたってモデルを訓練するために使用することができます。また、このモデルを訓練サンプルとテストサンプルでテストし、その高い効率性と品質を確認しました。

全体として、Go-Exploreアルゴリズムは、ビッグデータ上のモデルを訓練するための新たな可能性を開き、人工知能分野における様々な応用のための強力なツールとなり得ます。

しかし、金融市場は非常にダイナミックであり、突然の変化に左右されるため、最高品質のモデルであっても100%の成功を保証することはできないということを忘れてはなりません。常に市場の変化を監視し、それに応じてモデルを適応させなければなりません。


リンク

  1. Go-Explore:ハードな探査問題に対する新しいアプローチ
  2. ニューラルネットワークが簡単に(第35回):内因性好奇心モジュール
  3. ニューラルネットワークが簡単に(第36回):関係強化学習
  4. ニューラルネットワークが簡単に(第37回):疎な注意
  5. ニューラルネットワークが簡単に(第38回):不一致による自己監視型探索
  6. ニューラルネットワークが簡単に(第39回):Go-Explore、探検への異なるアプローチ

記事で使用されているプログラム

# 名前 種類 詳細
1 Faza1.mq5 EA 第1フェーズEA
2 Faza2.mql5 EA 第2フェーズEA
3 GE-lerning.mq5 EA 方策微調整EA
4 Cell.mqh クラスライブラリ システム状態記述構造
5 FQF.mqh クラスライブラリ 完全にパラメータ化されたモデルの作業を整理するためのクラスライブラリ
6 NeuroNet.mqh クラスライブラリ ニューラルネットワークを作成するためのクラスのライブラリ
7 NeuroNet.cl コードベース OpenCLプログラムコードライブラリ

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/12584

添付されたファイル |
MQL5.zip (90.76 KB)
ニューラルネットワークが簡単に(第41回):階層モデル ニューラルネットワークが簡単に(第41回):階層モデル
この記事では、複雑な機械学習問題を解決するための効果的なアプローチを提供する階層的訓練モデルについて説明します。階層モデルはいくつかのレベルで構成され、それぞれがタスクの異なる側面を担当します。
リプレイシステムの開発 - 市場シミュレーション(第8回):指標のロック リプレイシステムの開発 - 市場シミュレーション(第8回):指標のロック
この記事では、MQL5言語を使用しながら指標をロックする方法を見ていきます。非常に興味深く素晴らしい方法でそれをおこないます。
ニューラルネットワークが簡単に (第42回):先延ばしのモデル、理由と解決策 ニューラルネットワークが簡単に (第42回):先延ばしのモデル、理由と解決策
強化学習の文脈では、モデルの先延ばしにはいくつかの理由があります。この記事では、モデルの先延ばしの原因として考えられることと、それを克服するための方法について考察しています。
ニューラルネットワークが簡単に(第39回):Go-Explore、探検への異なるアプローチ ニューラルネットワークが簡単に(第39回):Go-Explore、探検への異なるアプローチ
強化学習モデルにおける環境の研究を続けます。この記事では、モデルの訓練段階で効果的に環境を探索することができる、もうひとつのアルゴリズム「Go-Explore」を見ていきます。