記事「ニューラルネットワークが簡単に(第47回):連続行動空間」についてのディスカッション

 

新しい記事「ニューラルネットワークが簡単に(第47回):連続行動空間」はパブリッシュされました:

この記事では、エージェントのタスクの範囲を拡大します。訓練の過程には、どのような取引戦略にも不可欠な資金管理とリスク管理の側面も含まれます。

前回の記事では、取引方向を決定するためだけにエージェントを訓練しました。エージェントの行動範囲は4つの選択肢に限られていました。

  • 買う 
  • 売る 
  • 維持/待機
  • すべてのポジションを閉じる

ここには資本とリスク管理の機能は見られません。すべての取引で最小ロットを使用しました。これは訓練アプローチを評価するには十分ですが、取引戦略を構築するには十分ではありません。収益性の高い取引戦略には、絶対に資金管理アルゴリズムが必要です。

さらに、安定した取引戦略を立てるためには、リスクを管理する必要があります。このブロックも私たちのデザインにはありません。EAは、新しい取引ローソク足ごとに市場の状況を評価し、取引操作を決定します。しかし、今後予定されているすべてのバーでは、口座にとってリスクが伴います。バー内での値動きが、残高に悪影響を及ぼす可能性があります。そのため、ストップロスの利用が常に推奨されています。このシンプルなアプローチにより、取引ごとのリスクを抑えることができます。

約3000回のパスの後、訓練セットで利益を生み出せるモデルを得ることができました。5ヶ月の訓練期間中、モデルは334件の取引をおこない、そのうちの84%以上が黒字でした。その結果、当初資本金の33%の利益を得ました。同時に、残高の減少幅は1%未満、資産では7.6%だでした。プロフィットファクターは26を超え、リカバリーファクターは3.16に達しました。下のグラフは、残高が増加傾向にあることを示しています。残高の線はほとんど常に資産の線より下にあります。これはポジションが正しい方向に開かれていることを示しています。同時に、保証金に対する負担は約20%です。これはかなり高い数字ですが、累積利益を上回るものではありません。

モデル訓練結果

モデル訓練結果

残念なことに、EAの成果は訓練セット以外では控えめであることが判明しました。

作者: Dmitriy Gizlyk

 
こんにちは。Expert Advisorが30~50回通過すると取引を開始しなくなります。これは正常なのでしょうか?新しいモデルファイルで5-7回試しました。もう少しパスが多いと取引を開始し続け、もう少し少ないと取引を開始します。しかし、取引を開始することはできません。私は4000パスでモデルの1つを訓練しようとしました。結果は同じで、直線です。
 
Viktor Kudriavtsev #:
こんにちは。Expert Advisorが30~50回通過すると取引を開始しなくなります。これは正常なのでしょうか?新しいモデルファイルで5-7回試しました。もう少しパスが多いと取引を開始し続け、もう少し少ないと取引を開始します。しかし、取引を開始することはできません。私は4000パスでモデルの1つを訓練しようとしました。結果は同じで、直線です。

こんにちは、ビクター。

モデルのトレーニングはかなり長いプロセスです。ライブラリのトレーニング係数は3.0e-4fに設定されています。つまり、1つの例だけでモデルを訓練した場合、約4000回の反復で学習することになります。このような小さな学習率は、モデルが重みを平均化し、訓練サンプルへの適合を最大化するために使用されます。

トランザクションの欠如については、これは学習プロセスを停止する理由にはならない。モデルの学習プロセスは、「試行錯誤」の手法に似ている。モデルは徐々にすべての可能な選択肢を試し、報酬を最大化する方法を探す。学習プロセスを構築する際、取引がなかった場合のペナルティを追加し、モデルがポジションをオープンするよう刺激するようにした。あるパスでモデルが取引を行わなかった場合、1回以上繰り返した後、ペナルティがその役割を果たし、モデルがこの状態から抜け出すはずです。このプロセスを早めるには、ノートレードのペナルティを大きくすればよい。しかし、ここで注意しなければならないのは、ペナルティがトレードによる損失の可能性を超えてはならないということです。そうしないと、モデルは利益が出ないポジションをオープンして、そのポジションがないことによるペナルティを回避しようとします。

 

