English Русский 中文 Español Deutsch Português
preview
取引におけるニューラルネットワーク:Actor-Director-Critic

取引におけるニューラルネットワーク:Actor-Director-Critic

MetaTrader 5トレーディングシステム |
23 0
Dmitriy Gizlyk
Dmitriy Gizlyk

はじめに

強化学習(RL, Reinforcement Learning)は、現代の機械学習分野において最も有望かつ急速に発展している研究領域の一つです。その最大の特徴は、エージェントが環境との相互作用を通じて学習し、蓄積した経験をもとに最適な行動戦略を獲得できる点にあります。特に、深層ニューラルネットワークと強化学習を組み合わせた深層強化学習(Deep RL, Deep Reinforcement Learning)は、自律ロボット、ゲームAI、産業プロセス制御、さらには金融市場における自動売買など、多様な分野で大きな成果を上げています。

金融市場は、高い確率性、絶え間ない市場環境の変化、そして大きなリスクを特徴とするため、Deep RLを適用する上で理想的な検証環境といえます。このような環境では、エージェントは価格変動、出来高、市場ボラティリティの変化に迅速に適応し、不確実性の下で意思決定をおこなう必要があります。しかし、実際にRLをトレード戦略、特に高頻度取引(HFT)やポートフォリオ運用へ応用する際には、多くの課題があります。その中でも特に重要なのがサンプル効率(Sample Efficiency)の低さです。金融市場では、情報量の少ない行動や誤った戦略を試すこと自体が、大きな取引コストや資本損失につながるため、その代償は非常に大きくなります。

従来のModel-Free RLでは、環境の明示的なモデルを持たず、エージェントは実際に行動し、その結果として得られる報酬から学習します。つまり、「試行錯誤」によって方策を改善していきます。しかし、こうした相互作用の多くは、学習に与える情報量が限られています。金融市場ではそれらの試行錯誤が直接的な損失となるため、サンプル効率の向上と学習収束の高速化が極めて重要な課題となっています。

最も堅牢で広く採用されているアーキテクチャの一つがActor–Criticです。このフレームワークは、次の2つのモデルを組み合わせています。

  • Actor方策を学習する
  • Critic価値関数 (Value Function)を通じて行動を評価する
この責務の分離により、方策勾配法と価値ベースの推定を統合することが可能となり、学習の安定性と連続行動空間への適用性の両方を実現します。

金融分野では、Actor-Criticアーキテクチャは、短期的なリターンを予測しながら長期的なリスクを管理できるエージェントの構築に広く利用されています。たとえば、ポートフォリオのリバランス問題では、Criticは期待収益を推定することを学習し、一方でActorはポートフォリオ価値を最大化する資産配分を選択します。しかし、この高度なアーキテクチャにも限界があります。学習の初期段階では、Criticによる推定は大きく不正確である可能性があり、その結果、Actorは誤ったシグナルを受け取ることになります。そのため、エージェントは利益につながる可能性の低い行動空間の領域を繰り返し探索してしまう恐れがあります。

この制限を解決するために、論文「Actor-Director-Critic:A Novel Deep Reinforcement Learning Framework」では、新たなフレームワークであるActor-Director-Critic (ADC)が提案されました。このアーキテクチャでは、ActorCriticに加えて、Directorと呼ばれる第三のコンポーネントが導入されています。その役割は、Criticが信頼できる評価を学習する以前の段階であっても、良質な行動と質の低い行動を識別できる分類器として機能することです。Criticとは異なり、Directorは評価関数ではなく分類をおこないます。すなわち、ある行動を方策の学習に利用すべきか、それとも本質的に質の低い行動であるため今後の検討対象から除外すべきかを判定します。

Directorの導入には、いくつかの利点があります。第一に、学習初期の段階では、できる限り非効率な行動を回避することが極めて重要です。第二に、高い取引コストと大きな市場ボラティリティを伴う環境では、エージェントにとって一つひとつの失敗した行動が高い代償を伴います。このような状況において、DirectorActorに対する初期のガイダンス機構として機能し、Actorが有望と思われる行動に集中できるよう支援します。このアプローチにより、探索のエントロピーが低減され、生産的な戦略の形成が加速されます。

