English Русский 中文 Español Português
preview
取引におけるニューラルネットワーク:概念強化を備えたマルチエージェントシステム(FinCon)

取引におけるニューラルネットワーク:概念強化を備えたマルチエージェントシステム(FinCon)

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

はじめに

金融市場は高いボラティリティと複雑性を持ち、最適な投資判断の実行は大きな課題となります。トレーダーやポートフォリオマネージャは、マクロ経済指標、テクニカルシグナル、市場参加者の行動要因など、多様なマルチモーダルデータを考慮する必要があります。これらの取り組みの目的は、リスクを最小化しつつリターンを最大化することです。

従来の金融機関では、データ処理や意思決定に複数の専門家が関与します。アナリストが市場調査をおこない、リスクマネージャが潜在的リスクを評価し、経営陣が戦略的意思決定をおこないます。しかし、階層構造があっても、人間要因や限られたリソースにより、急速な市場変化への迅速な対応は難しいことがあります。そのため、分析プロセスを加速し、人為的エラーを減らす自動化システムの活用が重要になっています。

現代の人工知能(AI)や金融技術(FinTech)の研究は、適応型ソフトウェアソリューションの開発に注力しています。これらのシステムは過去データから学習し、市場パターンを特定して意思決定に活かすことが可能です。最近注目されている方向性のひとつが自然言語処理(NLP)の統合です。金融ニュース、専門家予測、その他のテキストデータを分析し、予測精度やリスク評価の向上に貢献します。

こうしたシステムの有効性は、システムコンポーネント間の相互作用と継続的な自己学習能力に依存します。研究によれば、専門家間の協働作業をモデル化したシステムは性能が高く、新しいアプローチを取り入れることで市場変化への柔軟性も向上します。

FinMemFinAgentなどの既存のソリューションは、金融業務の自動化において一定の成果を示しています。しかし、短期的市場動向に偏る傾向があり、長期リスク管理の包括的手法は不足しています。計算リソースやアルゴリズム柔軟性の制約により、推奨の質が低下することもあります。

これらの課題を解決するため、論文「FinCon:A Synthesized LLM Multi-Agent System with Conceptual Verbal Reinforcement for Enhanced Financial Decision Making」では、FinConというマルチエージェントシステムを提案しています。FinConは株式取引やポートフォリオ管理を統合するよう設計されています。

FinConはプロの投資チームのワークフローをシミュレーションします。アナリストエージェントは、市場指標、ニュースフィード、履歴データなど、さまざまなソースからデータを収集して分析し、マネージャエージェントはこれらの洞察を統合して最終的な決定を下します。この設計により、冗長なコミュニケーションを減らし、計算リソースを最適化できます。

個別金融資産だけでなく、分散ポートフォリオにも対応しており、システムの汎用性が高くなっています。

FinConは分析モデルと機械学習アルゴリズムを用いてリアルタイムでリスク評価をおこないます。各取引エピソード後には事後分析をおこない、誤りを特定して新しいデータに基づきモデルを更新します。

実験結果では、FinConはリスク管理の改善とポートフォリオ全体のパフォーマンス向上に寄与することが示されています。


FinConアーキテクチャ

FinConアーキテクチャは、マネージャ・アナリストエージェントとリスクコントロールサブシステムという二層構造を特徴としています。この構造により、情報処理の効率化、エラー発生確率の低減、意思決定コストの最小化、さらに深い市場分析が可能となります。

FinConフレームワークは、投資会社の業務を最適化した組織構造に例えられます。すべてのリソースが最大限に効率化されており、主な目的は情報の認識・分析能力を向上させつつ、通信およびデータ処理のオーバーヘッドを最小化することにあります。

アナリストエージェントは、膨大な市場データから一次的な投資アイデアを抽出する重要な役割を担います。各エージェントは専門分野を限定することで、データの重複処理や認知負荷の過剰発生を防ぎます。参考実装では、フレームワークは7体のアナリストエージェントを使用しています。テキストエージェントは、ニュース記事、プレスリリース、財務報告書を解析し、潜在的なリスクや機会を特定します。オーディオエージェントは、企業経営陣の決算説明会など音声記録を解析し、感情のニュアンスや重要議論点を抽出します。データ解析・銘柄選定エージェントは、定量的指標を計算し、マネージャが高精度で市場動向を予測できるようサポートします。

