2024年6月17日月曜日

遺伝的アルゴリズム2

遺伝的アルゴリズムは最適化問題を解くための手法です。

概要は一つ前のブログを御覧ください。

OnTester()で使うコードを作成しました。

関数の想定最大値(~Max)と最小値(~Min)は最適化するEAに合わせる必要があります。

ex)利益(Profit)の設定:利益の最大値は3,000,000、最小は初期証拠金が1,000,000のため、-1,000,000と設定しています。

この最大値と最小値の幅が実際の数値に近いほど、アルゴリズムの精度が高くなると考えられます。

間違えなどありましたら教えてください。(^^;)

double OnTester()

  {

  //想定最大値、最小値

  double Profit_Max=3000000;

  double Profit_Min=-1000000;

  double PF_Max=2;

  double PF_Min=0;

  double EX_Max=500;

  double EX_Min=-500;

  double DD_Max=1000000;

  double DD_Min=-1000000;

  double Trades_Max=10000;

  double Trades_Min=0;

  //値の取得

   double Profit=TesterStatistics(STAT_PROFIT);

   double PF=TesterStatistics(STAT_PROFIT_FACTOR);

   double Ex_Payoff=TesterStatistics(STAT_EXPECTED_PAYOFF);

   double DD=TesterStatistics(STAT_BALANCE_DD);

   double Trades=TesterStatistics(STAT_TRADES);

   //値が想定最大値、最小値の範囲を逸脱した場合修正

   Profit=MathMin(Profit,Profit_Max);

   Profit=MathMax(Profit,Profit_Min);

   PF=MathMin(PF,PF_Max);

   PF=MathMax(PF,PF_Min);

   Ex_Payoff=MathMin(Ex_Payoff,EX_Max);

   Ex_Payoff=MathMax(Ex_Payoff,EX_Min);

   DD=MathMin(DD,DD_Max);

   DD=MathMax(DD,DD_Min);

   Trades=MathMax(Trades,Trades_Max);

   Trades=MathMin(Trades,Trades_Min);   

   

   //標準化(各数字を0~1の範囲に標準化する)

   double ProfitNM   =(Profit-Profit_Min) /  (Profit_Max-Profit_Min);

   double PFNM       =(PF-PF_Min)         /  (PF_Max-PF_Min);

   double ExNM       =(Ex_Payoff-EX_Min)  /  (EX_Max-EX_Min);

   double DDNM       =(DD_Max-DD)         /  (DD_Max-DD_Min);//DDは小さいほうがいい

   double TradesNM   =(Trades-Trades_Min) /  (Trades_Max-Trades_Min);

      

   //平均二乗誤差でコスト計算&返す(コストは小さいほど優秀なので1/コスト)

   return 1/(pow(1-ProfitNM,2)+pow(1-PFNM,2)+pow(1-ExNM,2)+pow(1-DDNM,2)+pow(1-TradesNM,2));

  }

遺伝的アルゴリズム

MT4、MT5には、遺伝的アルゴリズムによる最適化機能が標準で搭載されています。

遺伝的アルゴリズムはAIの一種ですが、ディープラーニングとは異なります。

ほとんどの人が遺伝的アルゴリズムを使った経験はあるかもしれませんが、実際に活用している人はほとんどいないと思います。その理由は、遺伝的アルゴリズムが「使い物にならない結果」を選択することが多いためです。

遺伝的アルゴリズムは、「最適化パラメータ」を最適化の目標として選択します。最適化パラメータには、以下のようなものがあります。

  • Balance(残高)
  • Profit Factor(PF)
  • Expected Payoff(期待利得)
  • Maximal Drawdown(DD)
  • Drawdown Percent(DD%)
  • Custom(カスタム)

例えば、目標を残高にした場合、取引数が1で残高が最高の設定値を選ぶことがあります。しかし、このような設定値では実際に運用を行うことはできません。

最大ポジション数1で固定LOTのEAであれば、残高、PF、期待利得、DD、取引数のすべての指標を総合的に判断する必要があります。(複数のポジションを持つ場合や可変ロットの時はDD%です)

そこで、目標をCustomに設定し、OnTester()関数内でこれらすべての指標を使用した関数を用いて、遺伝的アルゴリズムに挑戦してみましょう。具体的な流れは以下の通りです。

  1. 残高、PF、期待利得、DD、取引数を取得する
  2. 各指標を正規化する
    ※最適化の途中では最大値、最小値はわからないので想定される最大値、最小値で正規化します
  3. 1で取得した値の平均二乗誤差からコスト(損失)を算出する
  4. コスト(損失)が低い設定値を選ぶために、1/コストを返す

各パラメーターを1つずつ最適化するか、すべてをまとめて遺伝的アルゴリズムで最適化するか、どちらの方法が再現性の高い、より利益を出せる設定値を作れるでしょうか

つづく(かも)

--------------------
追記
最適化の量が多い時はMT4からMT5にコンパイルしてMT5で最適化しましょう。
最適化時間が数分の1になります。