Directorは、2つの経験データ集合を用いて学習されます。一方は高い利益をもたらした状態・行動・報酬(state–action–reward)の組から構成され、もう一方は成績の悪いサンプルから構成されます。学習後、Directorは新たに生成された行動に対して二値分類をおこない、効果が期待できない行動をフィルタリングすることで、Criticが提供するシグナルを補強します。Directorの影響力は減衰係数によって制御されます。学習初期にはActorに対して大きな影響を与えますが、Criticの精度が向上するにつれて、その重みは徐々に減少します。この仕組みにより、最適化の過程全体を通じて柔軟性と安定性の双方が維持されます。

ADCアーキテクチャによる構造的な改良に加えて、著者らはもう一つの根本的な問題である過大評価バイアス(Overestimation Bias)にも取り組んでいます。強化学習における過大評価は、実際よりも高く見積もられた価値推定が学習目標として用いられることで生じ、報酬への期待が過度に膨らみ、学習の不安定化を招きます。過大評価の主な原因は次の2つです。

  • Maximization Bias:価値関数の出力の中から過大評価された値を選択してしまう傾向によって生じます。
  • Bootstrapping Errors:予測された将来報酬を現在の状態価値の更新に利用することによって生じます。

過大評価を軽減するための最もよく知られた手法の一つが、Twin Delayed Deep Deterministic Policy Gradient (TD3)アルゴリズムです。TD3では、2つの独立したQ関数を用い、そのうち小さい方の推定値を更新に利用します。しかし、この手法でもターゲットネットワークが遅延更新されるため、その推定値には依然としてノイズが含まれる可能性があり、学習はなお不安定になることがあります。

ADCフレームワークでは、この手法をさらに改良しています。各Q関数には2つのターゲットネットワークが割り当てられ、それらは異なる間隔で交互に更新されます。ターゲット値を計算する際には、2つのターゲットモデルによる推定値の平均を用います。この方法により、推定値の分散が低減され、過大評価バイアスが抑制されるとともに、学習の安定性が向上します。このような改善は、Q関数の誤差がそのまま資本損失につながり得る金融アプリケーションにおいて、特に重要です。

Actor–Director–Criticアーキテクチャと改良された二重推定メカニズムを組み合わせることで、ADCは強力で適応性が高く、頑健な強化学習フレームワークを実現しています。アルゴリズム取引、資産運用、自動ヘッジへの適用により、学習の初期段階から知的な行動選択を実現し、エージェントの学習を加速するとともに、リスクを低減しながらトレード性能を大幅に向上させる可能性があります。



ADCアルゴリズム

強化学習の幅広いタスクにおいて、Actor–Criticアーキテクチャは信頼性と有効性の高い手法として確立されています。そのシンプルで明快な構造と高品質な方策を学習できる能力により、後続の強化学習アルゴリズムの基盤となってきました。しかし、環境がより複雑化し、特にエージェントの行動空間が連続である場合や、フィードバックが疎である環境では、より強力で柔軟なアーキテクチャが求められるようになりました。Actor–Director–Critic (ADC)フレームワークは、このような課題に対応するために提案されたものであり、戦略的計画、ヒューリスティックなガイダンス、および行動の深い評価という考え方を取り入れています。

このアーキテクチャは、ActorCriticDirectorという3つの相互に連携したコンポーネントによって構成されています。これらは互いを補完し合う協調的なシステムを形成し、それぞれが他のコンポーネントの働きを強化することで、エージェントの学習をより高速かつ安定したものにします。

Criticは、このシステムにおける分析の中核を担います。その主な役割は、現在の方策の下で期待される累積報酬を表す価値関数Q(s, a)を近似することによって、エージェントの行動の長期的な有用性を評価することです。Criticは、予測値と目標値との誤差を最小化するように学習されます。

ここで

  • rは、エージェントが直前の行動に対して環境から受け取る報酬です。
  • γ ∈ [0,1)は割引率です。
  • s'およびa'は、それぞれ次の状態および次の行動を表します。

しかし、特に学習初期の段階では、Criticの推定だけに依存することは危険です。というのも、その予測はしばしば不安定だからです。この不確実性を補い、エージェントを妥当な意思決定へ導くために、このアーキテクチャではDirectorが導入されています。Directorはメンターのような役割を果たすコンポーネントであり、有望な行動と望ましくない行動を識別する二値分類器として機能します。Directorは、正例となる行動ahと負例となる行動alから構成されるラベル付きデータセットを用いて、次の目的関数に従って学習されます。


ここで、関数D(s, a)は、状態sにおいて行動aが適切である確率を推定します。このようにしてDirectorは行動をフィルタリングし、特にCriticの推定がまだ十分に信頼できない学習初期の段階において、Actorの学習プロセスを導きます。