アナリストエージェントのアウトプットは意思決定主体であるマネージャエージェントに集約されます。取引判断においてマネージャは、分析結果の統合、リアルタイムでのリスク監視、過去の意思決定の継続的レビュー、投資信念の洗練という4つの主要機能を実行します。

FinConは二層リスク管理メカニズムを実装しています。エピソード内リスク評価では、短期的損失を最小化するためにリアルタイムで修正行動を実行します。エピソード間リスク評価では、エピソード間の結果を比較し、戦略改善のためのミスを特定します。この二層アプローチにより、外部環境の変化に対するシステムの回復力が向上し、継続的な改善が促進されます。

投資信念の更新はモデル適応において極めて重要です。これにより、FinConはデータ抽出時にアナリストエージェントの注力ポイントを調整し、マネージャの意思決定ロジックを洗練させることができます。さらに、Actor–Criticメカニズムにより、FinConは与えられた取引目標に基づき定期的に取引戦略を最適化可能です。この手法は、成功および失敗行動の分析を活用することで、意思決定方策の継続的な改善に寄与します。

FinConのエピソディックリフレクションは、概念的言語強化(CVRF: Conceptual Verbal Reinforcement)と呼ばれる独自メカニズムによって支えられています。このコンポーネントは、連続する取引エピソードの効果を、アナリストの洞察とマネージャの意思決定を比較することで評価します。CVRFは重要な知見を取引戦略の特定側面に結びつけます。成功したエピソードとそうでないエピソードの概念的洞察を対比することで、モデルは投資信念の調整に関する推奨を生成します。これにより、エージェントは最も関連性の高い市場情報に集中でき、ポートフォリオ全体のパフォーマンス向上につながります。

投資信念の調整推奨はまずマネージャに伝達され、その後必要に応じてアナリストと共有されます。これにより、冗長なコミュニケーションを最小化し、情報過多を防止します。この手法は、連続する学習経路間での取引行動の重複割合を測定することで、システム効率を向上させます。特に各エージェントが明確に専門化された役割を持つ環境では、モデル全体のシナジーが促進されます。

FinConは、高度な記憶モジュールを備えており、作業記憶、手続き記憶、エピソード記憶の3つの主要コンポーネントに分かれています。

作業記憶は現行の処理に必要なデータを一時的に保持し、大量の情報を高速に処理しつつ文脈を維持することが可能です。

手続き記憶は、過去のエピソードで成功したアルゴリズムや戦略を保持し、この記憶は、再発タスクへの迅速な適応や、実績のある手法の再利用を可能にします。

エピソード記憶は重要なイベント、行動、成果を記録し、高レベルの方策改善において特に重要です。この記憶タイプは、過去の成功や失敗を学習に活かすことで、将来のパフォーマンス向上に貢献します。

FinConの階層構造により、非常に効果的かつ高い適応性を持つシステムとなっています。以下にフレームワークのオリジナル可視化図を示します。

著者によるFinConフレームワークの可視化


MQL5での実装

FinConフレームワークの理論的側面を検討した後は、記事の実践部分に移ります。ここでは、提案された概念をMQL5を用いてどのように実装できるかを示します。

まず重要なのは、オリジナルのFinConフレームワークは事前学習済みの大規模言語モデル(LLM)の使用を前提として構築されている点です。私たちのプロジェクトでは言語モデルは使用せず、MQL5環境内で利用可能なツールのみを用いて、提案された原則を実装します。それでは、まず記憶モジュールの近代化から始めましょう。

記憶モジュールの近代化アプローチ


以前に開発した記憶ブロックは、異なるアーキテクチャ設計を持つ2つの再帰モジュールで構成されていました。この設計により、情報の減衰速度が異なる二層記憶システムを構築可能となり、多様なタスクに対して柔軟かつ適応的に機能します。特に、短期的および長期的な依存関係の両方を考慮する必要がある状況で有効です。

