English Русский 中文 Español Deutsch Português
preview
ニューラルネットワークの実験(第6回):価格予測のための自給自足ツールとしてのパーセプトロン

ニューラルネットワークの実験(第6回):価格予測のための自給自足ツールとしてのパーセプトロン

MetaTrader 5トレーディングシステム | 12 6月 2023, 11:01
433 0
Roman Poshtar
Roman Poshtar

はじめに

パーセプトロンは、市場価格の予測に利用できる機械学習技術で、 価格予測に邁進するトレーダーや投資家に役立つツールです。 


一般的な概念

パーセプトロンは、入力データを受け入れて処理し、出力を提供する1つまたは複数のニューロンで構成される単純なニューラルネットワークです。パーセプトロンは、1957年にフランク・ローゼンブラットによって開発され、以来、金融分析や株式市場予測など、さまざまな分野で広く応用されています。

パーセプトロンは、価格予測などの分類や回帰の問題を解くのに利用できます。最も単純なケースでは、パーセプトロンは、複数の入力変数を受け取り、単一の出力シグナルを生成する単一のニューロンで構成されています。例えば、外国為替市場での価格を予測するためには、為替レート、取引量、消費者物価指数などの入力データを使用します。このデータを処理した後、ニューロンは通貨ペアの予測値である出力シグナルを生成します。

パーセプトロンの動作原理

パーセプトロンは、教師あり学習原理に基づいて動作します。つまり、パーセプトロンを過去のデータで訓練することで、様々な市場要因と価格の関係を判断するのです。このデータは、株価を予測するための各入力要因の重要度を決めるニューロンの重みを調整するために使用されます。

パーセプトロンは、学習モードと予測モードで動作することができます。訓練モードでは、パーセプトロンは過去のデータとFX市場の実価格を入力とし、予測誤差を最小化するように重みを調整します。

パーセプトロンを使ってFXの価格を予測することのメリット

  1. パーセプトロンを使ってFXの価格を予測することには、いくつかの利点があります。まず、パーセプトロンは市場の変化に適応し、新しいデータに応じて予測を調整することができるので、市場の変化に常に対応できない統計解析や時系列といった従来のデータ分析手法よりも効率的な分析が可能です。
  2. 第二に、パーセプトロンは多くの入力データを扱うことができるため、価格に影響を与える様々な要因を考慮することが可能です。これにより、従来のデータ分析手法よりも精度の高い価格予測をおこなうことができます。
  3. 第三に、パーセプトロンは大量のデータで訓練することができるため、多くの過去データを訓練や価格予測に利用することが可能です。

ただし、パーセプトロンを使った価格予測には、デメリットもあります。まず、パーセプトロンはデータのスパイクやエラーの影響を受けやすく、これが不正確な価格予測につながる可能性があります。第二に、パーセプトロンの訓練には大量の履歴データが必要です。過去のデータが現在の市場状況を十分に代表していない場合、パーセプトロンの予測は不正確となる可能性があります。

また、パーセプトロンが過去のデータに敏感になりすぎて、新しい市場の変化に適応できなくなると、過剰適合の問題が発生する可能性があります。この問題に対処するためにはL1正則化やL2正則化など、様々な正則化技術を用いり、ニューロンの重みを制御して過剰適合を防止することができます。

パーセプトロンは、自己回帰モデル(ARIMA)や指数平滑法などの他の予測手法と組み合わせて使用することで、より正確で信頼できる予測を得ることができます。例えば、長期的な価格トレンドの予測にはパーセプトロンを使い、短期的な予測にはARIMAや指数平滑法を使うことができます。パーセプトロンの訓練に使う過去のデータが現在の市場環境と一致しない場合があり、このような場合、予測結果が不正確になる可能性があります。したがって、市場の変化を適切に反映できるよう、モデルを定期的に更新する必要があります。


最適化のためのパーセプトロンパラメータ

