English Русский Español Deutsch Português
preview
取引におけるニューラルネットワーク:カオス理論を時系列予測に統合する(Attraos)

取引におけるニューラルネットワーク:カオス理論を時系列予測に統合する(Attraos)

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

はじめに

金融市場の時系列データは、価格データ、取引量、その他の経済指標の系列を表し、これらは様々な要因の影響を受けながら時間とともに変化します。これらは、経済ニュース、参加者の行動、マクロ経済状況によって引き起こされる市場トレンド、サイクル、短期的な変動など、複雑な動的プロセスを反映しています。金融時系列データの高精度な予測は、リスク管理、取引戦略の策定、ポートフォリオ最適化、およびアルゴリズム取引において極めて重要です。予測誤差は重大な経済的損失につながる可能性があるため、より精度の高い時系列分析手法の開発は、アナリスト、トレーダー、金融機関にとって重要な課題となっています。

金融時系列予測における現代的なアプローチでは、ニューラルネットワークや深層学習モデルを含む機械学習が広く用いられています。しかし、従来手法の多くは統計的手法や線形モデルに基づいているため、金融市場特有の高いボラティリティとカオス的性質を持つデータの解析には限界があります。市場プロセスはしばしば非線形依存性、初期条件への鋭敏性、複雑なダイナミクスを示し、予測を困難にします。また、従来モデルでは、危機、急激な流動性変動、投資家のパニックに起因する大規模な資産売却といった突発的な市場イベントを捉えることが困難です。したがって、金融市場の複雑なダイナミクスに適応可能なアプローチの開発は重要な研究分野となっています。

これらの課題に対処するため、Attraosフレームワークの著者らは論文「Attractor Memory for Long-Term Time Series Forecasting: A Chaos Perspective」において、カオス理論の原理を統合し、時系列を多次元混沌力学系の低次元射影として扱うことを提案しています。このアプローチにより、市場変数間に存在する潜在的な非線形依存関係を捉えることが可能となり、予測精度の向上が期待されます。カオス力学の手法を時系列解析に適用することで、市場データにおける持続的構造を特定し、それを予測モデルに組み込むことが可能となります。

Attraosフレームワークは2つの主要な課題に取り組みます。第一に、位相空間再構成手法を用いて潜在的な動的プロセスをモデル化します。これにより、潜在パターンの抽出や、資産間相関、マクロ経済指標、市場流動性などの市場変数間における非線形相互作用の考慮が可能になります。第二に、Attraosは周波数領域における局所的な進化戦略を採用し、変化する市場環境への適応性を高めるとともに、アトラクターの識別性を強化します。従来のようにデータ分布に関する固定的仮定に依存するモデルとは異なり、Attraosは変化する市場構造に動的に適応し、さまざまな時間軸においてより高精度な予測を提供します。

さらに、本モデルにはマルチ解像度の動的メモリモジュールが組み込まれており、過去の価格変動パターンを記憶・活用しつつ、変化する市場環境に適応します。これは金融市場では特に重要であり、同一のパターンが異なる時間スケールで繰り返し現れる一方で、その振幅や強度は変化する可能性があります。このモデルは複数の粒度レベルでデータを学習できるため、市場プロセスのマルチスケール性を見落としがちな従来手法に対して大きな優位性を持ちます。

フレームワークの開発者による実験では、Attraosが従来の時系列予測手法を上回り、より少ない学習可能パラメータで高精度な予測を実現することが示されています。特に、カオス的ダイナミクスの活用により、長期依存関係の捕捉が改善され、累積誤差の影響が抑制されます。これは中長期的な投資戦略において特に重要です。


Attraosアルゴリズム

カオス理論において、時間とともに発展する多次元力学系は、一見するとランダムで複雑な振る舞いを示すことがあります。しかし詳細な解析により、そのダイナミクスを支配する隠れた規則性が存在することが明らかになります。

Takensの定理によれば、システムが決定論的である場合、その位相空間は単一変数の観測から再構成することが可能です。この定理は、十分に長い時系列データがあれば、たとえ一次元データしか利用できない場合でも、システムの多次元的な軌道を復元できるという考えに基づいています。このアプローチにより、システムの軌道が時間とともに収束する位相空間上の領域である「隠れたアトラクター」を特定することが可能になります。

金融市場においては、株価、通貨ペア、その他の資産データといった時系列データが市場システムの内部ダイナミクスに関する情報を含んでいます。外見上はカオス的に見える市場挙動も、位相空間再構成手法を用いることで、決定論的な法則に従っている可能性があります。これらの手法を適用することで、特徴的なアトラクターを特定でき、将来の価格変動予測の基盤として利用することが可能になります。

Attraosフレームワークはカオス理論および位相空間再構成の原理に基づいて構築されており、システムの潜在構造に関する事前知識を必要とせずに、力学系の位相的に等価なモデルを構築することを可能にします。中心的なアイデアは、時系列を多次元位相空間に埋め込み、隠れたパターンを抽出することです。これは、埋め込み次元dおよび時間遅延という主要パラメータを選択することで実現され、時系列の多次元表現を構成します。

このアプローチによりノイズの影響が低減され、プロセスの構造的要素が強調され、予測精度が向上します。位相空間再構成は、時間とともにシステムのダイナミクスを反映する安定した位相図の構築を可能にし、解析やモデリングに有用です。

Attraosにおけるデータ処理は、Phase Space Reconstruction (PSR)モジュールから始まります。このモジュールは、システムダイナミクスを正確に表現するために最適なdおよびτを選択する役割を担います。このステップは極めて重要であり、不適切なパラメータ選択は再構成された位相図を大きく歪める可能性があります。その後、Multidimensional Data Management Unit (MDMU)が多次元テンソルを用いてデータを非重複セグメントに分割します。これにより計算複雑性が低減され、モデル収束が高速化されるとともに、主要な進化パターンを捉えることでシステムの動的メモリが形成されます。その結果、予測の安定性が向上し、データ劣化に対してもロバストになります。さらにMDMUは重要な時系列構成要素の適応的選択をおこない、非情報的な要素を動的に除外し、システム進化に強く影響する主要因子を強調します。

Attraosアーキテクチャの重要な要素の一つがLinear Matrix Approximation (LMA)モジュールです。このモジュールは線形行列近似手法を実装しており、多項式射影を用いてシステムダイナミクスの主要特徴を抽出します。また「観測ウィンドウ」を定義するパラメータ化された対角行列を使用します。これにより局所的な動的特性を精密に抽出し、入力データの変化に応じてモデルを適応的に補正することが可能になります。対角行列の使用は計算複雑性を低減し、多次元データ構造の効率的な処理を可能にします。このモジュールにおけるシステムの進化は以下のように定式化されます。

ここでMはパラメータ化された対角状態行列であり、ϵはランダムなモデリング誤差を表します。複雑なシステム変換を捉え、予測精度を向上させるために、適応的非線形射影を含む複数の進化パターンが用いられます。

動的プロセスの処理では、Discrete Projection (DP)モジュールがシステムを組合せ的に離散化します。特に指数行列表現が用いられ、逐次データ解析において高精度な近似を実現します。このアプローチによりステムの時間発展の適切な近似が保証され、累積誤差の影響が抑制されます。これは長期時系列データにおいて特に重要です。またこのモジュールは適応的データ量子化を組み込み、計算負荷を大幅に増やすことなく近似精度を最適化します。

Attraosに組み込まれた追加の適応機構として、周波数増幅を伴う局所進化戦略があります。これは時系列のスペクトル特性を制御し、確率的プロセスによって生じる歪みを補正します。これは高周波成分のフィルタリングおよびデータのスペクトル密度制御によって可能になります。また動的構造の多段階表現も実装されており、解析ウィンドウが徐々に拡張されることで射影誤差が低減され、近似精度が向上します。これにより、異なるスケールにおけるアトラクターの複雑な位相構造を捉えることが可能となり、複雑な力学系の解析において重要な役割を果たします。さらに、古典的数値手法と現代的機械学習アルゴリズムを組み合わせたハイブリッド学習手法により、モデルの適応性と汎化性能が強化されます。

Attraosの安定性は、誤差最小化およびアトラクター偏差制御によって保証されます。アトラクター間距離を計算し、その変化を監視し、大きな逸脱が検出された場合にはシステム軌道を補正します。これらの仕組みにより、予測は安定化され、不安定なダイナミクス下でも高い精度が維持されます。統計的モニタリング手法は不安定領域を自動的に識別し、モデルをリアルタイムで調整します。また能動的パラメータ制御機構により、システム状態に応じて最適化パラメータが動的に変更され、適応性と予測精度がさらに向上します。

Attraosフレームワークの元の可視化を以下に示します。



MQL5を使用した実装

Attraosフレームワークの理論的側面を説明した後、このセクションでは提案手法の解釈をMQL5を用いて実装する実践的な内容に移ります。

まず、Attraosアルゴリズムを効率的に機能させるために必要となる主要な処理を準備します。このアルゴリズムは対角行列に強く依存しており、計算における重要な役割を担うと同時に、データ処理の簡素化およびメモリ使用量の削減に寄与します。

対角行列とは、主対角成分以外の要素がすべてゼロである正方行列です。従来の線形代数では、これらはn×nの二次元配列として保持されますが、多くの要素がゼロであるため非効率です。より適切な方法として、非ゼロである対角成分のみを長さnの一次元配列として保持する手法があります。これによりメモリ使用量が大幅に削減され、ゼロ要素に対する不要な演算を回避できるため計算効率も向上します。

このようなベクトル表現を用いる場合、線形代数演算には専用の処理が必要となります。特に対角行列と任意行列の乗算では、従来の行列演算アルゴリズムはすべての要素を明示的に扱う前提で設計されているため、不要な計算が発生します。一方でこのケースでは、対角ベクトルの各要素を対応する行に対して乗算するだけで十分であり、演算を大幅に単純化できます。この構造により、演算手順は単純化され、計算負荷も抑えられます。

さらに性能を最大化するため、この処理はOpenCLコンテキスト上で実装され、GPUの並列計算能力を活用します。基本的な考え方として、結果行列の各要素は互いに独立して計算可能であり、対応する対角ベクトル要素のみを使用して評価されます。これにより計算の依存関係が排除され、処理の並列化が容易になり、実行速度が向上します。

対角行列の乗算


対角行列の乗算アルゴリズムは、DiagMatMultカーネル内で実装されており、三次元のタスク空間上で動作します。第一および第二次元は対象となる行列の次元に対応し、第三次元は解析対象となる多次元時系列から生成された単位系列の射影を処理するために使用される独立行列の数を表します。

前述のとおり、対角行列のベクトル表現と任意行列の乗算は、対角ベクトルの各要素を対応する行に乗算することでおこなわれます。GPU実行を最適化するため、計算スレッドはワークグループ単位でまとめられます。各ワークグループ内では、1つのスレッドのみがグローバルメモリにアクセスし、必要な対角要素を取得してローカルメモリに格納します。他のスレッドはこのローカルメモリ上の値を参照して計算をおこない、追加のグローバルメモリアクセスを回避します。この構成によりデータ転送のオーバーヘッドが削減され、実行効率が向上します。

DiagMatMultカーネルは3つのバッファへのポインタを受け取ります。2つは入力データ、1つは計算結果の格納に使用されます。また、乗算結果に対して活性化関数を適用するオプションも含まれています。

__kernel void DiagMatMult(__global const float * diag,
                          __global const float * matr,
                          __global float * result,
                          int activation)
  {
   size_t row = get_global_id(0);
   size_t col = get_local_id(1);
   size_t var = get_global_id(2);
   size_t rows = get_global_size(0);
   size_t cols = get_local_size(1);

カーネル本体では、まず三次元タスク空間におけるスレッド位置を特定します。その後、ワークグループ内の先頭スレッドが対角要素をローカルメモリに格納し、バリア同期により全スレッドを同期します。

   __local float local_diag[1];
   if(cols==0)
      local_diag[0] = diag[row + var * rows];
   barrier(CLK_LOCAL_MEM_FENCE);

次に、任意行列バッファ内の対象要素へのオフセットを計算します。

   int shift = (row  + var * rows) * cols + col;

任意行列と結果行列は同一サイズであるため、このオフセットは結果バッファにもそのまま適用されます。

その後、任意行列の該当要素を取得し、ローカルメモリ上の対角要素と乗算をおこないます。結果は活性化関数を通して出力され、結果行列バッファに格納されます。

   float res = local_diag[0] * matr[shift];
//---
   result[shift] = Activation(res, activation);
  }

以上のカーネルは、対角行列と任意行列の順伝播を実装していますが、これだけではなく、学習時には誤差勾配の逆伝播も必要となります。そのため、DiagMatMultGradカーネルを別途実装し、より複雑な処理をおこないます。

このカーネルでは、対応する誤差勾配を格納するためのバッファがパラメータに追加されます。このカーネルでは、勾配計算用のバッファが追加されますが、活性化関数のポインタは含まれません。出力側の勾配は、すでに対応する活性化関数の微分によって補正されていることを前提とします。

__kernel void DiagMatMultGrad(__global const float *diag,
                              __global float *grad_diag,
                              __global const float *matr,
                              __global float * grad_matr,
                              __global const float * grad_result)
  {
   size_t row = get_global_id(0);
   size_t col = get_local_id(1);
   size_t var = get_global_id(2);
   size_t rows = get_global_size(0);
   size_t cols = get_local_size(1);
   size_t vars = get_global_size(2);

カーネル本体では、前向き計算カーネルと同様の方法を用いて、三次元タスク空間における現在のスレッド位置を特定します。

また、フィードフォワードカーネルと同様に、各ワークグループにつき1つのスレッドのみが対角行列の該当要素を取得し、それをローカル配列に格納します。

   __local float local_diag[LOCAL_ARRAY_SIZE];
   if(cols==0)
      local_diag[0] = diag[row + var * rows];
   barrier(CLK_LOCAL_MEM_FENCE);

また、ワークグループ内でのスレッドを同期します。

次に、任意行列および結果行列バッファのオフセットを算出します。

   int shift = (row  + var * rows) * cols + col;
//---
   float grad = grad_result[shift];
   float inp = matr[shift];

必要な要素をローカル変数に保持します。

これで準備は完了です。任意行列に対する誤差勾配を計算することができます。これは、結果行列の対応する要素の誤差勾配に、ローカル配列に保存されている対角要素を乗算することでおこなわれます。

   grad_matr[shift] = IsNaNOrInf(local_diag[0] * grad, 0);
   barrier(CLK_LOCAL_MEM_FENCE);

算出された勾配は対応するグローバルメモリバッファに格納され、その後ワークグループ内でスレッド同期がおこなわれます。

次に、対角行列要素に対する誤差勾配を算出します。この処理では、結果バッファ内の対応する行に含まれる全要素からの値を集約する必要があります。すなわち、ワークグループ内のすべてのスレッドからの寄与を合計する操作が求められます。

この集約を実現するため、ローカル配列上で並列リダクションループを実装します。

   int loc = col % LOCAL_ARRAY_SIZE;
#pragma unroll
   for(int c = 0; c < cols; c += LOCAL_ARRAY_SIZE)
     {
      if(c <= col && (c + LOCAL_ARRAY_SIZE) > col)
        {
         if(c == 0)
            local_diag[loc] = IsNaNOrInf(grad * inp, 0);
         else
            local_diag[loc] += IsNaNOrInf(grad * inp, 0);
        }
      barrier(CLK_LOCAL_MEM_FENCE);
     }

各反復処理におけるアクティブスレッドの最大数は、ローカル配列の要素数によって制限されます。各反復の終了後には、次のバッチのアクティブスレッドに進む前に、ワークグループ内のスレッド同期を確実に実行します。

続いて、ローカル配列の要素を並列に加算するためのループを追加します。

   int count = min(LOCAL_ARRAY_SIZE, (int)cols);
   int ls = count;
#pragma unroll
   do
     {
      count = (count + 1) / 2;
      if((col + count) < ls)
        {
         local_diag[col] += local_diag[col + count];
         local_diag[col + count] = 0;
        }
      barrier(CLK_LOCAL_MEM_FENCE);
     }
   while(count > 1);

反復処理ごとにアクティブスレッド数は段階的に減少しますが、計算の正確性を担保するため、各ステップでスレッド同期は維持されます。

最終的な集約値をグローバルメモリに格納するためには、ワークグループごとに1つのスレッドのみが必要となります。

   if(col == 0)
      grad_diag[row + var * rows] = IsNaNOrInf(local_diag[0], 0);
  }

この処理によりグローバルメモリアクセスの回数が抑制され、スレッド間の並列実行効率が最大化されます。その結果として、学習全体の計算負荷が軽減されます。

並列スキャンアルゴリズム


OpenCL側の実装を継続し、Attraosフレームワークのアルゴリズム構築に進みます。次の課題は並列スキャンアルゴリズムの実装です。このアルゴリズムは、相互作用係数行列Aと正規化係数Hを考慮しながら、入力データ配列Xを効率的に更新するために使用されます。基本的な考え方は、バイナリ分解に基づいて累積和を反復的に計算することにあり、逐次処理における計算量O(L)O(log L)に削減します。

配列X = {x0, x1, ..., xL-1}は隣接要素との関係に基づいて更新され、次の再帰式に従います。

ここで、θ1θ2はアルゴリズムの反復処理の中で逐次的に決定されます。ベクトルAは隣接要素間の相互作用係数行列を表し、Hは計算結果を正規化します。これらのパラメータは適応的な重み分布を定義し、データ構造を反映した複雑な依存関係のモデリングを可能にします。

この処理はPScanカーネルとして実装されます。カーネルは4つのデータバッファへのポインタを受け取り、そのうち3つが入力、1つが出力用です。

__kernel void PScan(__global const float* A,
                    __global const float* X,
                    __global const float* H,
                    __global float* X_out)
  {
   const size_t idx = get_local_id(0);
   const size_t dim = get_global_id(1);
   const size_t L = get_local_size(0);
   const size_t D = get_global_size(1);

カーネルは二次元タスク空間で実行され、第一次元方向にスレッドがグループ化されます。スレッドの識別およびタスク空間のサイズはカーネル内で決定されます。

反復回数num_stepsは、配列長Lに対する二進対数として計算されます。

   const int num_steps = (int)log2((float)L);

二進対数を用いることで、データ全体を走査するために必要な反復回数が最小化され、計算資源を効率的に利用できる構造になります。

グローバルメモリアクセスによるコストを抑えるため、計算途中の値を一時的に保持するローカル配列を用意します。

   __local float local_A[1024];
   __local float local_X[1024];
   __local float local_H[1024];

各スレッドはグローバルメモリからローカルメモリへデータを読み込み、その後の演算におけるメモリアクセス遅延を低減し、全体的な性能を向上させます。

//--- Load data to local memory
   int offset = dim + idx * D;
   local_A[idx] = A[offset];
   local_X[idx] = X[offset];
   local_H[idx] = H[offset];
   barrier(CLK_LOCAL_MEM_FENCE);

データ読み込み後、ワークグループ内でスレッド同期を行い、計算を継続する前にデータの読み書きが正しく完了していることを保証します。

続いて、メインの処理段階に移ります。この段階では値の並列加算を実行します。ループの各反復ごとにアクティブなスレッド数は半減します。

//--- Scan
#pragma unroll
   for(int step = 0; step < num_steps; step++)
     {
      int halfT = L >> (step + 1);
      if(idx < halfT)
        {
         int base = idx * 2;
         local_X[base + 1] += local_A[base + 1] * local_X[base];
         local_X[base + 1] *= local_H[base + 1];
         local_A[base + 1] *= local_A[base];
        }
      barrier(CLK_LOCAL_MEM_FENCE);
     }

ループ内では、入力配列の値が加算され、Hによって正規化されるとともに、相互作用係数Aが更新されます。これにより、反復的な更新処理において計算順序が維持されます。#pragma unrollによる最適化はコンパイラによるループ展開を促し、分岐オーバーヘッドを低減し、より効率的なデータ処理を可能にします。

ループの処理が完了した後、結果はローカルメモリからグローバルの結果バッファへ転送されます。

//--- Save result
   X_out[offset] = local_X[idx];
  }

この手法によりデータ処理は大幅に高速化され、計算資源を最適化しながら並列スキャンが実行可能になります。