このモデルでは、減衰速度は明示的に定義されているわけではなく、再帰モジュール間の構造的差異によって自然に生じます。一方のモジュールは短期記憶に特化し、情報の迅速な更新を担います。もう一方は長期依存に対応し、重要なデータを長期間保持します。これらの構造的な違いにより、処理速度と分析の深さの間で自然なバランスが生まれます。

記憶ブロック内の情報は、再帰モジュールの隠れ状態に格納されます。この方式により記憶使用量を大幅に削減できますが、特定のエピソードを抽出・比較する際には課題も生じます。しかし、この能力は概念検証メカニズムを実装する上で不可欠であり、現在のコンテキストを過去に格納されたエピソードと比較する必要があります。

さらに、FinConフレームワークの設計者は、より精密な分析と予測をおこなうために三層記憶システムの重要性を強調しています。そのため、既存の記憶ブロックには追加のエピソード記憶層を導入する必要があります。

記憶モジュールの最適化プロセスには、いくつかの重要なステップが含まれます。まず第一に、計算リソースの使用を最小限に抑えることが挙げられます。これは、データ圧縮アルゴリズムを統合することで実現可能です。これらのアルゴリズムは冗長な情報を排除し、エピソードごとの記憶使用量を削減しつつ、データの本質的な特徴を維持します。

次に、関連情報への高速かつ正確なアクセスを確保することが重要です。この目的のために、ベクトル類似度アルゴリズムの活用が推奨されます。これにより、システムは現在のエピソードに最も類似した過去のエピソードを迅速に特定でき、リアルタイムアプリケーションで不可欠な機能を提供します。

このようにして近代化された記憶ブロックは、モデル全体の効率向上の基盤となります。データをコンパクトに保存できるだけでなく、関連情報への迅速なアクセスも保証されるため、意思決定プロセスを大幅に強化することが可能です。

新しい記憶モジュールの実装


提案されたメソッドは、新しいオブジェクトCNeuronMemoryDistil内で実装されます。その構造を以下に示します。