Dmitriy Gizlyk 詳細な記事をありがとうございます。2023年1月1日から2023年5月31日の間にモデルを再トレーニングし、DDPGAct.nnwとDDPGCrt.nnwを作成しました。しかし、test.ex5でEAをテストしたところ、一度もトレードがありませんでした。

以下の手順を踏みました:

  1. https://www.mql5.com/ja/articles/download/12853.zip から Study.mq5 と test.mq5 をダウンロード、解凍、コンパイルします。
  2. Strategy Testerで、https://c.mql5.com/2/55/Study.png に示されているようにStudy.ex5を一度実行します。
  3. Strategy Testerで、https://c.mql5.com/2/55/Study_opt.png に示されているようにStudy.ex5を最適化する
  4. Strategy Tester で test.ex5 (Optimization: Disabled) を 2023 年 1 月 1 日から 2023 年 5 月 31 日の間で同じ期間実行する。
  5. (エラーもトレードも全くありません!)

以下のPrintFormat 行でデバッグを試みる:

...
   double sell_sl = NormalizeDouble(Symb.Bid() + ActorResult[5], Symb.Digits());
   PrintFormat("ActorResult[0]=%f  ActorResult[1]=%f ActorResult[2]=%f buy_sl=%f",ActorResult[0], ActorResult[1],  ActorResult[2], buy_sl);
   PrintFormat("ActorResult[3]=%f  ActorResult[4]=%f ActorResult[5]=%f sell_tp=%f",ActorResult[0], ActorResult[1],  ActorResult[2], sell_tp);
//---
   if(ActorResult[0] > 0 && ActorResult[1] > 0 && ActorResult[2] > 0 && buy_sl > 0)
      Trade.Buy(buy_lot, Symb.Name(), Symb.Ask(), buy_sl, buy_tp);
   if(ActorResult[3] > 0 && ActorResult[4] > 0 && ActorResult[5] > 0 && sell_tp > 0)
      Trade.Sell(sell_lot, Symb.Name(), Symb.Bid(), sell_sl, sell_tp);
...

を確認しました:

...
2023.12.01 23:15:18.641	Core 01	2023.05.30 19:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072910
2023.12.01 23:15:18.641	Core 01	2023.05.30 19:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070290
2023.12.01 23:15:18.641	Core 01	2023.05.30 20:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072830
2023.12.01 23:15:18.641	Core 01	2023.05.30 20:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070210
2023.12.01 23:15:18.641	Core 01	2023.05.30 21:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072450
2023.12.01 23:15:18.641	Core 01	2023.05.30 21:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.069830
2023.12.01 23:15:18.641	Core 01	2023.05.30 22:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072710
2023.12.01 23:15:18.641	Core 01	2023.05.30 22:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070090
2023.12.01 23:15:18.641	Core 01	2023.05.30 23:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.073750
2023.12.01 23:15:18.641	Core 01	2023.05.30 23:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.071130
...

何が間違っていたのか、あるいは見逃していたのか、教えていただけますか?

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

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2023.11.30
  • www.mql5.com
Trader's profile
ファイル:
Optimized.png  187 kb
 

こんにちは。このモデルは取引を開始しないのではなく、利益を上げるように設定されていないようです。スクリーンショットの直線はまさにそれを示しています。報酬のルールに何かが必要です。

float reward = (account[0] - PrevBalance) / PrevBalance;

if(account[0] == PrevBalance)
if((buy_value + sell_value) == 0)

報酬 -= 1;

次のようなバリエーションを試してみました。

float reward = (account[0] - PrevBalance) / PrevBalance;

if(account[0] == PrevBalance)

if((buy_value + sell_value) == 0)

報酬 -= 1;

if(buy_profit<10)

reward -= 1;

if(buy_profit>10)

reward += 1;

if(sell_profit<10)

報酬 -= 1;

if(sell_profit>10)

reward += 1;

役に立ちません。どうすればよいのか教えてください。

ファイル: