記事「取引におけるニューラルネットワーク:確率的時系列予測(最終回)」についてのディスカッション

新しい記事「取引におけるニューラルネットワーク:確率的時系列予測(最終回)」はパブリッシュされました:

K²VAEフレームワークの概要と、提案された手法を取引システムにどのように統合できるかについて解説します。 Koopman–Kalman–VAEを組み合わせたハイブリッドアプローチが、適応性と解釈可能性を備えたモデルの構築にどのように役立つのかを紹介します。 最後に、実装した手法を用いて得られた実践的な成果についても取り上げます。

前述のとおり、モデルの学習は2つの段階に分けておこないます。 まず、第1段階では、15年分のEURUSDの価格履歴を使用し、H1(1時間足)でオフライン学習を実施しました。 このデータセットには、長期間にわたるレンジ相場から急激なトレンド相場まで、また、値動きの穏やかな期間からボラティリティが急上昇する局面まで、さまざまな市場環境が含まれています。 これにより、モデルは多様な市場の動きを学習できました。 Encoderは、市場の重要なパターンを識別し、市場状態をコンパクトでありながら情報量の豊富な表現へと変換する能力を獲得しました。この表現が、エージェントの意思決定の基盤となります。 一方、Actorは、CriticおよびDirectorからのフィードバックを活用し、さまざまな市場環境で有効に機能する、堅牢な取引戦略の構築に取り組みました。

続いて第2段階として、 2024年のデータを使用したオンライン学習をMetaTrader 5 のストラテジーテスターで実施しました。 この段階では、モデルは実際の市場に近い環境で、ローソク足ごとに市場を分析しながら動作します。 そこでは、実際の市場で発生するノイズやランダムな価格変動、さまざまな歪みも考慮されます。 この方法により、モデルの微調整だけでなく、実際の市場の動きに合わせた挙動の調整、戦略の改善、不確実な状況に対する頑健性の向上も図ることができました。

学習完了後は、学習時のパラメータを一切変更せず、2025年1月~3月までの新しい価格データを使用してモデルをテストしました。 その結果を以下に示します。

テスト結果は、このモデルが選択した過去期間において利益を上げたことを示しています。 総純利益は$821.90となり、初期入金額は$100.0で、資本の増加を示しています。 ただし、プロフィットファクターは1.06であり、利益が損失をわずかに上回っているに過ぎないことを示している点に留意すべきです。


作者: Dmitriy Gizlyk

VAE.mqhに関していくつかの問題に直面していましたが、以下の方法がその問題をうまく回避できることがわかりました。

bool CVAE::calcInputGradients(CNeuronBaseOCL *NeuronOCL)
  {
   if(!OpenCL || !NeuronOCL)
      return false;
//---
   if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_input, NeuronOCL.getOutput().GetIndex()))
      return false;
   if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_inp_grad, NeuronOCL.getGradient().GetIndex()))
      return false;
   if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_random, m_cRandom.GetIndex()))
      return false;
   if(!OpenCL.SetArgumentBuffer(def_k_VAECalcHiddenGradient, def_k_vaehg_gradient, Gradient.GetIndex()))
      return false;
   if(!OpenCL.SetArgument(def_k_VAECalcHiddenGradient, def_k_vaehg_kld_mult, m_fKLD_Mult))
      return false;
      
   // 適切な作業サイズを計算する
   uint neurons_count = (uint)Neurons();
   uint local_size = 64;  // または、お使いのGPUに応じて32、128、256
   
   // グローバルサイズをローカルサイズで割り切れるように切り上げる
   uint global_size = ((neurons_count + local_size - 1) / local_size) * local_size;
   
   uint work_offset[] = {0};
   uint work_size[] = {global_size};
   uint local_work_size[] = {local_size};
   
   if(!OpenCL.Execute(def_k_VAECalcHiddenGradient, 1, work_offset, work_size, local_work_size))
      return false;
  //--- 
   return true;
  }
私も同じテスト手順を試してみました。まずStudyを使用して過去データを1000000回学習させ、関連するnnwファイルを生成しました。その後、StudyOnlineを用いて1年分のデータを学習させました(この時点では収益は全くなく、10000米ドルの口座残高はすぐに底をつきました。実行終了後、一部のnnwファイルを更新しました)。最後にTestを使用してテストしたところ、StudyOnlineの結果とほぼ一致しました(利益は一切出ませんでした)。