class CNeuronMemoryDistil  :  public CNeuronMemory
  {
protected:
   CNeuronBaseOCL       cConcatenated;
   CNeuronTransposeOCL  cTransposeConc;
   CNeuronConvOCL       cConvolution;
   CNeuronEmbeddingOCL  cDistilMemory;
   CNeuronRelativeCrossAttention cCrossAttention;
   //---
   virtual bool      feedForward(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool      calcInputGradients(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool      updateInputWeights(CNeuronBaseOCL *NeuronOCL) override;

public:
                     CNeuronMemoryDistil(void) {};
                    ~CNeuronMemoryDistil(void) {};
   //---
   virtual bool      Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                          uint window, uint window_key, uint units_count,
                          uint heads, uint stack_size,
                          ENUM_OPTIMIZATION optimization_type, uint batch);
   //---
   virtual int       Type(void) override
 const   {  return defNeuronMemoryDistil; }
   //---
   virtual bool      Save(int const file_handle) override;
   virtual bool      Load(int const file_handle) override;
   //---
   virtual bool      WeightsUpdate(CNeuronBaseOCL *source, float tau) override;
   virtual void      SetOpenCL(COpenCLMy *obj) override;
   //---
   virtual bool      Clear(void) override;
  };

実装では、親クラスとして以前に開発した記憶オブジェクトを用い、そこから全てのコアインターフェースおよび短期記憶・長期記憶用の2つの再帰モジュールを継承しています。新しいクラス内で宣言される内部オブジェクトは、エピソード記憶の基盤を形成します。これにより、特定のエピソードに対応するデータの保存および処理が可能となります。各オブジェクトは全体の記憶構造の中で専門的な役割を果たし、より精密で包括的なデータ分析を実現します。各オブジェクトの機能は、記憶モジュールのメソッド実装時に詳細に説明されます。

すべての内部オブジェクトはクラスメンバとして宣言されており、コンストラクタおよびデストラクタは空のままにしています。この設計により、オブジェクトの生成や破棄時のエラーリスクを最小化し、記憶使用の最適化とシステム安定性の向上が図れます。

継承されたオブジェクトおよび新たに宣言されたオブジェクトの初期化は、Initメソッド内でおこなわれます。このメソッドのパラメータには、オブジェクトのアーキテクチャを定義する定数が含まれており、モデルを特定タスク向けに柔軟に設定しつつ、一貫性と機能性を維持することが可能です。

bool CNeuronMemoryDistil::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                               uint window, uint window_key, uint units_count,
                               uint heads, uint stack_size,
                               ENUM_OPTIMIZATION optimization_type, uint batch)
  {
   if(!CNeuronRelativeCrossAttention::Init(numOutputs, myIndex, open_cl, window,
                                         window_key, units_count, heads, window,
                                       2 * stack_size, optimization_type, batch))
      return false;

メソッド本体では、通常、対応するパラメータを渡した上で親クラスのInitメソッドを呼び出し、継承されたオブジェクトを初期化します。しかし、このオブジェクトの特性上、ベースとなる記憶モジュールの初期化メソッドをそのまま使用することはできません。その代わりに、ベース記憶モジュールの親クラスにあたるクロスアテンションオブジェクトの同等のメソッドを使用します。これにより、新しいアーキテクチャを構成するすべての要素において一貫性と正しい動作が保証されます。

今後、記憶モジュールの出力は、エピソード記憶の文脈に基づいて現在の状態を解析することが想定されています。この処理において、クロスアテンションブロックは極めて重要な役割を果たし、主に2つの機能を担います。第一の機能は、最も関連性の高いエピソードを特定することです。このタスクの実装には、アテンション機構における依存係数の基盤となるベクトル類似度アルゴリズムが使用されます。

クロスアテンションブロックの第二の機能は、選択されたエピソードの文脈情報を用いて、元の状態表現を拡張することです。これにより、より完全で情報量の多い表現が生成され、データ処理の質および意思決定の精度が向上します。

初期化時には、入力データに関するパラメータをクロスアテンションオブジェクトに渡し、コンテキストシーケンス長はエピソード記憶バッファサイズの2倍に設定します。これは、短期記憶および長期記憶モジュールの両方からの結果を格納するためです。

クロスアテンションオブジェクトの初期化が完了した後、継承された短期および長期の再帰モジュールの初期化メソッドを呼び出します。この処理手順は、親クラスのメソッドからそのまま踏襲しています。

   uint index = 0;
   if(!cLSTM.Init(0, index, OpenCL, iWindow, iUnits, optimization, iBatch))
      return false;
   index++;
   if(!cMamba.Init(0, index, OpenCL, iWindow, 2 * iWindow, iUnits, optimization,
                                                                        iBatch))
      return false;

これらのモジュールの出力は単一のバッファに連結され、短期記憶と長期記憶の両方に同時にアクセスできるようになります。この目的のために、十分なサイズを持つベースオブジェクトが生成されます。

   index++;
   if(!cConcatenated.Init(0, index, OpenCL, 2 * iWindow * iUnits, optimization,
                                                                       iBatch))
      return false;
   cConcatenated.SetActivationFunction(None);

次に、連結された情報は圧縮され、エピソード記憶の格納オブジェクトへ統合されます。

単一の環境状態を表すマルチモーダル時系列データを扱うため、圧縮処理においてはユニット系列の主要な特性を保持することが重要です。そのため、二段階の圧縮アプローチを実装しています。最初の段階では、各ユニット系列を個別に予備圧縮し、本質的な特徴を抽出すると同時に、データの整合性を損なうことなく情報量を削減します。

連結されたテンソルは、データを単変量系列として表現するために転置されます。

   index++;
   if(!cTransposeConc.Init(0, index, OpenCL, iUnits, 2 * iWindow, optimization,
                                                                       iBatch))
      return false;

その後、データは畳み込み層を用いて圧縮されます。

   index++;
   if(!cConvolution.Init(0, index, OpenCL, iUnits, iUnits, iWindowKey, iWindow,
                                                      1, optimization, iBatch))
      return false;
   cConvolution.SetActivationFunction(GELU);

エピソード記憶を保存するために、埋め込み層を適用します。この層では、部分的に圧縮された状態がコンパクトな潜在表現へ投影され、固定長のFIFO (First In, First Out)記憶スタックに追加されます。

各テンソルブロックは、学習可能な射影行列を用いて潜在空間へ投影されます。これらの行列は、マルチモーダルな生データを統一された表現へ変換します。このアプローチにより、後続の解析が簡素化され、異なる情報源からのデータ統合時に一貫性が保たれます。このケースでは、対象は短期および長期記憶モジュールです。

   index++;
   uint windows[] = {iWindowKey * iWindow, iWindowKey * iWindow};
   if(!cDistilMemory.Init(0, index, OpenCL, iUnitsKV / 2, iWindow, windows))
      return false;

前述の通り、生データをエピソード記憶の文脈で解析する処理は、クロスアテンションのベースオブジェクトによっておこなわれます。より包括的な解析を実現するため、短期および長期記憶の文脈内でソースデータを処理する追加のクロスアテンションオブジェクトを導入します。このアプローチにより、記憶タイプ間の相乗効果を捉えることが可能になります。

先に作成した連結オブジェクトは、この統合処理を簡素化します。その結果、単一のクロスアテンションオブジェクトで両方の記憶モジュールを考慮しつつデータを強化でき、計算資源の最適化と解析精度の向上が実現されます。

   index++;
   if(!cCrossAttention.Init(0, index, OpenCL, iWindow, iWindowKey, iUnits, iHeads,
                                       iWindow, 2 * iUnits, optimization, iBatch))
      return false;
//---
   return true;
  }