次のステップでは、並列スキャンに対するバックプロパゲーションアルゴリズムを構築します。新たにPScan_CalcHiddenGradientカーネルを作成し、主に逆方向スキャンを通じてパラメータを微分する役割を持たせます。

カーネルの引数には、対応する誤差勾配を格納するための各種バッファへのポインタが含まれます。

__kernel void PScan_CalcHiddenGradient(__global const float* A,
                                       __global float*  grad_A,
                                       __global const float* X,
                                       __global float*  grad_X,
                                       __global const float* H,
                                       __global float*  grad_H,
                                       __global const float* grad_X_out)
  {
   const size_t idx = get_local_id(0);
   const size_t dim = get_global_id(1);
   const size_t L = get_local_size(0);
   const size_t D = get_global_size(1);
   const int num_steps = (int)log2((float)L);

アルゴリズムは、フィードフォワード処理と同様のタスク空間においてスレッドを識別することから開始されます。並列スキャンは複数の反復ステップで実行されるため、ステップ数は配列長の二進対数として計算されます。これにより、処理は階層的な構造へと分解され、値の逐次的な統合が可能になります。

実装における重要な点は、グローバルメモリへのアクセスを最小化することです。これはローカルメモリ配列の使用によって可能になります。ローカルメモリはグローバルメモリよりも高速にアクセスできるため、処理性能の向上に寄与します。原データおよび誤差勾配の中間値を保持するため、それぞれ対応するバッファを定義します。

   __local float local_A[1024];
   __local float local_X[1024];
   __local float local_H[1024];
   __local float local_grad_X[1024];
   __local float local_grad_A[1024];
   __local float local_grad_H[1024];

ローカル配列を宣言した後、グローバルバッファからソースデータをローカルメモリへ転送します。これにより、各スレッドは対応する要素を個別に読み込むことが可能になります。その後、ローカルグループ内でスレッド同期をおこない、アクセス競合の発生を防止します。

//--- Load data to local memory
   int offset = idx * D + dim;
   local_A[idx] = A[offset];
   local_X[idx] = X[offset];
   local_H[idx] = H[offset];
   local_grad_X[idx] = grad_X_out[offset];
   local_grad_A[idx] = 0.0f;
   local_grad_H[idx] = 0.0f;
   barrier(CLK_LOCAL_MEM_FENCE);

続いて、アルゴリズムの中核となる逆方向スキャン処理に移ります。この処理は反復的なプロセスとして実装されており、反復処理ごとに処理対象となる配列のサイズが段階的に縮小されます。

//--- Reverse Scan (Backward)
#pragma unroll
   for(int step = num_steps - 1; step >= 0; step--)
     {
      int halfT = L >> (step + 1);
      if(idx < halfT)
        {
         int base = idx * 2;
         // Compute gradients
         float grad_next = local_grad_X[base + 1] * local_H[base + 1];
         local_grad_H[base + 1] = local_grad_X[base + 1] * local_X[base];
         local_grad_A[base + 1] = local_grad_X[base + 1] * local_X[base];
         local_grad_X[base] += local_A[base + 1] * grad_next;
        }
      barrier(CLK_LOCAL_MEM_FENCE);
     } 

ループ本体では、まず各反復におけるアクティブスレッド数(halfT)を算出します。次に誤差勾配(grad_next)を求めます。これは現在の値と対応する正規化係数Hの積として定義されます。続いて、現在の値Xを用いて、正規化係数Hおよび相互作用係数Aに対する微分を計算します。誤差を正しく逆方向へ伝播させるため、Xに対する勾配は相互作用係数を考慮して更新されます。各反復の終了時には、ワークグループ内でスレッド同期を実行します。

カーネル処理の終了時には、更新された誤差勾配をグローバルメモリへ書き戻します。

//--- Save gradients
   grad_A[offset] = local_grad_A[idx];
   grad_X[offset] = local_grad_X[idx];
   grad_H[offset] = local_grad_H[idx];
  }

このデータ処理手法は、ローカルメモリの活用とグローバルメモリアクセス回数の最小化により、高い計算効率を実現します。