パーセプトロンは、入力層、隠れ層、出力層からなる最も単純なタイプのニューラルネットワークの1つで、分類、回帰、画像処理など様々なタスクに使用することができます。ただし、パーセプトロンを有効に働かせるためには、そのパラメータを正しく選択する必要があります。

パーセプトロンのパラメータは、その構造や動作を定義する値です。隠れ層の数、各層のニューロン数、活性化関数、学習率など、さまざまなものがあります。パラメータを適切に調整することで、パーセプトロンが最良の結果を得ることができます。

ここでは、最適化可能なパーセプトロンのパラメータをいくつか紹介します。

隠れ層の数

隠れ層の数は、モデルの複雑さを決定します。モデルが単純すぎるとタスクに対応できない可能性があり、複雑すぎると過剰適合が発生する可能性があります。したがって、隠れ層の数は、解決すべき問題に基づいて最適なものを選択する必要があります。

各層のニューロン数

また、各層のニューロン数もモデルの複雑さに影響します。ニューロンの数が多いと予測精度が上がりますが、同時に訓練時間が長くなります。ニューロンの数は、特定のタスクに最適であるべきです。

以下は、入力層、隠れ層、出力層のニューロン数を調節する例です。ここでは、NeuralNetsライブラリを使用しています。

int OnInit()
  {

// set the number of neurons in the input, hidden and output layers
int n_inputs = 2;
int n_hidden = 3;
int n_outputs = 1;

// create a perceptron object
CNeuralNet ann;

// add layers
ann.AddLayer(n_inputs);
ann.AddLayer(n_hidden, CNeuralNet::TANH);
ann.AddLayer(n_outputs, CNeuralNet::TANH);

// set learning parameters
ann.SetLearningRate(0.1);
ann.SetMomentum(0.9);
ann.SetMaxEpochs(1000);
ann.SetDesiredAccuracy(90);

// create arrays to store input and target values
double inputs[][2] = {{0,0}, {0,1}, {1,0}, {1,1}};
double targets[] = {0, 1, 1, 0};

// train the perceptron
ann.Train((double*)inputs, targets, 4);

// test the perceptron
double output;
ann.Compute((double*)inputs[0], output);
Print("0 XOR 0 = ", output);
ann.Compute((double*)inputs[1], output);
Print("0 XOR 1 = ", output);
ann.Compute((double*)inputs[2], output);
Print("1 XOR 0 = ", output);
ann.Compute((double*)inputs[3], output);
Print("1 XOR 1 = ", output);

}

この例では、2つの入力ニューロン、3つの隠れニューロン、1つの出力ニューロンを持つパーセプトロンを作成します。また、訓練率、モーメント、最大エポック数などの訓練パラメータを設定しました。次に、入力値と目標値を格納するための配列を作成し、そのデータでパーセプトロンを訓練します。パーセプトロンを4種類の入力でテストした後、その結果を画面に表示します。

活性化関数

活性化関数は、ニューロンが入力に対してどのように反応すべきかを決定します。sigmoid、ReLU、tanhなど、多くの活性化関数があります。活性化関数の選択は、解決すべき問題にも依存します。

以下は、活性化関数を使い分けた例です。

int OnInit()
  {

// set the number of neurons in the input and output layers
int n_inputs = 2;
int n_outputs = 1;

// create a perceptron object
CNeuralNet ann;

// add layers
ann.AddLayer(n_inputs);
ann.AddLayer(3, CNeuralNet::TANH);
ann.AddLayer(n_outputs, CNeuralNet::SIGMOID);

// set learning parameters
ann.SetLearningRate(0.1);
ann.SetMomentum(0.9);
ann.SetMaxEpochs(1000);
ann.SetDesiredAccuracy(90);

// create arrays to store input and target values
double inputs[][2] = {{0,0}, {0,1}, {1,0}, {1,1}};
double targets[] = {0, 1, 1, 0};

// train the perceptron
ann.Train((double*)inputs, targets, 4);

// test the perceptron
double output;
ann.Compute((double*)inputs[0], output);
Print("0 XOR 0 = ", output);
ann.Compute((double*)inputs[1], output);
Print("0 XOR 1 = ", output);
ann.Compute((double*)inputs[2], output);
Print("1 XOR 0 = ", output);
ann.Compute((double*)inputs[3], output);
Print("1 XOR 1 = ", output);

}