すべての内部オブジェクトの初期化が完了すると、メソッドは論理値を呼び出し元のプログラムに返します。

次に、新しいブロックに対する順伝播処理をfeedForwardメソッド内で構築します。

bool CNeuronMemoryDistil::feedForward(CNeuronBaseOCL *NeuronOCL)
  {
   if(!cLSTM.FeedForward(NeuronOCL))
      return false;
   if(!cMamba.FeedForward(NeuronOCL))
      return false;

メソッドのパラメータでは、ソースデータオブジェクトへのポインタを受け取り、直ちに短期および長期の再帰モジュールへ渡します。それらの出力は単一のデータバッファに連結されます。

   if(!Concat(cLSTM.getOutput(), cMamba.getOutput(), cConcatenated.getOutput(),
                                                     iWindow, iWindow, iUnits))
      return false;
   if(!cTransposeConc.FeedForward(cConcatenated.AsObject()))
      return false;

ここで重要なのは、データ連結を各タイムステップ単位でおこなっている点です。この段階的な連結により、すべてのユニット系列の構造が保持されます。

連結されたテンソルは転置され、畳み込み層によって圧縮されます。

   if(!cConvolution.FeedForward(cTransposeConc.AsObject()))
      return false;

圧縮された表現は、埋め込み層を介してエピソード記憶へ投影されます。

   if(!cDistilMemory.FeedForward(cConvolution.AsObject()))
      return false;

この時点で、記憶ブロックの3つのレベルすべてに必要な情報が保存されています。次に、重要なイベントの文脈を用いて現在の環境状態を強化します。まず、短期および長期記憶の文脈内でソースデータを解析します。

   if(!cCrossAttention.FeedForward(NeuronOCL, cConcatenated.getOutput()))
      return false;

続いて、エピソード記憶の文脈を用いてデータを強化します。

   return CNeuronRelativeCrossAttention::feedForward(cCrossAttention.AsObject(),
                                                     cDistilMemory.getOutput());
  }

論理結果が呼び出し元のプログラムへ返されます。

順伝播メソッドの実装が完了した後、誤差逆伝播アルゴリズムの実装に進みます。バックプロパゲーション処理は、以下の2つの主要メソッドで構成されます。

  • calcInputGradients:誤差勾配を伝播
  • updateInputWeights:モデルパラメータを更新

誤差勾配分配メソッドにおけるデータフローは、順伝播アルゴリズムを逆順に辿る形となります。

calcInputGradientsメソッドのパラメータでは、順伝播時と同じソースデータオブジェクトへのポインタを受け取りますが、今回はモデル最終出力に対するデータの影響に対応する誤差勾配を伝播します。

