English Русский 中文 Español Português
preview
取引におけるニューラルネットワーク:特定データへの依存なしに時系列を汎化する(Mamba4Cast)

取引におけるニューラルネットワーク:特定データへの依存なしに時系列を汎化する(Mamba4Cast)

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

はじめに

市場は容赦なく、しかも予測しにくい存在です。市場のシグナルを読み誤った者に、二度目のチャンスは与えられません。これは特に今日の市場に当てはまります。ニュースは、1分足チャートで1本のローソク足が形成されるよりも速く市場に広がります。現代のトレーダーは、過去を分析しているのではなく、データストリームの中から今まさに現れ始めている兆候を捉えています。他者よりも早く新たなパターンを検出できれば、それは競争上の優位性につながります。そのため、現在のアルゴリズムには、イベントが明確になる前に予測をし、なおかつモデルの大規模なチューニングや保守に伴う技術的負担を可能な限り抑えることが求められています。

この競争の中で、従来のモデル、特にリカレントアーキテクチャは、その限界を見せ始めています。これらのモデルは、繰り返し現れるパターンを認識し、時系列情報を保持することには優れています。しかし、実際の市場が示す複雑で不規則な振る舞いへの対応は得意ではありません。急激な変動を十分に捉えられず、価格ギャップや外れ値への耐性も低く、新しい市場環境ごとに適応が必要になります。今日の市場では、より柔軟で予測性能の高いアプローチが求められています。

Transformerベースのアーキテクチャは、特に長期時系列予測において予測精度を大幅に向上させました。しかし、その代償として、計算量とアーキテクチャの複雑さが大きく増加しました。データセットが大規模化し、予測期間が長くなるにつれて、これらのモデルはリアルタイム処理への適用が難しくなります。実運用では、より多くの計算資源、より長い処理時間、そしてより複雑なシステム運用が必要になることを意味します。

このような背景のもとで提案されたのがMamba4Castフレームワークです。このフレームワークは論文「Mamba4Cast:Efficient Zero-Shot Time Series Forecasting with State Space Models」で発表されました。このフレームワークは、2つの重要なアイデアを基盤としています。1つ目は、軽量でありながら高い表現力を持つMambaアーキテクチャ、もう1つは革新的なPrior-data Fitted Networks (PFN)の概念です。この2つを組み合わせることで、特にトレーディングのような変化の激しい分野における時系列予測の新たなアプローチを実現しています。

PFNの考え方は、従来の学習手法とは根本的に異なります。一般的な方法では、まず1つのデータセットで事前学習をおこない、その後、別のデータセットに対して大規模なファインチューニングを実施します。一方、PFNでは、膨大な数の人工的に生成されたタスクを用いて事前学習をおこないます。つまり、1つの実世界の問題から学習するのではなく、不完全ではあるものの、多種多様な数百万ものシナリオから学習します。この学習方法により、モデルは高い汎用性を獲得し、新しいデータにも強い適応能力を持つようになります。取引の観点では、モデルが特定の金融商品や時間足に依存せず、その場で新しい環境へ適応できることを意味します。

Mamba4Castフレームワークは、このPFNの思想を全面的に採用しています。さまざまな市場状況を再現した人工データを利用することで、幅広い振る舞いの範囲を獲得します.その結果、高いボラティリティや不安定な市場環境においてもパターンを一般化できる、いわば「市場の直感」のような能力を獲得します。

もう1つの重要な特徴はMambaアーキテクチャです。Mambaはシーケンス長に対して線形の計算量を持ちます。TransformerのようにAttention行列に対する二次計算を必要としないため、長い入力系列でも効率良く処理できます。トレーダーにとって特に重要なのは、Mamba4Castが予測ウィンドウ全体を1回のパスで予測できる点です。これにより、自己回帰型予測で蓄積しやすい誤差を大幅に低減するとともに、市場環境の変化にも迅速に対応できます。

さらに、このモデルは複数ステップ先まで同時に予測できるため、シグナル解析から売買判断までを一体化したエンドツーエンドの売買システムの構築にも適しています。Mamba4Castは、単なる指針にとどまらず、自動売買システムの予測モデルを支える中核コンポーネントとなる可能性を持っています。