一方、Actorエージェントの行動方策を表します。Actorはパラメータ化された関数μθ(s)として実装されており、現在の状態sを解析した結果として、現在の方策の下で最適と判断される行動aを出力します。ADCフレームワークでは、ActorCriticからのフィードバックだけでなく、Directorからのガイダンスも利用して学習されます。これにより、より確実に最適な戦略へ向かって学習を進めることができます。Actorの目的関数は、これら2つの情報源を組み合わせたものとなっています。

その結果、Actorは、Directorによって推奨され、かつCriticによって高い期待価値が与えられた行動を選択するように学習します。

学習の安定性を向上させ、過大評価バイアスを軽減するために、ADCフレームワークでは改良された二重推定機構が採用されています。2つの独立したCriticを保持し、それぞれにパラメータを固定した2つのターゲットネットワークを対応付けています。Criticの学習時には、次の状態・行動ペアに対する対応するターゲットネットワークの予測値の平均を目標値として用いることで、学習過程の安定化を図ります。一方、Actorの学習時には、2つのCriticによる推定値のうち小さい方を使用することで、行動価値の過大評価を防ぎ、より保守的で信頼性の高い方策の学習を促進します。

Criticのターゲットモデルは、あらかじめ定められた間隔で、それぞれ対応する学習可能なモデルのパラメータをコピーすることによって交互に更新されます。この方法により、学習全体を通じた安定性が向上し、ターゲット値の急激な変動が抑えられます。

また、Criticのパラメータは学習の各イテレーションごとに更新される一方で、Actorの方策更新は遅延して実行されることにも注意が必要です。この遅延更新メカニズムにより、Criticは現在の方策を十分に評価する時間を確保できるため、その後の方策更新に対してより信頼性の高いフィードバックを提供できます。

さらに、エージェントの行動の多様性と頑健性を向上させるために、確率的平滑化の手法も採用されています。具体的には、次のような処理がおこなわれます。

  • エージェントの行動にガウスノイズを付加する。

  • ターゲット行動に大きさを制限したノイズを加える。

Actorの最終的なパラメータ最適化関数は、CriticDirectorの両方から得られるシグナルを統合したものとなっています。


Actor–Director–Criticフレームワークは、経験から学習するだけでなく、人間が指導を受けながら学習するのと同様の方法でガイダンスを活用できる知的エージェントの開発に、新たな可能性を切り開くものです。

著者らによるActor-Director-Criticフレームワークの可視化を以下に示します。

著者らによるActor-Director-Criticフレームワークの可視化



MQL5での実装

Actor–Director–Criticフレームワークの理論的な側面を確認したところで、本稿の実装編に移ります。ここでは、提案された手法をMQL5で実装するにあたっての、私たちの解釈と実装方法について説明します。

お気付きのように、このフレームワークでは、新しいモジュールを独立したオブジェクトとして新たに導入する必要はありません。この点は、本手法をこれまでのアプローチと大きく区別する特徴の一つです。本実装では、これまでに開発したモジュールを用いて学習可能モデルのアーキテクチャを構築するとともに、提案された手法に従って学習プロセスを設計することに重点を置いています。

学習可能なモデルのアーキテクチャ


学習可能モデルのアーキテクチャの構築を始める前に、著者らが提案したADCフレームワークは、幅広いアーキテクチャ設計に適用可能であることに留意する必要があります。原論文では、TD3フレームワークを拡張した構成を用いた実験結果が示されています。一方、本稿ではさらに一歩進み、以前の研究で紹介した、より複雑なアーキテクチャであるHiSSDに提案手法を適用します。さらに、単に2つの新しいモデル(CriticとDirector)を追加するだけではなく、これまでに開発したコンポーネントにも変更を加えています。

これまでと同様に、すべての学習可能モデルのアーキテクチャはCreateDescriptionsメソッド内で定義します。このメソッドの引数には、新たに導入するモデルのアーキテクチャを保持するための2つの動的配列を追加します。