bool CNeuronMemoryDistil::calcInputGradients(CNeuronBaseOCL *NeuronOCL)
  {
   if(!NeuronOCL)
      return false;

メソッド冒頭では、受け取ったポインタの有効性を直ちに検証します。無効な場合、以降の処理は意味を持たないためです。

順伝播処理はクロスアテンション親クラスのメソッド呼び出しで終了しているため、誤差勾配の分配処理も同一オブジェクトの対応メソッドから開始されます。この段階では、記憶階層内の情報フローを通じて勾配が伝播されます。

  if(!CNeuronRelativeCrossAttention::calcInputGradients(cCrossAttention.AsObject(),
                                                         cDistilMemory.getOutput(),
                                                       cDistilMemory.getGradient(),
                                      (ENUM_ACTIVATION)cDistilMemory.Activation()))
      return false;

エピソード記憶の勾配は、データ圧縮層を経由して短期・長期記憶の連結オブジェクトのレベルまで伝播されます。

   if(!cConvolution.calcHiddenGradients(cDistilMemory.AsObject()))
      return false;
   if(!cTransposeConc.calcHiddenGradients(cConvolution.AsObject()))
      return false;
   if(!cConcatenated.calcHiddenGradients(cTransposeConc.AsObject()))
      return false;

ただし、この連結オブジェクトは、両記憶タイプの文脈における入力データ解析にも使用されているため、第二の情報フローを通じて誤差勾配を伝播させる必要があります。

   if(!NeuronOCL.calcHiddenGradients(cCrossAttention.AsObject(),
                                     cConcatenated.getOutput(),
                                     cConcatenated.getPrevOutput(),
                                     (ENUM_ACTIVATION)cConcatenated.Activation()))
      return false;

この場合、誤差勾配の取得には、連結オブジェクト専用のバッファではなく空きバッファを使用します。これにより、既に計算済みのデータを保持し、重要な情報の上書きを防ぎます。

次に、両方の情報フローから得られた値を加算し、結果の勾配を対応する記憶オブジェクトへ分配します。

   if(!SumAndNormilize(cConcatenated.getGradient(), cConcatenated.getPrevOutput(),
                       cConcatenated.getGradient(), iWindow, false, 0, 0, 0, 1) ||
      !DeConcat(cLSTM.getGradient(), cMamba.getGradient(), 
                cConcatenated.getGradient(), iWindow, iWindow, iUnits))
      return false;

ここで重要なのは、データの歪みを防ぐため、連結オブジェクトには意図的に活性化関数を適用していない点です。短期および長期記憶モジュールでは異なる活性化関数が使用される可能性があるためです。ただし、誤差勾配を各記憶モジュールに分配した後は、それぞれのオブジェクトに活性化関数が設定されているかを確認し、設定されている場合は対応する微分を用いて勾配を補正します。

   if(cLSTM.Activation() != None)
      if(!DeActivation(cLSTM.getOutput(), cLSTM.getGradient(), 
                       cLSTM.getGradient(), cLSTM.Activation()))
         return false;
   if(cMamba.Activation() != None)
      if(!DeActivation(cMamba.getOutput(), cMamba.getGradient(), 
                       cMamba.getGradient(), cMamba.Activation()))
         return false;

この時点で、誤差勾配を短期および長期記憶の処理パイプラインに沿って、元の入力データレベルまで伝播させます。ただし、このオブジェクトの勾配バッファには、既に文脈解析によって得られたデータが含まれているため、それらを保持する目的で、追加処理の前に一時的にバッファポインタを入れ替える必要があります。

   CBufferFloat *temp = NeuronOCL.getGradient();
   if(!NeuronOCL.SetGradient(cConcatenated.getPrevOutput(), false) ||
      !NeuronOCL.calcHiddenGradients(cLSTM.AsObject()) ||
      !SumAndNormilize(temp, NeuronOCL.getGradient(), temp, iWindow,
                                                  false, 0, 0, 0, 1))
      return false;

この置換が完了した後、対応する記憶モジュールの情報フローに沿って誤差勾配を順次伝播し、新たな値を既存の蓄積データに加算します。

   if(!NeuronOCL.calcHiddenGradients(cMamba.AsObject()) ||
      !SumAndNormilize(temp, NeuronOCL.getGradient(), temp, iWindow,
                                               false, 0, 0, 0, 1) ||
      !NeuronOCL.SetGradient(temp, false))
      return false;
//---
   return true;
  }