Mamba4Castフレームワークアルゴリズム

Mamba4Castフレームワークは、時系列予測システムの進化における意欲的かつ有望なアプローチです。その中核には、厳密な数学的基盤と柔軟な深層学習アルゴリズムが組み合わされており、市場を「過去・現在・未来が相互に結び付いた複雑なシステム」として扱います。

従来のモデルでは、通常、単一銘柄の過去データを用いて学習をおこない、そこで学習した関係性を再現します。この方法は従来は高い性能を発揮しましたが、市場がますます動的になり、将来の出来事の予測が困難になった現在では限界が見え始めています。Mamba4Castはこれとは異なるアプローチを採用しています。特定の過去時系列を記憶する代わりに、Prior-data Fitted Networks (PFN)の考え方を利用します。これは、実際の1銘柄の価格履歴ではなく、トレンド相場、レンジ相場、大きなボラティリティ発生前の静かな期間、ニュースによる急変動など、無数の人工的な市場シナリオだけでアナリストを訓練することをイメージすると分かりやすいでしょう。これにより、任意の金融商品に対して追加調整なしでそのまま機能する、汎用的な市場知能が形成されます。

システムの中核には、状態空間モデル(SSM)に基づくMambaアーキテクチャ があります。Transformersの計算負荷が高いSelf-Attention層とは異なり、Mambaはシーケンス長に対して線形計算で処理をおこないます。そのため、計算コストの急激な増大を招くことなく、数百から数千ステップに及ぶ長い系列を処理できます。この高い効率性は、計算速度を向上させるだけでなく、一瞬の遅延が大きな影響を与えるリアルタイム市場分析にも適しています。その結果、高頻度のストリーミングデータを変動の激しい市場環境で効率良く処理できる計算効率の高いアーキテクチャとなっています。

最初の段階では、入力時系列に対して標準的なMin-Max正規化を適用します。各値xtは次式に従って変換されます。

ここで、xminおよびxmaxは、学習データセット全体から求められる最小値および最大値です。この処理により、特徴量間のスケール差が取り除かれ、効率的な学習が可能になります。

続いて、前処理の重要な部分である位置エンコーディングをおこないます。分、時、曜日、月内の日、月、年といった各タイムスタンプ要素を個別に抽出し、それぞれをベクトル表現へ変換します。アルゴリズムでは、Transformerの位置エンコーディングに類似した正弦・余弦エンコーディングを採用していますが、時系列の周期性に合わせて適応されています。各時間要素について、対応する周期と2のべき乗を利用して、複数の正弦波および余弦波成分を計算します。

ここで、Tは対象時間要素の周期、iは時点、jは周波数スペクトル内の周波数インデックスを表します。

これらのベクトルは、複数の時間スケールにおける時間依存性を表現し、日内周期、季節性、およびマクロ経済サイクルをモデルが捉えられるようにします。

その後、これらの時間埋め込みは、正規化された時系列データと連結されます。こうして得られたベクトルが、その時点に対応する埋め込み表現となります。

次に、この系列は複数のコーザル畳み込み(Causal Convolutional)層によって処理されます。異なるカーネルサイズを持つ複数の畳み込みを並列に適用することで、多様な時間スケールの特徴を抽出します。各畳み込みは、それぞれ異なる時間範囲の情報を捉えます。局所的な変動から長期トレンドまでを学習し、その出力は各時点の豊かな特徴表現として統合されます。これは金融データにおいて特に重要です。1本のローソク足は、短期的な市場インパルスを表す一方で、長期トレンドの一部でもあるためです。

続いて、この表現はより高次元空間へ射影され、モデルの中核ブロックへ入力できる形式へ変換されます。この段階では、改良版inception層が導入されます。異なるサイズの畳み込みカーネルを組み合わせることで、局所的特徴と大域的特徴を同時に統合します。その結果、各時点の特徴表現には複数レベルの抽象化情報が含まれ、出力次元を維持しながら、欠損値やノイズに対する高い頑健性も確保されます。

アーキテクチャの中核は、Mambaベースのブロックです。これは、シーケンス長に対して線形計算量を持つ状態空間モデル(SSM)の実装です。各ブロックでは、行列A、B、C、Dを用いた一般化状態空間モデルを実装し、これらの行列は他のモデルパラメータとともに学習されます。

この仕組みにより、各時点の状態は、前時刻の状態と現在の入力の両方に依存して更新されます。その結果、長期的な記憶を安定して保持しながら、市場状況への柔軟な適応も可能になります。各Mambaブロックの後にはレイヤー正規化(Layer Normalization)が配置されます。これにより、活性化分布の偏りが除去され、活性化値が正規化されるため、学習がより安定します。さらに、その後には追加の因果畳み込み層が配置され、時間方向の情報伝播を補強します。

これらのブロックの積み重ね数は、必要な表現能力に応じて変更できます。下位層では、急激な反発、モメンタム、ニュースによる変動など、短期市場の挙動を学習します。上位層では、市場サイクル、季節性、繰り返し現れるパターンなど、より広い時間スケールの特徴を学習します。つまり、このブロック群全体は、各層が異なる時間周波数帯域を担当するニューラルスペクトラムとして機能します。

最終段階はデコーダです。すべての活性化値は線形層によって1つ以上の出力チャネルへ射影されます。予測の不確実性も推定する場合には、専用の予測ヘッドが予測分散の対数値を出力します。

分類問題では、Softmax予測ヘッドによって各クラスの確率が出力されます。

Mamba4Castの最も特徴的な性質の1つがZero-Shot汎化能力です。これを実現するため、著者らは膨大な人工データセットを用いた独自の事前学習を導入しています。このデータセットには、確率微分方程式(SDE)によって生成された時系列、反転、保ち合い、モメンタムインパルスなどの手作業で設計されたパターンさらにランダム生成されたルールが含まれています。

学習では、平均二乗誤差(MSE)、負の対数尤度(NLL)、レジーム遷移予測用のクロスエントロピー損失を同時に利用します。これにより、モデルは市場パターンに対する堅牢で汎用的な理解を獲得し、新しい金融商品や時間足にも適応できるようになります。

これらの特徴を総合すると、Mamba4Castは単なる実験的なモデルではなく、予測型取引システム、市場レジーム検出、ボラティリティ予測などを構築するための実用的な基盤を提供するフレームワークであると言えます。

著者らが作成したMamba4Castフレームワークの可視化を以下に示します。


MQL5での実装

Mamba4Castアーキテクチャの理論的基盤を探求してきたので、今度は実践的な側面に移り、そのコアコンポーネントをMQL5で実装します。まず最初に実装するのは、その中核コンポーネントである時間位置エンコーディングモジュールです。このモジュールがなければ、現代の時系列予測モデルは、解析対象のシーケンスを真の時間軸として正しく解釈することができません。

当ライブラリには、単純な正弦波エンコーディングから学習可能な埋め込みテーブルまで、従来型の位置エンコーディングがすでに複数実装されています。しかし、それらはいずれも時系列を単なる順序付けられた要素の列として扱っており、各観測値が実際に記録されたタイムスタンプは考慮していません。一方、Mamba4Castの著者らは、各時点を実際の時間情報、すなわち分、時、曜日、日、月、さらには年を含む時間的コンテキストに基づいてエンコードすべきであると主張しています。これらの時間要素はいずれも市場のダイナミクスに影響を与えるためです。この手法では、各時間要素に対して独立した正弦波分解が構築されます。そのため、最初に実装するコンポーネントは、この時間情報を深く表現するためのモジュールになります。

この段階は、モデルが時間をどのように認識するかを根本的に決定します。時間を単なるバーの並びではなく、正確な時刻に発生したイベントの連続として扱えるようになります。タイムスタンプを適切に表現できなければ、どれほど高度なアルゴリズムであっても十分な性能は期待できません。市場は、分、時間、曜日によって異なる反応を示すためです。

OpenCL側での時間エンコーディング

強力ではあるものの実装が複雑な、あらかじめ調和関数のルックアップテーブルを用意する方法ではなく、本実装ではOpenCLカーネルを用いて、実際のタイムスタンプからリアルタイムに位置エンコーディングを計算します。この方法により、大規模な正弦・余弦テーブルをメモリ上に保持する必要がなくなります。また、隣接する時点間で発生しやすい段差も回避でき、さらにエキスパートアドバイザー(EA)の実装も大幅に簡素化されます。

このアプローチでは、各時点は数値特徴量(価格、出来高、各種インジケータ)とイベントが発生したタイムスタンプの2種類の情報を持った状態でOpenCLカーネルへ入力されます。カーネル内部では、このタイムスタンプがベクトル表現へ変換されます。このベクトルによって、モデルはイベントが取引セッションの最も活発な時間帯に発生したのか、それとも週末の閑散時間帯だったのか、あるいは月初なのか年末なのかを正確に認識できるようになります。

このアプローチには、いくつかの明確な利点があります。第一に、完全に滑らかな位置エンコーディングを生成できるため、隣接する埋め込みベクトル間に人工的な不連続が発生しません。第二に、ルックアップテーブルを不要にすることで、コード量が削減され、同期処理も簡素化されるほか、プラットフォーム上でのメモリ使用量も削減されます。第三に、埋め込みベクトルをその場で計算するため、柔軟性が大幅に向上します。設定や期間を変更してもテーブルを作り直す必要はなく、周期値を変更するだけで新しい要件に即応できます。

OpenCL側で時間エンコーディングを付加するアルゴリズムでは、各バーに対して、そのバーが各時間周期内のどの位置で形成されたかを表す固有の調和ベクトルを付加します。TSPositionEncoderカーネルは、次の3つの配列へのポインタを受け取ります。

  • 入力データを格納したdata配列
  • タイムスタンプを格納したtime配列
  • 各カレンダー周期の長さを定義したperiod配列

__kernel void TSPositonEncoder(__global const float2* __attribute__((aligned(8))) data,
                               __global const float* time,
                               __global float2* __attribute__((aligned(8))) output,
                               __global const float* period
                              )
  {
   const int id = get_global_id(0);
   const int freq = get_global_id(1);
   const int p = get_global_id(2);
   const int total = get_global_size(0);
   const int freqs = get_global_size(1);
   const int periods = get_global_size(2);

このカーネルは、3次元の実行空間で実行されます。

  • 解析対象シーケンスの長さ(時間ステップ数)
  • 各周期に対する高調波の数
  • 周期の数

カーネル本体では、各実行スレッドがまず、この3つの次元における自身の座標を取得します。

次に、各時間ステップ(インデックスid)、各周期(p)、およびその周期に対応する各高調波(freq)について、周期内の位置を表す座標を計算します。具体的には、実際の時刻を周期長で割ることで、絶対時刻time[id]を経過した周期数へ変換します。さらに、その小数部分にπ2^(freq+1)を乗算します。こうして得られた値valが、正弦関数および余弦関数の引数となります。このとき、第1高調波は周期全体を表現し、第2高調波は周期を2分割、第3高調波は4分割というように、以降も高調波の次数が増えるごとに周期をより細かく表現できるようになります。

   const int shift = id * freqs + freq;
   const float2 d = data[shift * periods + p];
   const float t = time[id] / period[p];
   float val = M_PI_F * t * pow(2.0f, freq + 1);

次に、この値を元の埋め込みベクトルへ加算します。各OpenCLスレッドは、現在の時間ステップ、高調波、および時間周期に対応するdata配列から2つの値を読み込みます。そして、第1要素にsin(val)、第2要素にcos(val)をそれぞれ加算します。最後に、得られたベクトルを出力バッファへ保存します。この処理により、時系列の各時点には、カレンダーパターン内での位置を正確に表現する追加の特徴量が付与されます。

   output[shift * periods + p] = (float2)(d.s0 + sin(val), d.s1 + cos(val));
  }

このアプローチの利点は、すべての計算がGPUカーネル内部でオンザフライに実行されることです。そのため、大規模なルックアップテーブルを保持したり、CPU側で追加の前処理を実行したりする必要がありません。また、新しい時間周期を追加したり、高調波の数を増やしたりする場合でも、3次元実行グリッドのサイズとperiod配列を変更するだけで対応できます。さらに、正弦関数および余弦関数は連続関数であるため、生成される表現も滑らかで連続性が保たれます。加えて、GPUの並列処理能力を利用することで、大量の観測データを遅延なく同時に処理できます。

その結果、各市場イベントには固有の埋め込みベクトルが割り当てられます。この埋め込みには、価格や出来高といった数値的特徴だけでなく、そのイベントがいつ発生したのかという正確な時間情報も含まれます。これにより、Mamba4Castははるかに豊富な時間的コンテキストを利用できるようになり、その予測処理は真に時間情報を考慮したものとなります。

本実装では、イベントのタイムスタンプは学習対象となるパラメータではありません。そのため、必要なのは順伝播のみです。具体的には、OpenCLカーネル内で埋め込みベクトルを計算するだけで十分です。タイムスタンプに対して勾配を伝播したり、タイムスタンプ自体を更新したりする必要はありません。その結果、逆伝播処理を完全に省略できるため、アーキテクチャを簡素化するとともに、位置エンコーディングを時間のみに依存する純粋な決定論的関数として実装できます。

時間エンコーディングオブジェクト

メインプログラム側では、時間エンコーディングアルゴリズムはCNeuronTSPositionEncoderクラスに実装されています。その構成を以下に示します。

class CNeuronTSPositionEncoder   :  public CNeuronBaseOCL
  {
protected:
   CNeuronConvOCL             cProjection;
   CNeuronBatchNormOCL        cNorm;
   CBufferFloat               cPeriods;
   //---
   virtual bool               AddPE(CBufferFloat *time);
   //---
   virtual bool               feedForward(CNeuronBaseOCL *NeuronOCL) override { return false; }
   virtual bool               feedForward(CNeuronBaseOCL *NeuronOCL,
                                          CBufferFloat *SecondInput) override;
   virtual bool               updateInputWeights(CNeuronBaseOCL *NeuronOCL) override;
   virtual bool               calcInputGradients(CNeuronBaseOCL *NeuronOCL) override;

public:
                     CNeuronTSPositionEncoder(void) {};
                    ~CNeuronTSPositionEncoder(void) {};
   //---
   virtual bool               Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                                   uint window, uint units_count, uint &periods[], uint freqs,
                                   ENUM_OPTIMIZATION optimization_type, uint batch);
   //---
   virtual int                Type(void) override  const   {  return defNeuronTSPositionEncoder;   }
   //---
   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 uint               GetWindow(void) const { return cProjection.GetWindow(); }
   virtual uint               GetWindowOut(void) const { return cProjection.GetFilters(); }
   virtual uint               GetUnits(void) const { return cProjection.GetUnits(); }
  };

先に示したクラス構造では、3つの内部オブジェクトが特に目を引きます。一見すると、時間エンコーディングはOpenCL側で実行されるため、これらのコンポーネントは冗長に思えるかもしれません。しかし実際には、これらは時間的コンテキストを付加する前に、解析対象の各データ系列を適切な形式へ変換し、スケーリングするという重要な役割を担っています。

まず、cProjectionは、ニューラルネットワークの前段層から渡される任意の特徴量配列を受け取り、それらを固定次元の均一なベクトルへ変換します。これにより、後続の処理では入力特徴量の数や内部構造を意識する必要がなくなります。cProjectionの出力は常に予測可能な構造となるため、バッチ正規化や位置エンコーディングを適用できる状態になります。

次に、cNormは学習を安定させるための役割を果たします。実際のデータでは、価格、出来高、その他の確率的なシグナルは大きく変動することがあります。そのような状態のまま、値域が[-1, 1]の正弦・余弦値を射影後のデータへ直接加えると、一部の情報が埋もれてしまう可能性があります。これを防ぐため、cProjectionの出力にはまずバッチ正規化を適用し、平均を0、分散を1に調整します。その後で時間方向の高調波成分を付加します。この順序により、時間特徴は処理済みデータに自然に組み込まれ、制御できないノイズ源として作用することなく、特徴表現を拡張する要素となります。

