PR

【機械学習&AI】ONNXとMQL5で実現する高度なAIトレードシステム

MQL5記事

ONNX (Open Neural Network Exchange) を活用してMetaTrader 5で高度なAI取引システムを構築する方法を解説します。本記事では以下の内容をカバーします:

  • ONNXを使用する際の主要な課題とその解決策
  • データのスケーリングと正規化の実装方法
  • 時系列データの効果的な処理テクニック
  • 主成分分析(PCA)による次元削減の適用
  • MQL5での具体的なコード例と実装ガイド

これらの技術を組み合わせることで、より洗練された予測モデルを構築し、自動売買システムの性能を向上させる方法を学びましょう。

WAN
WAN

MQL5を使うとAI搭載EAが簡単に作成できちゃう(‘ω’)

ONNXを利用する際の課題

データの前処理

機械学習において、データ処理とは、データセットの特徴量の値を特定の範囲に変換するプロセスを指します。この変換の主な目的は、機械学習モデルのために、より一貫性のあるデータ作成することです。

スケーリングの重要性

  • 機械学習モデルのパフォーマンス向上:多くの機械学習アルゴリズム、特にK近傍法(KNN)やサポートベクトルマシン(SVM)のような距離ベースのものは、データ点間の距離計算に依存しています。特徴量のスケールが大きく異なる場合、スケールの大きい特徴量が距離計算を支配し、モデルのパフォーマンスが最適化されない可能性があります。
  • 訓練の収束を加速:勾配降下ベースの最適化アルゴリズムは、ニューラルネットワークなどで一般的に使用されます。特徴量のスケールが異なると、勾配の大きさも大きく異なり、オプティマイザが効率的に最小値を求めることが難しくなります。
  • 数値演算の安定性確保:一部の機械学習アルゴリズムでは、スケールが大きく異なる特徴量で計算が不安定になる可能性があります。スケーリングは、このような数値的な問題を防ぎ、モデルが正確に計算を実行できるようにします。

一般的なスケーリング技法

  • 正規化(MinMaxScaling):特定の範囲(多くの場合、0~1または-1~1)に特徴量をスケーリングします。
  • 標準化(Zスコア正規化):各特徴量から平均を引き、標準偏差で割ることでデータをセンタリングしスケーリングします。
WAN
WAN

FXでいうとUSDJPYとEURUSDの値動きを比較するようなもの

USDJPYの1.0とEURUSDの1.0は天と地の差があるから基本的にはpipsかpointで比較するよね

MQL5でのスケーリング実装

MQL5でスケーリングを実装するには、以下の3つのステップを踏む必要があります:

  1. 市場からデータを収集し、スケーリングする
  2. スケーラーを保存する
  3. スケーリングしたデータをCSVファイルに保存する

以下は、これらのステップを実装するためのコード例の一部です:

#include <MALE5\preprocessing.mqh>
#include <MALE5\MatrixExtend.mqh>

StandardizationScaler scaler;

// データ収集とスケーリング
matrix OHLC(data_size, 4);
for (int i=0; i<data_size; i++)
{
  OHLC[i][0] = rates[i].open;
  OHLC[i][1] = rates[i].high;
  OHLC[i][2] = rates[i].low;

  if (rates[i].close>rates[i].open)
    OHLC[i][3] = 1; // Buy signal
  else if (rates[i].close<rates[i].open)
    OHLC[i][3] = 0; // Sell signal
}

matrix x;
vector y;
MatrixExtend::XandYSplitMatrices(OHLC, x, y);
x = scaler.fit_transform(x);   

// スケーラーの保存
if (!scaler.save(Symbol()+"-SCALER"))
  return;

// スケーリングしたデータのCSV保存
OHLC = MatrixExtend::concatenate(x, y);
if (!MatrixExtend::WriteCsv(Symbol()+"-OHLSignal.csv",OHLC,"open,high,low,signal",false,8))       
{
 DebugBreak();
 return;
}

このコードは、市場データを収集し、スケーリングを適用し、スケーラーとスケーリングされたデータを保存します。これにより、後で同じスケーリングパラメータを使用してリアルタイムデータを処理することができます。

時系列データの課題

GRU、LSTM、RNNなどの時系列ディープラーニングモデルは、株式市場の予測において他のモデルよりも優れた性能を示すことが研究によって示唆されています。これらのモデルは一定期間にわたるパターンを理解する能力があるため、多くのアルゴリズムトレーダーに好まれています。

時系列モデルを扱う際には、データを適切な形式に準備する必要があります。

時系列データ準備の重要性

  1. シーケンシャルな情報の保持:時系列データは順序が重要です。適切な準備により、モデルはこの順序情報を学習できます。
  2. 適切な入力形状の確保:LSTMなどのモデルは特定の形状の入力を期待します。データ準備はこの要件を満たすために不可欠です。
  3. 予測の精度向上:適切に準備されたデータは、モデルがより正確な予測を行うのに役立ちます。
  4. 過去の情報の活用:時系列データの準備により、モデルは過去の情報を効果的に利用して将来の予測を行うことができます。

MQL5での時系列データ処理

MQL5で時系列データを処理するために、CTSDataProcessorというクラスを作成しました。以下はその一部です:

class CTSDataProcessor 
{
private:
  CTensors *tensor_memory[];
  bool xandysplit;

public:
  CTSDataProcessor(void);
  ~CTSDataProcessor(void);