この処理の後、バッファポインタを元の状態に戻します。操作結果の論理値を呼び出し元プログラムへ返し、メソッドの実行を完了します。

以上で、近代化された記憶ブロックCNeuronMemoryDistilに実装されたメソッドの検証を終了します。オブジェクトとその全メソッドの完全なコードは、付録にて参照可能です。

次の作業段階では、アナリストエージェントオブジェクトの構築に進みますが、記事の長さの上限が近づいているため、ここで一旦区切り、次回のパートで作業を継続します。


結論

本記事では、金融分野における意思決定の高度化を目的として設計された、革新的なマルチエージェントシステムであるFinConフレームワークについて解説しました。このフレームワークは、階層的な「manager–analyst」相互作用構造と、概念的言語強化メカニズムを統合しており、エージェント間の協調動作と効果的なリスク管理を可能にします。これらの特性により、モデルは動的な市場環境において高い適応性とパフォーマンスを発揮し、幅広い金融タスクを成功裏に処理できます。

実践セクションでは、提案されたアプローチをMQL5を用いて実装し始めました。この作業は次回の記事で継続され、実際の過去市場データを用いて、実装されたソリューションの性能および効率性を評価する予定です。


参照文献


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

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

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

添付されたファイル |
MQL5.zip (2352.32 KB)
MQL5で自己最適化エキスパートアドバイザーを構築する(第16回):教師あり学習を用いた線形システム同定 MQL5で自己最適化エキスパートアドバイザーを構築する(第16回):教師あり学習を用いた線形システム同定
線形システム同定は、教師あり学習アルゴリズムにおける誤差補正の学習と組み合わせることができます。これにより、統計的モデリング手法に依存したアプリケーションを構築しつつも、モデルが前提とする厳格な仮定の脆弱性を必ずしも引き継ぐことなく設計することが可能になります。従来の教師あり学習アルゴリズムには多くの要件がありますが、それらはフィードバックコントローラーと組み合わせることで補完でき、モデルを補正しながら現在の市場環境に適応させることができます。
初心者からエキスパートへ:パラメータ制御ユーティリティ 初心者からエキスパートへ:パラメータ制御ユーティリティ
従来のEAやインジケーターの入力プロパティを、リアルタイムで操作可能なオンチャートのコントロールインターフェースへと変換することを想像してみてください。本記事は、これまでに取り組んできたMarket Periods Synchronizerインジケーターでの基礎的な成果を土台とし、上位足(HTF)の市場構造を可視化し、管理する手法を大きく進化させるものです。ここでは、その概念を完全にインタラクティブなユーティリティへと昇華させ、動的な操作性と強化されたマルチタイムフレーム(MTF)のプライスアクションの可視化を、チャート上に直接統合したダッシュボードとして実装します。この革新的なアプローチが、トレーダーとツールの関わり方をどのように変えていくのか、一緒に見ていきましょう。
取引におけるニューラルネットワーク:概念強化を備えたマルチエージェントシステム(最終回) 取引におけるニューラルネットワーク:概念強化を備えたマルチエージェントシステム(最終回)
FinConフレームワークの著者によって提案されたアプローチの実装を続けます。FinConは、大規模言語モデル(LLM)をベースとしたマルチエージェントシステムです。本日は、必要なモジュールを実装し、実際の過去データを用いたモデルの包括的なテストをおこないます。
リスク管理(第1回):リスク管理クラス構築の基礎 リスク管理(第1回):リスク管理クラス構築の基礎
本記事では、取引におけるリスク管理の基礎を解説し、適切なロットサイズやストップロスを計算するための最初の関数の作成方法を学びます。さらに、これらの機能がどのように動作するのかを、各ステップを追いながら詳しく説明します。本記事の目的は、自動売買においてこれらの概念をどのように適用するかを明確に理解することです。最後に、インクルードファイルを使用したシンプルなスクリプトを作成し、すべてを実践に落とし込みます。