最後に、cPeriodsは各時間周期の長さを表す固定値の集合を保持します。

このように役割を明確に分離することで、このクラスは柔軟性・堅牢性・精度を兼ね備えた設計となっています。任意の入力データを受け入れられる柔軟性を持ち、常に安定した特徴表現へ変換できる堅牢性を備えるとともに、時間エンコーディングの連続性を損なうことなく正確な時間表現を維持できます。

CNeuronTSPositionEncoderクラスを単なる宣言的な構造から、実際に動作するニューラルネットワークコンポーネントへと構成するためには、すべての内部モジュールを適切に初期化する必要があります。この処理はInitメソッドによっておこなわれます。

bool CNeuronTSPositionEncoder::Init(uint numOutputs, uint myIndex, COpenCLMy *open_cl,
                                    uint window, uint units_count, uint &periods[], uint freqs,
                                    ENUM_OPTIMIZATION optimization_type, uint batch)
  {
   if(!CNeuronBaseOCL::Init(numOutputs, myIndex, open_cl, 2 * units_count * freqs * periods.Size(),
                                                                         optimization_type, batch))
      return false;

このメソッドは、前述したアーキテクチャの流れ、すなわち射影→ 正規化→ 時間特徴の付加を厳密に実装しています。

最初のステップでは、親クラスの対応するメソッドを呼び出します。この処理では、オブジェクトの基本的なパラメータを設定します。なお、出力テンソルのサイズを指定する際には、受け取ったパラメータの積を2倍しています。これは、各時間高調波が正弦と余弦の2つの成分で表現されるためです。

続いて、時間周期を格納するバッファを初期化します。各周期は秒単位で指定されます。

   cPeriods.BufferFree();
   if(!cPeriods.AssignArray(periods) ||
      !cPeriods.BufferCreate(OpenCL))
      return false;

続いて、入力データを固定次元空間へ射影する層を初期化します。この層の出力次元は、2 × 周波数数 × 周期数に設定されます。このサイズは、時間情報が付加されるチャネル数に対応しています。本質的には、この段階で、時系列の各セグメントに時間位相を付加する前処理を担うフィルタを構成します。

   int index = 0;
   if(!cProjection.Init(0, index, OpenCL, window, window, 2 * freqs * cPeriods.Total(), units_count,
                                                                           1, optimization, iBatch))
      return false;
   cProjection.SetActivationFunction(TANH);

射影段階でTANH活性化関数を使用しているのは、単なる実装上の選択ではありません。実用上の目的として、出力の振幅を[-1, 1]の範囲に制限する役割を担っています。これにはいくつかの重要な利点がある。

まず、入力データにノイズや急激な変動、あるいは極端な値が含まれている場合、TANHはソフトリミッターとして機能します。大きな値の変化を滑らかに抑制することで、モデルの挙動をより安定させることができます。これは金融時系列において特に重要です。予期しないローソク足や出来高の急増は、ニューラルネットワーク全体の動作に悪影響を及ぼす可能性があるためです。

さらにTANHは入力範囲全体にわたって滑らかな導関数を持つため、その後の勾配伝播においても有利に働きます。これにより、ニューロンの飽和が生じるリスクを低減するとともに、学習の収束をより速く、安定したものにします。

射影処理が完了すると、その出力はcNormに渡され、平均値およびスケールが調整されます。この処理によって、時間情報を表す正弦・余弦信号が過度に大きな振幅の特徴量に埋もれてしまうことを防ぎ、時間エンコーディングが安定かつ確実に機能するようになります。

   index++;
   if(!cNorm.Init(0, index, OpenCL, cProjection.Neurons(), iBatch, optimization))
      return false;
   cNorm.SetActivationFunction(None);

最後の調整として、時間エンコーディングは通常の意味で学習可能なコンポーネントではないため、一般的な活性化関数を無効化します。そして、勾配は外部インターフェースからcNormへ直接伝播されるように設定します。

   SetActivationFunction(None);
   if(!SetGradient(cNorm.getGradient(), true))
      return false;
//---
   return true;
  } 

CNeuronTSPositionEncoderクラスにおけるフィードフォワードパスの実装に移ると、この段階は時間エンコーディング手順全体の論理的な完了を意味することを強調しておく必要がある。続いて、CNeuronTSPositionEncoderクラスにおける順伝播処理の実装について説明します。この段階は、時間エンコーディング全体の処理を論理的に完成させる重要な部分です。ここでは、元の時系列データから得られた射影済み・正規化済みの情報と、入力データの実際のタイムスタンプから計算された高調波によって表現される詳細な時間構造が統合されます。

feedForwardメソッドでは、この処理を3つの連続した段階に分けて実行します。なお、このメソッドは2種類の異なるデータソースへのポインタを受け取ります。1つ目の主要な情報ストリームには解析対象の時系列データが含まれます。2つ目の補助的な情報ストリームには、それぞれのデータ点に対応するタイムスタンプが格納されています。

bool CNeuronTSPositionEncoder::feedForward(CNeuronBaseOCL *NeuronOCL, CBufferFloat *SecondInput)
  {
   if(!cProjection.FeedForward(NeuronOCL))
      return false;

まず、入力射影層の順伝播処理が実行されます。この段階では、任意の次元を持つ入力データが、あらかじめ定義された特徴量数へ変換されます。これにより、必要な数の時間高調波を付加するための次元整合性が確保されます。

得られた射影結果は、その後、正規化層へ渡されます。

   if(!cNorm.FeedForward(cProjection.AsObject()))
      return false;

正規化の目的は、解析対象データに含まれる特徴量間の統計的な差異を平滑化し、時間高調波との結合に適した状態へ整えることです。

最後の段階では、前述した時間エンコーディングカーネルを呼び出すラッパーメソッドが実行されます。このカーネルはリアルタイムで、現在のタイムスタンプ値と設定された周期情報に基づき、各時間ステップおよび各指定周波数に対する正弦・余弦高調波を計算します。

   return AddPE(SecondInput);
  }

この処理は学習可能なパラメータに依存せず、時間が外部から与えられる決定論的な要素であるため、勾配伝播も必要ありません。

その結果、出力は豊かな特徴表現となります。そこには、入力データ自体が持つ意味のある特徴と、それらの観測値が発生した正確な時間的コンテキストの両方が含まれます。つまり、単純なシーケンス上のインデックスによる時間情報ではなく、実際のイベントの周期性やリズムに基づいた表現が生成されます。

CNeuronTSPositionEncoderクラスにおける逆伝播処理は、構造としては意図的に簡潔に設計されていますが、重要な役割を担っています。すべての計算は、標準的な方法に従って誤差勾配を元の入力データへ逆方向に伝播します。主要な計算経路は、射影層(cProjection)と 正規化層(cNorm)の2つの重要なコンポーネントを通過します。これらはいずれも学習可能なパラメータを内部に保持しているため、最適化処理の対象となります。

実際には、updateInputWeightsメソッドおよびcalcInputGradientsメソッドが呼び出された場合、このオブジェクトは内部コンポーネントの対応するメソッドへ順番に処理を委譲するだけです。

この設計により、ロジックのモジュール性と再利用性が確保されます。個々の層における最適化処理の変更は、高レベルのコードを修正することなく、システム全体へ自動的に反映されます。これは、拡張可能なニューラルネットワークアーキテクチャを構築する上で特に重要です。

ただし、ここで1つ重要な点を強調する必要があります。feedForwardメソッドは2種類の情報ストリーム、すなわち入力時系列データとタイムスタンプ配列を受け取りますが、逆伝播に参加するのは入力時系列データのみです。これは完全に正当な設計です。

その理由は、CNeuronTSPositionEncoderにおける時間エンコーディングには学習可能なパラメータが存在しないということです。これは、タイムスタンプに対して適用される固定的かつ決定論的な変換処理です。さらに、意図的にタイムスタンプ側へ誤差勾配を戻さない設計としています。これらの値はモデル外部から与えられる情報であり、最適化処理によって変更されるべきものではありません。