これで、OpenCL側の実装作業は完了です。OpenCLプログラムの完全なコードは、添付ファイルに含まれています。

次の段階では、メインプログラム側のアルゴリズム構築に進みます。ただし、記事フォーマットの制約に近づいているため、ここで一旦区切りとし、Attraosフレームワークの構築は次回に続きます。


結論

本記事では、カオス理論に基づく時系列予測アルゴリズムを提案するAttraosフレームワークについて検討しました。時系列データを多次元カオス力学系の射影として解釈することで、従来の統計モデルや回帰モデルでは捉えることが困難な隠れたパターンの特定を可能にしています。Attraosは位相空間再構成と動的メモリ機構を実装しており、市場データにおける安定した非線形依存関係の検出を通じて予測精度の向上を実現します。

従来の線形モデルが変数間の複雑な多次元相互作用を十分に考慮できないのに対し、Attraosはカオス的アトラクターの内部構造に基づいて動作し、高い予測精度と市場環境変化への適応性を提供します。このアプローチにより、一見ランダムに見えるプロセスの中に存在する決定論的要素の検出が可能となり、高頻度データ分析および短期金融予測において特に有用となります。

実装セクションでは、MQL5およびOpenCL技術を用いて提案手法の実装を開始し、GPUによる並列データ処理を通じて計算速度を大幅に向上させました。これにより、Attraos手法は実運用の取引システムや自動解析プラットフォームへの適用が可能となり、大規模データの高速処理および市場変動への迅速な適応を実現します。

次回の記事では、これらの実装をさらに発展させ、実際の過去データを用いた検証とともに完成までのプロセスを扱います。


参考文献リスト


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

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

添付されたファイル |
MQL5.zip (2509.49 KB)
最後のコメント | ディスカッションに移動 (1)
Tbor Yorgonson
Tbor Yorgonson | 5 3月 2026 において 20:50
理論が違うのは分かっているが、カルマンフィルタリングもアイデアを分岐させる実験に使えると思う。
市場シミュレーション(第12回):ソケット(VI) 市場シミュレーション(第12回):ソケット(VI)
本記事では、Pythonコードを他のプログラム内で使用する際に発生する特定の問題や課題をどのように解決するかについて説明します。特に、ExcelとMetaTrader 5を併用する際に生じる一般的な問題を取り上げ、その具体例を示します。なお、この連携の実現にはPythonを使用します。ただし、この実装には小さな欠点があります。この問題は常に発生するわけではなく、特定の状況下でのみ起こります。そして、実際に発生した場合には、その原因を理解することが重要です。本日の記事では、この問題の解決方法について解説を開始します。
Market Memory Zonesインジケーターの開発:価格が戻りやすい領域 Market Memory Zonesインジケーターの開発:価格が戻りやすい領域
強い市場活動によって形成される価格ゾーンを識別するインジケーターを開発します。具体的には、インパルス的な値動き、構造のシフト、流動性イベントなどによって生成される領域を対象とします。これらのゾーンは、未約定の注文や急激な価格変動によって市場に「記憶」が残されたエリアを表します。チャート上にこれらの領域をマーキングすることで、将来的に価格が再訪し反応する可能性が統計的に高いポイントを可視化します。
取引におけるニューラルネットワーク:カオス理論を時系列予測に統合する(最終回) 取引におけるニューラルネットワーク:カオス理論を時系列予測に統合する(最終回)
引き続き、Attraosフレームワークの著者らが提案した手法を取引モデルに統合します。このフレームワークは、時系列予測問題を多次元カオス動的システムの投影として解釈し、カオス理論の概念を用いて解決するものであることを改めてお伝えしておきます。
ラリー・ウィリアムズの『市場の秘密』(第7回):Trade Day of the Week概念の実証研究 ラリー・ウィリアムズの『市場の秘密』(第7回):Trade Day of the Week概念の実証研究
ラリー・ウィリアムズのTrade Day of the Week (TDW)概念の実証研究です。時間ベースの市場バイアスを、MQL5を用いてどのように測定、検証、活用できるかを示します。曜日ごとの勝率やパフォーマンスを分析するための実践的なフレームワークを提示し、短期取引システムの改善に役立てる方法を解説します。