bool CreateDescriptions(CArrayObj *&encoder, 
                        CArrayObj *&task, 
                        CArrayObj *&actor, 
                        CArrayObj *&probability,
                        CArrayObj *&director,
                        CArrayObj *&critic
                       )
  {
//---
   CLayerDescription *descr;
//---
   if(!encoder)
     {
      encoder = new CArrayObj();
      if(!encoder)
         return false;
     }
   if(!task)
     {
      task = new CArrayObj();
      if(!task)
         return false;
     }
   if(!actor)
     {
      actor = new CArrayObj();
      if(!actor)
         return false;
     }
   if(!probability)
     {
      probability = new CArrayObj();
      if(!probability)
         return false;
     }
   if(!director)
     {
      director = new CArrayObj();
      if(!director)
         return false;
     }
   if(!critic)
     {
      critic = new CArrayObj();
      if(!critic)
         return false;
     }

メソッド本体では、受け取ったポインタを確認し、必要であれば新しい動的配列オブジェクトのインスタンスを生成します。これにより、後続の処理でこれらの配列へアクセスする際に重大なエラーが発生することを防ぎます。

最初に説明するモデルは、高レベルプランナー(High-Level Planner)です。このモデルは、環境状態のエンコーダとしての役割も部分的に担います。

前述したように、このモデルは入力として環境状態を表すテンソルを受け取ります。そして、モデルの潜在状態において共通スキルの行列を生成するとともに、与えられた計画ホライズンにわたる将来の環境状態を予測します。重要なのは、将来状態の予測には共通スキル表現のみが用いられる点です。これにより、モデルは情報量の豊富な潜在スキルテンソルを構築するよう促されます。

最初のレイヤーは、従来どおり、環境の入力状態テンソル全体をエンコードするのに十分なサイズを持つ全結合層です。

//--- Encoder
   encoder.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   int prev_count = descr.count = (HistoryBars * BarDescr);
   descr.activation = None;
   descr.optimization = ADAM;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }

モデルは、前処理されていない生データをMetaTrader 5ターミナルから直接受け取ります。このデータには、価格系列だけでなく、単純移動平均から複雑なオシレーターまで、さまざまなテクニカル指標のデータが含まれる場合があります。

これらのデータは非常に有用である一方、その性質は極めて異質です。値域、統計分布、ノイズ特性は互いに大きく異なる可能性があります。適切な前処理をおこなわなければ、このような異質性はモデル学習の性能を著しく低下させます。そのため、次の段階では通常、バッチ正規化を用いてデータを比較可能な表現空間へ変換し、値の分布の偏りを緩和します。

しかし、本実装では異なるアプローチを採用しています。モデルの頑健性と汎化性能を向上させるため、この段階で正規化されたデータに制御されたノイズを付加しています。これは一種の正則化として機能し、過学習を防ぐとともに、実際の市場における激しい変動への適応能力を向上させます。

//--- layer 1
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBatchNormWithNoise;
   descr.count = prev_count;
   descr.batch = 1e4;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }

この処理の後に初めて、汎用的なスキル生成モジュールを用います。このモジュールの目的は、各エージェントに対して情報量の豊富な共通スキルテンソルを構築することです。このテンソルは、現在の市場環境におけるエージェントの振る舞いや目的を特徴付ける重要な特徴を凝縮した抽象表現となります。変動が大きく予測困難な金融市場では、このような抽象表現を用いることで、短期的なノイズや外れ値に対する感度が低下し、戦略の頑健性が向上します。

ここで重要なのは、このスキルテンソルが後にエージェントの方策生成の入力データの一部として利用されることです。その存在により、モデルの選択能力は大幅に向上し、利益が期待できる行動と利益につながらない行動とを、より正確に識別できるようになります。このように、本手法ではデータをタスクと能力(スキル)の観点から再解釈しています。すなわち、従来の「状態行動」という定式化から、「コンテキスト → スキル → 行動」という、より解釈しやすい遷移へと発展させています。

//--- layer 2
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronSkillsEncoder;
   descr.count = HistoryBars;
     {
      int temp[] = {BarDescr, NSkills, 4};   // Variables, Common Skills, Heads
      if(ArrayCopy(descr.windows, temp) < (int)temp.Size())
         return false;
     }
   descr.window = 8;
   descr.step = 1;
   descr.window_out = 32;
   prev_count = descr.windows[0];
   int prev_out = descr.windows[1];
   descr.batch = 1e4;
   descr.optimization = ADAM;
   descr.activation = None;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }

さらに、共通スキルテンソルの時間的変化を考慮してエージェントの行動を改善するために、LSTMリカレントブロックを導入します。このコンポーネントは、観測された市場データの時間構造を捉える上で重要な役割を果たします。よく知られているように、金融市場は過去の状態への強い依存性を持ち、市場の振る舞いの多くは時間的パターンの中に現れます。

まさにこの点において、LSTM長短期記憶)は不可欠なツールとなります。その内部メモリ機構により、長期的な時間依存性の中でも文脈を失うことなく、市場における重要な転換点や構造的パターンに関する情報を保持・更新することができます。その結果、モデルは現在の市場状況を認識するだけでなく、過去の観測データに含まれる複雑な構造に基づいて、市場の反転やトレンドの継続を予測する能力も獲得します。

スキル生成層の後にLSTMブロックを配置しているのは意図的な設計です。まず、モデルは現在の状態とエージェントの目的をスキルテンソルという抽象表現へ変換します。その後、LSTMがこれらのスキルの時間的な変化を追跡します。これにより、エージェントは市場の静的なスナップショットだけでなく、その戦略プロファイルの変化も把握できるようになります。たとえば、優勢なトレンドがどのように変化していくか、サポートラインやレジスタンスラインがどのように形成されるか、あるいはボラティリティが時間とともにどのように推移するかを捉えることが可能になります。

//--- layer 3
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronLSTMOCL;
   descr.count = prev_out;                      // Common Skkills
   descr.layers = prev_count;                   // Variables
   descr.batch = 1e4;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }

続いて、2つの畳み込み層を順に追加します。それぞれの層は、前段から渡される多次元時系列データを処理する上で固有の役割を担います。これらの畳み込み層は、独立した予測ヘッドを備えたMLPの一種として機能し、複雑な市場系列を構成する各単変量成分について、指定された予測ホライズンにわたる変化を独立して解析・予測するよう設計されています。

//--- layer 4
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConvOCL;
   descr.count = 1;
   descr.window = prev_out;
   descr.step = prev_out;
   prev_out=descr.window_out = 4*NForecast;
   descr.layers = prev_count;
   descr.activation = SoftPlus;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }
//--- layer 5
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronConvOCL;
   descr.count = 1;
   descr.window = prev_out;
   descr.step = prev_out;
   prev_out=descr.window_out = NForecast;
   descr.layers = prev_count;
   descr.activation = TANH;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }

予測された各単変量系列は、その後、完全な多次元時系列表現へと転置されます。

//--- layer 6
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronTransposeOCL;
   descr.count = prev_count;
   descr.window = prev_out;
   descr.activation = None;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     }

重要なのは、この一連の特徴変換が完了した後、逆正規化によって予測値を元のデータスケールおよび分布へ戻す点です。この処理により、モデルの出力はトレーディングの文脈において意味を持ち、解釈可能な値として維持されます。

逆正規化は、「モデル内部の世界」と、あらゆる値が明確な数量的意味を持つ実際の市場空間との対応関係を維持する役割を果たします。

//--- layer 7
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronRevInDenormOCL;
   descr.count = prev_count*prev_out;
   descr.layers = 1;
   descr.activation = None;
   if(!encoder.Add(descr))
     {
      delete descr;
      return false;
     } 

ここで強調しておきたいのは、共通スキル生成ブロックによって生成される潜在表現は、このパイプラインの最終出力ではないという点です。むしろ、それはActor–Director–Criticフレームワークの複数のコンポーネントで繰り返し利用される重要な中間表現です。そのため、LSTMブロックが生成した潜在表現をローカル変数に保存し、後続の処理で利用できるようにします。

//--- Latent
   CLayerDescription *latent = encoder.At(LatentLayer);
   if(!latent)
      return false;

次に、低レベルコントローラーのアーキテクチャについて説明します。このモジュールは同じ環境状態を解析し、タスク固有スキルのテンソルを生成します。そのため、入力処理と正規化をおこなう最初の2層については、先ほどのモデルを変更することなく再利用できます。

//--- Task
   task.Clear();
//--- Input layer
   if(!task.Add(encoder.At(0)))
     {
      return false;
     }
//--- layer 1
   if(!task.Add(encoder.At(1)))
     {
      return false;
     }

コントローラーは、タスク固有スキルのテンソルを構築する低レベルモジュールとして機能します。戦略的な文脈で動作する前述の共通スキル生成モジュールとは異なり、コントローラーは戦術レベルで現在の環境状態を解析します。

コントローラーは単に環境へ反応するだけではありません。複雑な市場構造を積極的に解釈し、エージェントの短期的な「直感」と表現できるものを抽出します。この解析に基づいて、直近の意思決定における選好や、その状況でエージェントが取るべき行動を反映したタスク固有スキルのテンソルを生成します。