この設計思想により、アーキテクチャは単純で安定したものになるだけでなく、論理的にも一貫したものになります。つまり、時間情報は学習対象ではなく、コンテキスト情報として利用されるのです。

このクラスおよびすべてのメソッドの完全なソースコードは、添付資料に掲載しています。

これで、今回の記事で扱う範囲としては適切な境界に到達しました。本記事では、時間エンコーディングの基本的な構成要素を分析し、その主要概念を実装し、さらにレイヤーアーキテクチャをコードとして明確かつ体系的に示しました。しかし、ことわざにもあるように、すべてを一度に完成させることはできません。

今回の実装はまだ完全なものではありません。今後も多くの作業が残されており、それらには慎重かつ体系的なアプローチが必要になります。短い休止を挟み、次回の記事で続きを進めます。


結論

本記事では、時系列解析における根本的な課題の1つである、複雑な動的時間データの構造を捉える柔軟かつスケーラブルなモデルの構築を目的として設計されたMamba4Castフレームワークについて検討しました。従来のモデルが抱えていた制約を、著者らがどのように克服したのかを分析しました。その中心となるのは、コーザル畳み込み機構によって強化された状態空間モデル(SSM)を含む最新のアーキテクチャ手法の統合です。さらに、実際のタイムスタンプに基づく高精度な位置エンコーディングを組み合わせることで、時間情報をより正確に扱える設計となっています。

フレームワークの構造を段階的に確認する中で、時間特徴量を構築するプロセスについて詳しく分析しました。単純でありながら強力な高調波関数を利用することで、どのようにして生のタイムスタンプが意味のある埋め込み表現へ変換され、市場ダイナミクスが持つ周期的な性質を反映できるのかを示しました。また、OpenCL実装を例として、このような埋め込み表現を追加のルックアップテーブルや処理遅延なしに、計算カーネル内部で効率的に生成できる方法についても検討しました。

しかし、今回の作業はまだ完了していません。次回の記事では、この研究をさらに進め、時間埋め込みがモデルの各アーキテクチャブロックとどのように相互作用するのかを詳しく説明します。その過程で、解析情報の整合性を維持しながら、どのように予測精度の向上へつながるのかを検証していきます。


参照文献


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

# 名前 種類 詳細
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/18116

添付されたファイル |
MQL5.zip (2754.59 KB)
ニューラルネットワークの実践:習うより慣れよ ニューラルネットワークの実践:習うより慣れよ
ニューロンをわずかに特化させる単純なコード変更によって、学習段階を大幅に高速化できる方法について見ていきます。結局のところ、後ほど詳しく説明するように、ニューロンやニューラルネットワークが一度学習を完了すると、その後に実行する処理ははるかに高速になります。また、実際には存在しているにもかかわらず、ほとんど語られることのない問題についても取り上げます。
取引におけるニューラルネットワーク:適応型モード分解を用いた時系列予測(最終回) 取引におけるニューラルネットワーク:適応型モード分解を用いた時系列予測(最終回)
アルゴリズム取引におけるACEFormerフレームワークの適応およびMQL5を用いた実用的な実装について説明します。特に、主要なアーキテクチャ設計の判断、学習プロセスの特徴、そして実データを用いたモデル検証結果について紹介します。
初級から中級まで:マウスイベントの処理 初級から中級まで:マウスイベントの処理
本記事は、コードを眺めて学習するだけでは、そこでおこなわれている処理を十分に理解することが難しい内容に分類されます。実際には、実行可能なアプリケーションを作成し、それを任意のチャート上で動作させる必要があります。そうすることで、キーボードとマウスを組み合わせて特定の要素を作成する方法など、コードを読むだけでは非常に理解しにくい細かな点まで把握できるようになります。
取引におけるニューラルネットワーク:適応型モード分解を用いた時系列予測(ACEFormer) 取引におけるニューラルネットワーク:適応型モード分解を用いた時系列予測(ACEFormer)
ACEFormerアーキテクチャについて紹介します。これは、Probabilistic Attention(確率的注意)機構の有効性と、適応型時系列分解を組み合わせた最新のソリューションです。本記事は、金融市場において計算性能と予測精度のバランスを求める方にとって有用な内容となっています。