この例では、3つのニューロンからなる隠れ層を追加し、隠れ層にはtanh、出力層にはsigmoidの活性化関数を選択します。

訓練率

訓練率は、ニューラルネットワークが重みを変化させる速さを決定します。訓練率が高すぎるとオーバーフローになり、逆に値が低すぎると訓練が長引く可能性があります。特定のタスクに最適な訓練レートを選択する必要があります。

正則化

正則化とは、過剰適合を防ぐために用いられる手法です。これは、誤差関数に、重みが大きすぎるモデルにペナルティを与える追加の項を追加するものです。正則化により予測値の広がりを抑え、モデルの汎化能力を向上させることができます。

重みの初期化

重みの初期化とは、パーセプトロンの各ニューロンの重みを初期設定することです。重みの初期化が正しくおこなわれないと、モデルが誤差関数の大域的最小値ではなく局所的最小値に収束してしまうことがあります。そのため、重みを初期化する方法を正しく選択する必要があります。

バッチサイズ

バッチサイズは、1回の訓練反復で使用されるデータサンプルの数を決定します。バッチサイズが小さすぎると学習が遅くなり、大きすぎるとメモリのオーバーフローにつながります。特定のタスクに最適なバッチサイズを選択します。

オプティマイザー

オプティマイザーとは、訓練中にモデルの重みを更新するために使用されるアルゴリズムです。確率的勾配降下法、Adam、RMSpropなど、多くのオプティマイザーがあります。それぞれのオプティマイザーには長所と短所があり、最適なオプティマイザーを選択することはタスクによって異なります。

一般に、パーセプトロンの最適なパラメータは、解決すべき問題によって異なります。特定のタスクに最適なセットを見つけるために、異なるパラメータ値を実験することが必要です。機械学習はモデルを繰り返し改良するプロセスであり、パラメータを適切に調整することがより良い結果を得るための鍵です。



指標と価格をパーセプトロンに渡して市場分析をおこなう

指標は、市場を分析するために使用される数式で、トレンド、エントリポイントとエグジットポイント、支持・抵抗レベルの特定に役立ちます。パーセプトロンでFX市場を分析する際に使用できる代表的な指標には、以下のようなものがあります。

  • 移動平均線
  • 相対力指数(RSI)
  • ストキャスティックオシレーター
  • MACD (Moving Average Convergence Divergence)

終値と指標をパーセプトロンに渡すことで、モデルは市場分析の様々な側面を考慮し、より正確な価格予測を作成することができます。例えば、移動平均線を使って市場全体のトレンドを判断し、ストキャスティクスオシレーターを使って市場のエントリポイントを判断するようなモデルです。

しかし、多数の指標をパーセプトロンに渡すと、データの冗長性が問題になります。データの冗長性は、モデルの過剰適合や汎化能力の低さにつながる可能性があります。したがって、市場分析という特定の課題に対して、最も重要な指標を選択する必要があります。

また、パーセプトロンへのデータ転送には、適切なデータの前処理が必要です。例えば、データに欠損値が含まれている場合、欠損値を平均値で埋める、欠損値のある行を削除するなど、この問題を解決する必要があります。

パーセプトロンの最適なパラメータを選択することで、モデルが最適な訓練と価格予測をおこなうことができるようにする必要があります。最適化が必要な主なパラメータには、以下のようなものがあります。

  1. 隠れ層のニューロン数
  2. ニューロン活性化関数
  3. 学習エポック数
  4. 訓練用のデータミニバッチの大きさ