最後に、次の3つの情報ストリームを統合します。  

  1. 共通スキル(高レベル)の潜在表現
  2. タスク固有スキル(低レベル)のテンソル
  3. 現在の環境状態を正規化した表現

こうして得られた統合テンソルは、エージェントの行動行列を生成するための基礎となります。この構造により、戦略的な目標と戦術的な現実が整合した、高い適応性を備えたモデルが実現されます。その結果、エージェントの行動パターンは柔軟性を獲得すると同時に、全体としてのトレード方針との一貫性も維持されます。

ここで強調しておきたいのは、コントローラーは単なる行動予測モジュールではなく、高レベルの意図と具体的な市場状況を結び付ける意味論的な橋渡しを担うコンポーネントであるという点です。これにより、エージェントは行動の戦略的な方向性を維持しながら、絶えず変化する市場環境へ適応できるようになります。

//--- layer 2
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronHiSSDLowLevelControler;
   descr.count = HistoryBars;
     {
      int temp[] = {latent.layers,     // Variables
                    NSkills,           // Task Skills
                    latent.count,      // Common Skills
                    NActions,          // Action Space
                    4};                // Heads
      if(ArrayCopy(descr.windows, temp) < (int)temp.Size())
         return false;
     }
   descr.window = 8;
   descr.step = 1;
   descr.window_out = 32;
   prev_count = descr.windows[0];
   prev_out = descr.windows[3];
   descr.batch = 1e4;
   descr.optimization = ADAM;
   descr.activation = SIGMOID;
   if(!task.Add(descr))
     {
      delete descr;
      return false;
     }

続いて、高レベルActorモデルのアーキテクチャについて説明します。このモデルは最終的なトレード判断を生成する役割を担います。その役割は、前段階でコントローラーが生成した行動行列を解釈することです。言い換えれば、Actorは最終的な意思決定主体として機能し、複数の戦術的シナリオの中から、現在の市場状況で実際に実行すべき行動を決定します。

Actorのアーキテクチャは、前回までの研究で用いたものをそのまま継承しています。私たちは、代替戦略の行列から生成された行動に対してノイズを付加しないという設計を意図的に採用しました。多くの強化学習タスクでは、ノイズの付加は探索を促進し、多様な行動を学習する上で有効です。しかし、金融市場では、最終的な行動にわずかな歪みが加わるだけでも深刻な結果を招く可能性があります。たとえば、ポジションサイズの僅かなずれ、エントリーや決済レベルのわずかな変化、さらには市場動向の誤った解釈は、いずれも大きな損失につながり、結果としてシステム全体の信頼性を低下させる恐れがあります。

本実装で加えた変更は、市場の方向性を予測する確率モデルに対する小規模な修正のみです。この修正では、環境エンコーダの潜在状態を、従来の共通スキル生成モジュールからLSTMリカレントブロックへ移しました。この小さな変更は、時間的依存関係をより適切に捉え、変化する市場状況への動的な適応能力を向上させることを目的としています。

このセクションでは説明を簡潔に保つため、これらのアーキテクチャの詳細については繰り返し説明しません。完全な実装については、添付資料を参照してください。

ここまでで説明したモデルのほとんどは、Actor–Director–CriticフレームワークにおけるActorの階層構造を構成しています。次に紹介する重要なコンポーネントがDirectorです。Directorは、Actorによって生成された行動を、利益が期待できる行動と期待できない行動とに文脈に応じて分類することを主な役割とする専用モデルです。

Directorの役割は極めて重要です。これは戦略的な品質フィルタとして機能し、潜在的に損失につながる意思決定を、実際に執行されて金銭的損失を生む前に排除します。一つひとつの判断ミスに大きなコストが伴う高ボラティリティの金融市場では、このような事前評価メカニズムは特に重要になります。

本手法の特徴は、Directorが単に行動を分類するだけではない点にあります。Directorは、追加の教師信号も生成します。これにより、Actorは負の経験を繰り返し蓄積することなくDirectorからのフィードバックを方策に反映できるため、適応過程が加速されます。この仕組みは、誤りの代償が大きく、学習時間が限られる環境において特に有効です。