  CTensors *extract_timeseries_data(const matrix<double> &x, const int time_step);
  CTensors *extract_timeseries_data(const matrix<double> &MATRIX, vector &y, const int time_step);
};

このクラスは、リアルタイム予測用と訓練・テスト用の2つのextract_timeseries_data関数を提供します。これらの関数は、入力データを時系列形式に変換し、LSTMモデルで使用できる形式にします。

EAでこの時系列データ処理を使用する例は以下の通りです:

CTSDataProcessor ts_dataprocessor;
CTensors *ts_data_tensor;

// データ収集コード...

ts_data_tensor = ts_dataprocessor.extract_timeseries_data(data, time_step_);
data = ts_data_tensor.Get(0);
data = scaler.transform(data);

int signal = onnx.predict_bin(data, classes_);

このコードは、収集されたデータを時系列形式に変換し、スケーリングを適用してから、ONNXモデルを使用して予測を行います。

次元削減の方法

次元削減は、機械学習モデルの性能を向上させるための重要な技術です。主成分分析(PCA)などの次元削減技術には以下のような利点があります:

  1. モデル性能の向上:高次元のデータは「次元の呪い」につながる可能性がありますが、PCAはこの問題を軽減できます。
  2. より迅速な訓練と処理:特徴量の数を減らすことで、訓練時間が短縮され、必要な計算資源が少なくなります。
  3. 過剰適合の削減:PCAは最も情報量の多い特徴量に焦点を当てることで、過剰適合のリスクを軽減します。
  4. データの可視化:高次元データを2次元や3次元に削減することで、データの構造や傾向を視覚化しやすくなります。
  5. ノイズの削減:PCAは主要な変動を捉えるため、データに含まれるノイズを減らす効果があります。

MQL5でのPCA実装

MQL5でPCAを実装するには、まずONNXのデータ収集スクリプトにPCAを追加します:

#include <MALE5\Dimensionality Reduction\PCA.mqh>

CPCA *pca;

// PCAの適用
pca = new CPCA(2); // 2つの主成分に削減
x = pca.fit_transform(x);
if (!pca.save(Symbol()+"-PCA"))
  return;

次に、メインのEAでPCAを使用します:

#include <MALE5\Dimensionality Reduction\PCA.mqh>

CPCA *pca;

// PCAの読み込みと適用
if (use_pca)   
{
  pca = new CPCA(pca_mean, pca_comp_matrix);
  data = pca.transform(data);
}

これにより、ONNXモデルに入力する前にデータの次元を削減することができます。PCAを使用することで、計算効率が向上し、モデルの過学習リスクを軽減できる可能性があります。

WAN
WAN

EAでPCAによる次元削減をしてからONNXに渡すのはとても画期的な方法!

取引ロジックの実装

ONNXモデルからの予測に基づいて取引を行うための簡単な戦略を実装しました。以下はその一部です:

void OnTick()
{
  // データ収集とモデル予測...

  int signal = onnx.predict_bin(data, classes_);

  if (signal==1) 
  {
    if (!PosExists(POSITION_TYPE_BUY))
      m_trade.Buy(min_lot,Symbol(), ticks.ask);
    else
    {
      PosClose(POSITION_TYPE_BUY); 
      PosClose(POSITION_TYPE_SELL); 
    } 
  }
  else
  {
    if (!PosExists(POSITION_TYPE_SELL))
      m_trade.Sell(min_lot,Symbol(), ticks.bid);
    else
    {
      PosClose(POSITION_TYPE_SELL); 
      PosClose(POSITION_TYPE_BUY); 
    }
  } 
}

この戦略は、モデルの予測に基づいて買いまたは売りのポジションを開き、シグナルが変化した場合は既存のポジションを閉じます。

バックテストの結果、PCAを適用したLSTMモデルは52.48%の精度を示しました。これはPCAなしの89%には及びませんが、次元削減を行った場合でも予測可能性があることを示しています。この結果は、PCAの使用が必ずしもパフォーマンスの向上につながるわけではないことを示唆していますが、計算効率とモデルの複雑さのトレードオフを考慮する必要があります。

WAN
WAN

89%は高すぎる気がするので52%は現実的ですね。

必要じゃない情報で過学習を起こしてる可能性もあり

まとめ

ONNXは、異なるプラットフォーム間で機械学習コードを共有するための強力なツールです。ディープラーニングやAIモデルをMQL5言語で実装する際の作業量と困難さを大幅に軽減することができます。しかし、信頼性の高い機能的なプログラムを作成するためには、ユーザー側でもいくつかの作業を行う必要があります。

本記事で紹介した手法を利用することで、データのスケーリング、時系列データの処理、次元削減といった課題を克服し、ONNXの可能性を最大限に引き出すことができます。これらの技術を組み合わせることで、より洗練された予測モデルを構築し、自動売買システムの性能を向上させることが可能になります。

オンラインコミュニティ

こちらのコミュニティで、AIや機械学習をトレードに活かすために日々探求しています。
興味のある方は覗いてみてください。

参考記事

記事本文のコードは下記の記事の内容を引用しています。

ONNX統合の課題を克服する
ONNXは、異なるプラットフォーム間で複雑なAIコードを統合するための素晴らしいツールです。ただし、この素晴らしいツールを最大限に活用するためにはいくつかの課題に対処する必要があります。この記事では、読者が直面する可能性のある一般的な問題と...
タイトルとURLをコピーしました