最適なパラメータの選択は、試行錯誤でおこなうか、遺伝的アルゴリズムや勾配を利用した最適化手法などの最適化アルゴリズムを用いておこないます。


事例と実用化

ここでは、2つの移動平均線の距離を入力として渡す単純なパーセプトロンに基づくEAの例を考えてみます。値1の移動平均線指標と値24の移動平均線指標の間の距離を渡します。CLOSEによる決済で指数移動平均を使用しますが、まずこれらの値をポイントに変換して正規化します。 

ロウソク足1、4、7、10(4パラメータ)の距離を入力として使用します。パーセプトロンの出力では、買いポジションを開く、売りポジションを開くという2つの値が得られます。これらの条件は、標準的なものではありません。パーセプトロンの使用例としてあげられています。今回の例は、できるだけシンプルなものにします。 

ここでは、本文中で繰り返さないように、最適化とフォワードテストのためのすべてのパラメータを提供します。
  • 外国為替市場
  • 通貨ペアEURUSD
  • 時間枠H1
  • StopLoss 300とTakeProfit 600(EAのTakeProfitは、StopLossに2を掛けたものに設定)
  • 最適化とテストのモードには「始値のみ」、「高速(遺伝的アルゴリズム)」、「最大複合基準」があります。「最大複合基準」モードを使用することが非常に重要です。「最大収益性」と比較して、より安定した収益性の高い結果を示しました。
  • 最適化範囲3年:2019.04.19から2022.04.19まで。3年は信頼できる基準ではありません。このパラメータはご自分でいろいろとお試しください。
  • フォワードテスト範囲1年:2022.04.19から2023.04.19まで
  • 初回入金:10,000単位
  • レバレッジ:1:500

最適化

EA最適化パラメータ:

最適化

EA最適化結果:

最適化


最適化

以下、フォワードテスト結果ベスト5です。

テスト1


テスト2


テスト3


テスト4


テスト5


結論

結論として、パーセプトロンはFX市場における価格予測のための強力なツールで、単独あるいは他のデータ分析手法と組み合わせて使用することができます。しかし、パーセプトロンを使ってFXの価格を予測する際に最良の結果を得るためには、その限界を認識し、過去のデータの文脈を考慮する必要があります。また、FX取引に関する一定の知識と経験を持ち、FX取引に伴う高いリスクを理解することが必要です。

ご清聴ありがとうございました。


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

添付されたファイル |
Perceptron_MA_4.mq5 (39.78 KB)
NeuralNets.mqh (7.83 KB)
取引における資金管理 取引における資金管理
資金管理システムの新しい構築方法をいくつか見て、その主な特徴を定義します。今日では、あらゆる好みに合わせて、かなりの数の資金管理戦略が存在します。さまざまな数学的成長モデルに基づいた資金管理方法をいくつか考えてみます。
MetaTraderのMultibot:1つのチャートから複数のロボットを起動させる MetaTraderのMultibot:1つのチャートから複数のロボットを起動させる
今回は、個々のチャートにロボットの各インスタンスを設定する必要がなく、1つのチャートにのみ接続された状態で複数のチャートで使用できる汎用MetaTraderロボットを作成するための簡単なテンプレートについて考えてみます。
プロップファームから少し教訓を得よう(第1回)-導入編 プロップファームから少し教訓を得よう(第1回)-導入編
今回は、プロップファーム(自己勘定取引会社)が実施するチャレンジルールから得られる教訓のいくつかを取り上げます。これは特に、初心者の方や、この取引の世界で足元を固めるのに苦労している方には重要です。次の記事では、コードの実装について説明します。
MQL5でJanus factorを実装する MQL5でJanus factorを実装する
ゲイリー・アンダーソンは、「Janus factor」と名付けた理論に基づく市場分析法を開発しました。この理論は、トレンドを明らかにし、市場リスクを評価するために使用できる一連の指標を記述するものです。今回は、これらのツールをMQL5で実装してみます。