従来の実装では、Directorエージェントの観測を直接表す環境状態テンソルを入力として受け取ります。しかし、本実装では、Directorは共通スキル行列を入力として利用します。この行列は、LSTMブロックの出力であるスキル生成モジュールが生成した情報量の豊富な潜在表現であり、多変量時系列から行動パターンを抽出できるよう事前学習されています。この表現には、環境の時間的変化がすでに反映されており、不要な情報は除去され、現在の市場状況において最も重要な特徴が凝縮されています。その結果、Directorはよりコンパクトで安定した特徴空間で動作することができ、分類精度、意思決定の安定性、そして実運用環境における適応性を大幅に向上させることができます。

Directorの主たる情報経路では、まず入力としてエージェントの行動テンソルを受け取り、直ちに正規化します。

//--- Director
   director.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = NActions;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!director.Add(descr))
     {
      delete descr;
      return false;
     }
//--- layer 1
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBatchNormOCL;
   descr.count = NActions;
   descr.batch = 1e4;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!director.Add(descr))
     {
      delete descr;
      return false;
     }

現在の市場環境を表す共通スキル行列との文脈の中で、Actorが提案した行動を直接解析する処理は、クロスアテンションモジュールによって実現されます。ここでは、エージェントが実行しようとしている行動と、現在の市場ダイナミクスによって実際に正当化される行動との間で、意味的な対応付けがおこなわれます。

クロスアテンション機構により、Directorは行動テンソルの各要素と共通スキル行列の特徴との関連性を学習できます。これは、単純な線形関係が成り立たないような高ボラティリティ市場において特に重要です。クロスアテンションは、現在の状況で最も重要となるActorの行動の側面へモデルの注意を集中させることを可能にします。

//--- layer 2
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronCrossDMHAttention;
     {
      int temp[] = {3,                 // Inputs window
                    latent.count       // Cross window
                   };
      if(ArrayCopy(descr.windows, temp) < (int)temp.Size())
         return false;
     }
     {
      int temp[] = {NActions/3,        // Inputs units
                    latent.layers      // Cross units
                   };
      if(ArrayCopy(descr.units, temp) < (int)temp.Size())
         return false;
     }
   descr.step = 4;                     // Heads
   descr.window_out = 32;
   descr.batch = 1e4;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!director.Add(descr))
     {
      delete descr;
      return false;
     }

クロスアテンションモジュールの出力は、現在の市場状況に適応した、意味的に強化されたActorの行動表現です。この表現は、エージェントの意図だけでなく、発見されたパターンや行動と共通スキルとの相互関係を考慮した上で、その行動が現在の市場環境においてどの程度適切であるかも反映しています。

このように文脈情報が付加された表現は、最終段階である行動の収益性分類の入力となります。

分類処理は、3層の全結合ニューラルネットワークによって実装されています。各層にはそれぞれ異なる活性化関数が設定されており、データ変換に必要な非線形性を導入します。このカスケード構造により、複雑な決定境界を柔軟に近似できるため、利益が期待できる行動と期待できない行動とを、より高い精度で分類できます。

最終層では、活性化関数としてシグモイドを使用しています。これにより、モデルの出力はクラスへの所属確率として解釈できます。したがって、このモデルは単に二値判定を出力するだけではなく、その判定に対する信頼度も同時に提供します。

//--- layer 3
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = LatentCount;
   descr.batch = 1e4;
   descr.activation = TANH;
   descr.optimization = ADAM;
   if(!director.Add(descr))
     {
      delete descr;
      return false;
     }
//--- layer 4
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   descr.count = LatentCount;
   descr.activation = SoftPlus;
   descr.batch = 1e4;
   descr.optimization = ADAM;
   if(!director.Add(descr))
     {
      delete descr;
      return false;
     }
//--- layer 5
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   prev_count = descr.count = 1;
   descr.activation = SIGMOID;
   descr.batch = 1e4;
   descr.optimization = ADAM;
   if(!director.Add(descr))
     {
      delete descr;
      return false;
     }

なお、本実装におけるCriticモデルも、基本的には同様のアーキテクチャを採用しています。Directorと同様にクロスアテンションモジュールを用いることで、Actorが提案した行動と、共通スキル行列によって表現される現在の市場環境とを対応付けます。その結果、エージェントの行動と潜在的な市場ダイナミクスとの複雑な依存関係を考慮した、より精度の高い行動評価が可能になります。

ただし、Criticのアーキテクチャでは最終段階に本質的な違いがあります。Directorでは出力を確率として解釈するためにシグモイド関数を用いましたが、Criticの出力層には活性化関数を設けていません。これは、Criticが予測対象とする期待累積報酬が広い範囲、事実上無制限の値を取り得るためです。

言い換えれば、Criticは現在の市場状況において提案された行動の有用性を、期待収益という尺度で表したスカラー値として出力します。この値に有界な活性化関数を適用すると、本来保持すべき重要な差異まで圧縮してしまいます。そのため、最終的な値は活性化関数を介さずに直接出力され、モデルは環境に対して学習した期待値を制約なく表現できるようになっています。

もっとも、この違いはアーキテクチャ上の小さな修正に過ぎません。そのため、本記事ではCriticの構成についてこれ以上詳しくは説明しません。すべてのモデルの詳細なアーキテクチャについては添付資料に掲載しており、興味のある読者はそちらを参照してください。

残念ながら、ここまでアーキテクチャ設計上の選択について詳しく説明したことで、本記事で扱う内容はほぼ尽くしました。そこでいったんここで区切りとし、次回は各モデルの学習プロセスについて詳しく説明するとともに、実際のヒストリカルデータを用いて提案手法の有効性を評価します。



結論

本記事では、ディープラーニングおよびニューラルネットワークを用いて問題を解決するために設計された、新しいActor-Director-Criticフレームワークを紹介しました。このフレームワークにおける主要な貢献の一つは、Directorモデルの導入です。Directorは、現在の環境状態という文脈の中でActorの行動を分類します。これにより、学習プロセスの効率と安定性を大幅に向上させることが可能になります。

記事の実践セクションでは、Actor–Director–Criticフレームワークの基盤となる学習可能モデルのアーキテクチャ設計について詳しく検討しました。さまざまなモジュールを使用する際の基本原理を説明するとともに、システムを構成する各コンポーネントにおける主要な設計上の判断について解説しました。

次回の記事では、これらのモデルの学習プロセスに焦点を当て、実際のヒストリカル市場データを用いてその性能を評価します。


参照文献


記事で使用されたプログラム

# 名前 種類 詳細
1 Research.mq5 EA サンプル収集用EA
2 ResearchRealORL.mq5
EA
Real-ORL法を用いたサンプル収集用EA
3 Study.mq5 EA モデルのオフライン学習用EA
4 StudyOnline.mq5
EA
モデルのオンライン学習用EA
5 Test.mq5 EA モデルテスト用EA
6   Trajectory.mqh クラスライブラリ システム状態とモデルアーキテクチャ記述構造
7 NeuroNet.mqh クラスライブラリ ニューラルネットワークを作成するためのクラスのライブラリ
8 NeuroNet.cl コードライブラリ OpenCLプログラムコード


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

添付されたファイル |
MQL5.zip (2651.68 KB)
取引におけるニューラルネットワーク:Actor-Director-Critic(最終回) 取引におけるニューラルネットワーク:Actor-Director-Critic(最終回)
Actor-Director-Criticフレームワークは、古典的なエージェント学習アーキテクチャを発展させたものです。本記事では、その実装と金融市場環境への適応に関する実践的な経験を紹介します。
取引におけるニューラルネットワーク:適応型エージェント行動のための階層的スキル発見(最終章) 取引におけるニューラルネットワーク:適応型エージェント行動のための階層的スキル発見(最終章)
アルゴリズム取引への適用を目的としたHiSSDフレームワークの実装について解説します。スキル階層と適応的なアーキテクチャを活用して、安定的に機能する取引戦略を構築する方法を説明します。
取引におけるニューラルネットワーク:多変量時系列予測のためのLSTMの最適化(DA-CG-LSTM) 取引におけるニューラルネットワーク:多変量時系列予測のためのLSTMの最適化(DA-CG-LSTM)
時系列分析および予測に新たな手法を提供するDA-CG-LSTMアルゴリズムを紹介します。革新的なアテンション機構とモデルの柔軟性を活用することで、予測精度をどのように向上できるのかを解説します。
取引におけるニューラルネットワーク:適応的なエージェント行動のための階層的スキル発見(HiSSD) 取引におけるニューラルネットワーク:適応的なエージェント行動のための階層的スキル発見(HiSSD)
HiSSDフレームワークについて解説します。HiSSDは、階層的学習とマルチエージェントアプローチを組み合わせることで、適応性の高いシステムを構築するためのフレームワークです。この革新的な手法が金融市場に潜む隠れたパターンをどのように発見し、分散環境における取引戦略の最適化にどのように貢献するのかを詳しく見ていきます。