自己適応アルゴリズムの開発(第II部): 効率の向上

23 4月 2021, 09:14
Maxim Romanov
0
312

はじめに

この記事を読む前に、最初の記事「自己適応アルゴリズムの開発(第I部): 基本的なパターンの検索」をお読みになることをお勧めします。読まなくても要点は明解なので、読むのは必須ではありませんが、より興味深いでしょう。

前回の記事では、単純なパターンを検出し、それを利用する非常に単純なアルゴリズムを開発しました。しかし、アルゴリズムには柔軟な構造がなく、優れた結果は期待できません。

より柔軟になり、市場の状況に応じて動作パラメータを調整してより優れた結果と安定性を実現できるように、アルゴリズムを大幅に改善する必要があります。

欠点の分析

以前のバージョンの欠点を分析して、新しいアルゴリズムの開発を始めましょう。次の欠点を強調します。

  • シリーズを開くためのシグナルは非常にまれです。シグナル品質を改善すると、入力シグナルの数と全体的な利益が大幅に減少します。
  • 分析のために固定のサンプリング期間が使用されます。サンプルは範囲によって設定されますが、サイズが固定された1つのサンプルを分析することはあまり効率的な解決策ではありません。市場は正弦波ではなく、「尾」が現在のシグナル品質に影響を与えます。サンプルの境界はあいまいで、最終的な決定に影響を与える必要があります。大まかに言えば、以前のバージョンでは100本のローソク足を使用して弱気/強気のローソク足の優勢を分析しました。超過がしきい値を超えた場合、エントリシグナルが生成されました。サンプルは、固定ではなく動的である必要があります。分析期間内とそれ以降の両方の状況に注意する必要があります。
  • 固定分析期間の問題は、すべてのよく知られた方法に共通しているわけではありません。
  • 割合しきい値は、サンプル内のローソク足の数に関係なく、サンプルごとに固定値になります。超過が75%になる確率は30本と200本のローソク足のサンプルではまったく異なるため、このソリューションは効果的ではありません。サンプル内のローソク足の数が増えると、確率は非線形的に減少します。
  • 各ローソク足でポジションを開くにはコストがかかりすぎ、ドローダウンが増加します。開かれるポジションが多すぎるため、シリーズ内のポジションの数を減らす必要があります。これにより、資本の使用効率が向上します。
  • ロットあたりの固定利益でポジションを決済すると、安定性または収益性が低下します。絶えず変化する市場において、安定性と収益性の間の妥協点を見つける必要があります。パラメータを調整しないと、ロボットはポジション系列の最適な決済のタイミングを見逃して、すぐに損失を被ります。
  • 同時に取引される商品の数が厳しく制限されると、システム全体の収益性が低下します。異なる商品のシリーズオープンシグナルは、互いにわずかに相関しています。したがって、ある商品で損失を被ることは、別の商品で損失を被ることと相関する可能性があります。ドローダウン値を大幅に増加させることなく、同時に取引される商品の数を大幅に増加させることができるように、シグナルの相関を減らすための対策を開発する必要があります。

簡略化された作業アルゴリズム

アルゴリズムの最初のバージョンがどのように機能したかを思い出させてください。新しいバージョンでは、作業は同じままですが、各手順が改訂および改善される必要があります。

  • N本のローソク足の期間をスキャンします。 
  • 弱気または強気のどちらのローソク足が優勢であるかを確認します。
  • 超過がしきい値を超えると、一連のポジションを開始するシグナルがアクティブになります。
  • 弱気のローソク足が優勢=買いシグナル、強気のローソク足が優勢=売りシグナルです。
  • ロットを計算します。
  • シリーズ決済条件がトリガーされるまで、後続の各ローソク足で新しいポジションを開きます。 
  • シリーズ決済条件がトリガーされます。
  • すべてのポジションを決済します。
  • 新しいシグナルを検索します。

更新

ロボットは2016年にMetaTrader4用に開発されました。そのコードは以下に添付されています。

開発中に、特定されたすべての欠点を排除するため、開発全体を個別のタスクに分割します。

  1. 動的なシリーズ開始割合しきい値

最初のバージョンのアルゴリズムは、分析期間内のローソク足の数の増加または強気/弱気ローソク足の超過率のしきい値の増加によって、より安定しました。分析のためにより大きなサンプルサイズを設定するかより高いローソク足の超過率を設定して、妥協する必要がありました。テストでは、最適な超過率はほぼどんな数のローソク足でも調整できることが示されましたが、ローソク足の数が増えるごとに減少するはずです。

割合しきい値が固定されている場合、分析期間内のローソク足の数が増えると、そのような組み合わせの可能性が低くなります。したがって、分析期間ではローソク足の最大数を任意に設定できます。単にこのような組み合わせに遭遇する確率が急速に低下しているために、結果にほとんど影響を与えないためです。シリーズ開始シグナルの数を増やすには、サンプル内のローソク足の数を増やしても組み合わせの確率がほぼ同じになるように、超過率のしきい値を下げる必要があります。

与えられた数のローソク足に対する与えられた超過率の確率は、組み合わせ論を使用して計算できると仮定します。

CP,

ここで

  • С - 組み合わせの数
  • n - サンプル内のローソク足の数
  • k - 強気ローソク足の数
  • P - 事象確率
  • P2 - 事象確率x2

一方向(弱気または強気)のローソク足の数の方が多い場合にPが計算されるため、イベント確率Pに2を掛ける必要があります。関心があるのは全体的な確率で、方向は関係ありません。弱気ローソク足の数が強気ローソク足の数と等しい場合にのみ、確率に2を掛ける必要はありません。

例として、30本のローソク足のうち一方向に24本、別の方向に6本のローソク足がある場合の事象確率を計算してみましょう。これを実現するために、下の図1に示す表を用意しました。

確率表

図1 確率表

30本のうち一方向のローソク足が24本の場合、これは80%の超過に相当します。そのような組み合わせの確率は0.11%です。次に、表を参照して、サンプル内の100本のローソク足に必要な超過率を確認します。これにより、その発生確率は0.11%になります。このような組み合わせの確率は、100本のローソク足では見られないことがわかります。0.172%と0.091%の確率があるので、よりまれなオプションを選択します。これは、あるタイプのローソク足と別のタイプのローソク足の比率が66/34である、つまり、別方向のローソク足が一方向のローソク足の66%であることに対応します。

明らかに、強気/弱気のローソク足の超過が80%である30本のローソク足の組み合わせは、超過が66%である100本のローソク足の組み合わせと同じくらい頻繁に発生します。ローソク足の数に対する超過率の依存性は非線形的です。したがって、ローソク足の数を増やして割合を調整するには、非線形関数を適用する必要があります。私はそのような関数を開発しました。

非線形関数

ここで

  • Nb — サンプル内のローソク足の数
  • Koef_NonLiner_proc — 割合しきい値を調整するための設定の比率

図2のグラフは、組み合わせ法を使用して、ローソク足の数が増えると、超過率が(組み合わせが発生する静的確率で)どのように減少するかを示しています。また、開発した機能の適合性を評価することもできます。

チャート機能

図2

紫色の線は、組み合わせが発生する確率を固定して、サンプル内のローソク足の数を増やしながら、超過率が減少していることを示しています。赤い線は、サンプル内のローソク足の数に基づく超過率減少関数に属しています。両方の関数は非線形ですが、開発された関数はよりゆっくりと減衰します。これは意図的に行われています。サンプル内のローソク足が多いほど、50%に戻ったときにシリーズ内により多くのポジションを開くことができるためです。ポジションが多いほど、預金への負荷とドローダウンがより多くなります。 

シグナルはローソク足がより多い場合に現れる頻度が少なくなるように配置されています。さらに、それは、特定の数のローソク足に対して超過率が本当に高い場合にのみ発生します。

2. シグナル品質の改善

シグナル品質を向上させるためには、サンプルは厳密に固定された数のローソク足で構成されるべきではありません。強気のローソク足の超過は30本のローソク足で65%であることがわかりますが、それが多いか少ないかはどのように定義できるでしょうか。100本のローソク足で強気のローソク足に何らかの超過がある場合、この事実はシグナルを強くするはずですが、超過がない場合、または逆に弱気のローソク足が余分にある場合、シグナルは弱くなるはずです。シグナルを強めたり弱めたりする2つのメカニズムを開発しました。

a) 割合の加重平均の適用:Min_diap_barおよびMax_diap_barパラメータで設定された範囲からすべてのサンプルの割合の加重平均を見つけます。サンプルは、何らかのステップで取得する必要があります。私は2の偶数ステップを好みます。割合の加重平均は、最初のサンプルで大きいローソク足のタイプに対して決定されます。最初のサンプルに強気のローソク足が多い場合は、他のすべてのサンプルの強気のローソク足の割合を計算します。最大または最小のサンプルを最初にすることができます。これを行うために、Bigin_pereb_barスイッチが設定に追加されました。重みの比は任意の関数を使用して作成できますが、サンプル内のローソク足の数に比例するように作成しました。 

最初のサンプルのローソク足の数が最も少ない場合、その重みの比はW1であり、2番目のサンプルの場合、重みはW2であり、以下同様にWnまで続きます。

加重平均

  • W1 - 最初のサンプルの重みの比
  • W2 - 2番目のサンプルの重みの比
  • Wn - n番目のサンプルの重みの比
  • Nb1 - 最初のサンプルのローソク足の数
  • Nbn - n番目のサンプルのローソク足の数
  • Pw - ローソク足の超過の割合の加重平均
  • P1 - 最初のサンプルの弱気/強気のローソク足の割合
  • Pn - n番目のサンプルの弱気/強気のローソク足の割合
  • Nbm - 最大のサンプルのローソク足の数

最初のサンプルのローソク足の数が最も多い場合は、重みの比を逆にする必要があります。

 逆の重み
シリーズ開始シグナルを取得するには、割合の加重平均をPorog_Weighted_proc設定で指定された個別の値と比較します。

b) 複数サンプルの使用:ローソク足の種類がしきい値を超えているサンプルをいくつか範囲から選択します。ここでは、サンプル数が多く、超過率がしきい値よりも大きいほど、シグナル品質が高いと想定します。非線形の割合を割合のしきい値として使用します。言い換えると、ローソク足の数が独自のサンプルごとに、個別の超過率のしきい値を適用します。
Kol_viborパラメータは、超過がしきい値を超える必要があるサンプルの最小数を設定します。超過率を定義するローソク足のタイプは、最初のサンプルでどのローソク足タイプが優勢であるかによって異なります。しきい値を超える超過が検出されたサンプルは、最初のサンプルと見なされます。最小から最大まで、またはその逆の範囲で反復して、作業を比較できるようにしました。
これにより、固定の分析期間に縛られることなく、より広い期間でシグナルを考慮することができます。たとえば、分析期間の範囲は、2のステップで30〜300本のローソク足に設定されます。シグナルを形成するには、超過がしきい値を超える範囲から少なくとも5つのサンプルを収集します。超過分は、30、52、100、101、および200本のローソク足で形成される可能性があります。各サンプルは、非線形の割合の使用によってその割合しきい値と比較されます。これにより、固定値に拘束されることなく、ローソク足の幅広い範囲での開発をより効率的に評価できます。

価格チャート

図3

図3に例を示します。強気のローソク足が優勢で、売りポジションを開くシグナルがある領域を見ることができます。これは明確な数のローソク足ではなく、領域です。  

最初の記事で、結果として生じる超過分が理論的に補償されるローソク足の数(したがって、シリーズ内のポジションの数)は、それが出現したローソク足の数に基づいて計算されると書きました。このアプローチのおかげで、自己適応に向けた最初のステップが取られます。アルゴリズムはまだ自己適応にはほど遠いですが、現在の市場パラメータを使用して動作パラメータをわずかに調整することで、すでに目標に近づいています。
完全なアルゴリズムには、構成可能なパラメータを含めるべきではありません。各パラメータは、現在の市場パラメータに基づいて正確に計算する必要があります。アルゴリズムの収益性を維持するには、各時点でどのパラメータを設定する必要があるかを正確に知る必要があります。
3. シリーズのポジション数の減少

アルゴリズムの最初のバージョンには問題がありました。シリーズが開始されたとき、EAは各ローソク足でポジションを開きました。このアプローチは、大きなドローダウンにつながり、預金の要件が増えるため、あまり効率的ではありません。ポジションが開かれたが、サンプルの超過率の増加/減少の速度が十分でないという状況がしばしばありました。この説明のつかない要因により、安定性が失われました。この要因を考慮して、アルゴリズムの安定性を向上させる必要があります。

シリーズのポジション数を減らす2つの対策を開発しました。

a) 新しいポジションは、売りポジションの場合は強気のローソク足でのみ開き、買いポジションの場合は弱気のローソク足でのみ開きます。このようなメカニズムにより、あるタイプのローソク足が別のタイプのローソク足よりも優勢であるという事実からより効果的に利益を得ることができます。

弱気のローソク足で売りポジションを開くと、ポジションの始値の平均が下がり、価格が上がると預金に追加の負荷がかかります。同時に、「追加ポジション」はほとんど利益を追加せず、利益を伴うシリーズの終了を早めることもしません。ロジックは買いポジションでも同様です。

b) 超過率を制御して開く: これは、一連のポジションを開くための追加のフィルタです。新しいローソク足が出現するごとに、サンプル全体の超過率を確認します。新しいローソク足が出現すると、サンプルサイズが1つ増えます。新しいローソク足が出現したときに超過率が増加した場合にのみ、ポジションを開くことができます。

これは(a)とほぼ同じように機能しますが、方法が少し異なります。考え方は(а)で述べたものと似ています。売りポジションのシリーズの平均始値の低下を防ぎ、買いポジションのシリーズの平均始値の上昇を防ぐことです。

加重平均が割合しきい値として使用される場合、現在の加重割合値を前のローソク足の値と比較して、追加ポジションの開始を調整できます。

これらの2つのアイテムは、一緒に使用することも、別々に使用することもできます。収益性は低下しますが、安定性が大幅に向上します。これは私にとってより重要です。したがって、1つの説明されていない要因が排除され、安定性が向上しました。

前にポジションを開く

後でポジションを開く

図4 シリーズのポジション数の減少

図4では、ポジションは制限なしで開かれていますが、下の図では、(b)のアルゴリズムを使用して開かれています。ご覧のとおり、開かれたポジションは少なくなっています。この取引の比較結果を以下の表に示します。


利益 最大損失 ポジション数 利益率
各ローソク足で開始(上の図) +$71.99 -$463.96 92 1.56
超過率を制御して開く(下の図) +$42.26 -$263.86 48 1.68

表によると、最大ドローダウンが減少し、収益性も低下しています。最も重要なことは、ポジション数が1.91倍減少したことです。これは、最終的に、市場パラメータが通常の値から逸脱した瞬間のアルゴリズムの安定性にプラスの影響を及ぼします。

一連のポジションの数を減らす他の方法も開発されました。それらは要件仕様に記載されています。私にとって最も効率的と思われるものを示しました。 

4. 利益ポジション決済の改善

アルゴリズムの最初のバージョンでは、ロットあたりの利益の概念が導入されています。この値は、ロットが1の預金通貨で設定されました。その後、ロット数はシリーズのポジションによって計算され、設定からの値は、シリーズのポジションによる現在の合計ロットで乗算されました。ロットあたりの利益が15米ドルを超えたときに、設定がポジションシリーズの決済を指示するとします。現在、0.01ロットのポジションが11個あります。つまり、合計ポジションは0.01*11=0.11です。さらに、ロットあたりの利益に、取得したロット数を掛けます($15*0.11=$1.65)。ポジションの総利益が1.65米ドルに達した場合、一連のポジションが完了します。

預金通貨でロットあたりの一定額の利益を設定することは、最も効果的な解決策ではありません。商品のボラティリティが低下すると、正しい終値を逃すリスクが高まります。逆に、ボラティリティが上がると、ロボットは利益を失います。その結果、最適化によってロットあたりの平均利益が得られますが、これは十分に効率的ではありません。 

最も簡単な解決策は、現在のボラティリティに基づいて「ロットあたりの利益」パラメータを調整することです。ボラティリティが高いほど、ロットあたりの利益が多くなり、その逆も同様です。平均ボラティリティを適用することも完全な解決策ではありませんが、固定値よりは優れています。

これは別の小さな自己適応関数であり、パラメータは厳密には構成されていませんが、現在の市場の状態への依存が設定されています。シリーズの利益はローソク足のサイズに直接依存することが知られており、この依存性を使用して安定性を高める必要があります。

USD/XXXのような通貨ペアではポイント価格が一定ではなく、現在の価格値から変化するため、預金通貨で利益を管理しないことにしました。利益はポイントで管理されます。これを行うには、ATRインディケータの現在の値(ポイント単位)を取得し、Koef_multi_ATR値を乗算します。結果は、利益で決済されるポイントの数です。次に、始値から現在の値に渡されたポイント数が計算され、すべてのポジションの平均値が求められます。得られた平均値は、利益をもって決済するためのポイント数と比較されます。平均ポイント数が決済のポイント数を超えるか等しい場合、シリーズは完了です。そうでない場合は、次のローソク足で手順が繰り返されます。 

現在の利益は、ティックごとに、またはタイマーで監視する必要があります。過度の計算を避けるために、この種のシステムでは、タイマーで1秒に1回、または10秒に1回でも利益を確認するのが妥当です。

  5. 複数の取引商品の使用

以前のEAバージョンは10個の商品を同時に取引することができました。これでは不十分だったため、複数のEAインスタンスを一度に起動する必要がありました。新しいバージョンでは、28の商品を同時に取引して、取引をより適切に管理できます。

先に述べたように、異なる商品のシリーズ開始シグナルはわずかに相関しています。これにより、さまざまな商品のドローダウンが同期され、預金要件が増加し、相対的な収益性が低下します。 

理想的には、異なる取引商品のシリーズ開始シグナル間の相関は負である必要があります。ある商品の現在の大きなドローダウンは、他の商品の小さな収益性の高い取引と一致するはずです。複数の商品でシリーズの同時開始を無効にすることも、全体的な収益性を低下させるため、最善の解決策ではありません。

新しいシリーズの開始シグナルの相関は、通貨の1つが他の通貨と比較して下降または上昇し始める可能性があるという事実のために発生します。他の通貨に関連して通貨を売買するシグナルは、一度に複数のペアに表示される場合があります。ですから、そのような状況から身を守るべきです。

異なる商品のシリーズ開始シグナル間の相関を可能な限り最小限に抑えるには、通貨ペアを別々の通貨に分割し、ポジションが別々の通貨で開かれていると仮定する必要があります。EURUSDで売りポジションが開かれると、EURの売りポジションとUSDの買いポジションに分けられます。新しいシリーズを開始する前に、ペアを形成する通貨のポジションの存在を確認する必要があります。EURに売りポジションがある場合は、EURが売られるシリーズの開始を無効にします。ただし、EURの購入が必要なシグナルは無効にしてはいけません。 


図5

図5には通貨のペアへの分割を示します。下の図6は、Buy EURUSDが開かれた場合に開くことができるポジションを示しています。他のオプションについては、すべて同じように機能します。 

通貨2

図6

このアプローチでは、ポジションを同時に開くために商品の最大数を制限する必要がなくなりましたが、設定は機能に残してあります。

6. 現在のボラティリティに基づくロット修正

アルゴリズムの2番目のバージョンでは、自動借り換えを放棄したため、預金サイズを変更してもロットは変更されません。このEAは実際の取引用に開発したので、この機能は必要ありません。代わりに、別のロット修正機能を開発しました。このようなアルゴリズムでは、利益と損失はローソク足のサイズまたはボラティリティに依存します。収益性グラフを、急な下降や上昇なしで、可能な限りフラットにするのが論理的です。 

収益性グラフを安定させるには、現在のボラティリティに基づいてロットサイズを変更する必要があります。それが強いほど、ロットを使用する必要が少なくなり、ボラティリティが低くなり、ロットが大きくなる可能性があります。ロットは現在のボラティリティに比例して変化します。これを実現するために、通常のロットとボラティリティが設定で定義されています。

現在のロットを計算するために、現在のATR値を取得し、設定からNorm_ATRで除算してみましょう。その後、設定からのロットを結果の比率で徐算します。得られた値を正しい値に四捨五入します。これは、収益性グラフは可能な限り安定していながら、ローソク足の伸びとともにロットが減少する仕組みです。

シリーズの開始後、ボラティリティが変化する可能性があるため、2つのオプションを導入しました。最初のオプションでは、ロットはシリーズが始まる前に定義され、シリーズが終わるまで安定しています。

2番目のオプションでは、シリーズ開始後、ロットが現在のボラティリティから変化します。この場合、現在の利益を計算するとき、ポジションは預金通貨の総利益に影響を与え、結果が改善または悪化します。関数は実験的なものです。関数の機能がお気に召しましたら、次のバージョンで変更できます。

テスト

この記事では、最も基本的で興味深い変更と動作モードについてのみ説明しています。実際には、さらに多くのモードが実装されており、すべてのモードを相互に組み合わせることができます。すべての詳細を含むアルゴリズムの要件仕様は以下に添付されています。 

違いを視覚的に強調するために、アルゴリズムの最初のバージョンのテストに使用したのと同じ通貨ペアでテストを実行します。最初のバージョンと同様に、このアルゴリズムはローソク足を閉じることで機能するため、「ポイント制御」モードで安全にテストできます。ローソク足の内部では、現在の利益のみを制御し、現在の資金が設定で定義されたしきい値を下回らないようにします。以前と同様に、テストは過大評価されたスプレッドで実行されます。GBPUSDに40のスプレッドを設定します。

最初のアルゴリズムバージョンと同様に、任意の時間枠で取引および最適化できます。最小時間枠は、スプレッドと手数料に対するローソク足のサイズによって制限されます。時間枠が短いほど、シグナル品質とペイオフ期待値に対する要件が高くなります。時間枠が長くなると、ローソク足のサイズが大きくなり、それに応じてドローダウンレベルも上がります。したがって、最大時間枠は取引スタイルの好みによって制限されます。

最適化は2017年に実際の口座での取引にロボットを使用したときに実行しました。したがって、新しい最適化を実行せずに、以前の設定を使用しただけです。

GBPUSD 2000テスターチャート

GBPUSD 2000テスターレポート

図7 GBPUSD H1 2000.01.01 - 2020.12.08、固定ロット

図7は、2000.01.01から2020.12.08までのほぼ21年間のGBPUSD H1のテストを示しています。ここでは、範囲からの複数のサンプルが使用されます。分析範囲は68〜200本のローソク足です。15個のサンプルが使用されます。

最初のアルゴリズムバージョンが2001年からのみテストに合格した場合、2番目のアルゴリズムバージョンは2000年以降簡単に合格します。最初のバージョンと比較して、ポジション数は3倍に増加し、利益は1.9倍に増加しました。利益率は7.5から2.74に減少しましたが、それでもまともなレベルにとどまっています。シリーズ開始シグナルはより頻繁に生成されますが、シリーズ内の平均ポジション数は減少しています。おそらくもっと良い設定を見つけることができますが、取引に使用したものを採用しました。

現在のATR値からのロット調整機能は以前に開発されました。図8は、図7と同じテストを示していますが、ボラティリティに基づく動的ロットを使用しています。0.01のロットが3000米ドルで使用されたので、ロット調整アルゴリズムを30,000米ドルまで増やし、ロットを0.1まで増やしました。

GBPUSD 2000テスターチャート動的ロット

GBPUSD 2000テスターレポート動的ロット

図8 GBPUSD H1 2000.01.01 - 2020.12.08、ATRに依存する動的ロット 

図8を見るとわかるように、収益性グラフは、開発中に予想されるように、大幅に線形になっています。同時に、収益性はわずかに低下しましたが、最大ドローダウンは少し増加しました。モードは面白いことが判明しました。シャープレシオの値が高い場合に、予測される最大の収益性を得るのに役立ちます。

上記のテストで使用したパラメータの安定性を確認する必要があります。これを実現するために、H1で使用したのと同じ設定でGBPUSD M15でテストを開始します。ボラティリティの不均一性は時間枠が短いほど大きくなるため、利益率をわずかに下げる必要があります。これを行う理由がわかっているので、このパラメータを自己適応させるべきですが、現在のEAバージョンにはそのような機能がないため、手動で調整します。 

GBPUSD M15テスターチャート

GBPUSD 2009 m15テスターレポート

図9 GBPUSD M15 2009.01.01 - 2020.12.08

図9は、H1設定を使用したGBPUSD M152009.01.01-20200.12.08のテストを示しています。テストは2009年以来一貫して合格しています。時間枠の設定がM15用に特別に最適化されていないことを考えると、結果は良好です。M15の最適な設定を見つけるには、2008.01.01から2009.06.01までの1.5年間で最も難しいセクションを最適化するだけで十分です。このセクションのパラメータを最適化すると、EAは21年間問題なくテストに合格します。

最初のバージョンでは、EURUSD H1のテストを示しました。結果を比較してみましょう。図10は、2000.01.01から2020.12.08までの期間のEURUSD H1の結果を示しています。

EURUSD 2000テスターチャート

EURUSD 2000テスターレポート

図10 EURUSD H1 2000.01.01 - 2020.12.08

最初のバージョンは2007年以降にのみバックテストに合格し、新しいバージョンはすでに2000年以降にテストに合格しています。安定性が大幅に向上しています。同時に、最大ドローダウンは1.2倍減少し、利益は3倍に増加しました。取引件数は2.3倍に増加しました。

2番目のバージョンがどれだけ良くなったかを知るために、GBPJPY H1でのテストを見てみましょう。最初のバージョンは2009年からテストされています。

GBPJPY 2000テスターチャート

GBPJPY 2000テスターレポート

図11 GBPJPY H1 2000.01.01 - 2020.12.08

図11に示すように、アルゴリズムは2000年以降バックテストに合格しています。ドローダウンは1.8倍に減少し、利益率は3.3まで増加しています。

USD、GBP、EUR、CHF、CAD、AUD、NZD、JPYの8つの主要通貨で構成される28の通貨ペアを最適化しました。いくつかの通貨ペアは最良の結果を示し、いくつかは最悪の結果を示しますが、それらはすべて適切に最適化されており、通常は2004年以降のテストに合格しています。一部の通貨ペアは2007年以降テストに合格しています。

MetaTrader 4では、一度に複数の商品のテストを実行できません。そのため、28銘柄のそれぞれについて個別にテストを実施し、サードパーティのソフトウェアを使用してレポートを結合しました。2017年に行ったので、レポートは2010年から2017年までの期間をまとめています。

完全なレポート

図12 2010年から2017年までの28通貨ペアの複合バックテスト

図12は、収益性グラフがかなりフラットで、年間約100%の利回りがあることを示しています。結果は非常に印象的ですが、実際には、複数の通貨ペアでの同時取引が制限されているため、収益性は低くなります。このロボットを実際の口座での取引に2年間使用しましたが、実際の収益性は年間56%でした。 

テストはスプレッドを膨らませて実施されたため、実際の収益性は計算されたものよりも低くなります。アルゴリズムは、スプレッドが大きいほど収益性が高くなるように機能します。これは、スプレッドが大きいほど安定性が低くなるという事実によって説明できます。また、実際には、一方向の取引を禁止したことによるシグナル数の減少の影響も明らかです。

取引中は最も保守的な設定を使用しましたが、アルゴリズムをより積極的に動作させることは可能です。 

追加機能

シリーズ開始シグナルを他の時間枠で並べ替える機能を追加しました。たとえば、取引をH1で実行し、シグナルがすべての標準時間枠で追加で確認されます。シリーズ開始シグナルは、M1、M5、M15、M30、H1、H4、およびD1の時間枠にもそのようなシグナルがある場合にのみ形成されます。追加の時間枠を使用するシリーズ確認シグナルは、メインの時間枠と同じルールと同じモードを使用して生成されます。追加の時間枠は、互いに独立して有効または無効にできます。

残念ながら、正しい機能の動作に問題があったため、モードを確認できませんでした。

EAは、基本的なメカニズムほど面白くないために考慮されなかった多くの追加機能を備えています。これらは次のとおりです。

  • 決済指値と決済逆指値を設定する機能 - 値は特定のアルゴリズムに従って計算され、実際の決済のポイントを複製することも、独立して機能することもできます。
  • 現在の資金管理機能の追加 - 資金が設定されたしきい値を下回った場合、EAはポジションを決済して取引を停止します。
  • 1つの銘柄またはすべての銘柄の最大ポジション数を制限する機能。
  • 各取引銘柄の現在の損失を管理する機能 - これは追加の仮想決済逆指値です。
  • 前のシリーズが閉じられた直後にシリーズが開かないように、ローソク足の数で2つの隣接するシリーズの間に一時停止を設定できます。この機能により、一時停止中に他の商品でシリーズを開始できます。
  • 商品で新しいシリーズを開始できる最小ATR値を設定できます。ボラティリティが低い場合、取引は利益を生まない可能性があります。
  • 非線形利益は、ポジションを決済するために使用される場合があります。シリーズで開かれるポジションが多いほど、できるだけ早く完了することが望ましいです。したがって、しきい値利益は、ポジション数の平方根に比例して低下します。
  • 画面には、取引された各商品に必要なすべての情報が表示されるため、EAロジックに従うことができます。
  • アルゴリズムはPCとターミナルのリセットに対応します。ポジションを取得し、そのためのグローバル変数を使用して現在の状況に従って取引を続行します。

EAは28の取引商品に対して2337の設定を備えているため、すべてのユーザが関心のある操作モードを見つけることができます。

結論とさらなる発展

  • 開発中のアルゴリズムの特性を大幅に改善するための基礎として、シンプルでありながら理解しやすいパターンを使用しました。使用されるパターンが非常に明確であり、損益に正確に影響するものを調べることができるため、これは不可能になりました。
  • アルゴリズムはさまざまな商品に最適化されており、長期間にわたって非常に安定しています。
  • 操作パラメータはより柔軟になり、すでに、現在の市場パラメータに応じてわずかに調整できます。この機能により、安定性を大幅に向上させることができました。アルゴリズムをさらに改善して、その操作品質をさらに向上させることができます。
  • アルゴリズムパラメータの改善は大いに可能です。ロジックは、トレンド取引と逆トレンド取引の両方で逆にすることができます。
  • 各商品には最適化が必要です。これは、特定の商品に特定の時間に必要なパラメータとその理由を示す本格的な理論モデルがないことを示す欠点です。
  • 各商品で最適化が必要だということは、異なる取引商品の価格シリーズ間の違いがわからないということです。不確実性があると、説明のつかない要因が発生します。
  • ある商品の価格系列のパラメータが別の商品とどのように異なるかがわからない場合、現在の商品のパターンの存在を制御する方法はありません。価格系列のどのパラメータがアルゴリズムの収益性と安定性に影響を与えるかは正確にわかりません。
  • 最適化設定が1つの商品で安定し、別の商品で不安定である理由は明らかではありません。すべての取引商品で安定する設定を選択することは可能ですが、これによって収益性が大幅に低下にします。
  • 履歴データのパラメータを最適化する際に、考慮されていない要因を取り除くことはできません。安定性に影響を与えるのは、説明されていない要因の数です。
  • 真の安定性を実現するには、理論を大幅に改訂し、次のアルゴリズムバージョンで最適化を放棄する必要があります。
  • 設定内の各パラメータは何かに依存する必要があります。EAがより適切に機能するという理由だけで設定されるパラメータは1つでもあってはなりません。パラメータが現在使用されている理由と、その値をいつ変更する必要があるかについての詳細な説明が必要です。

次の記事では、アルゴリズムの開発を続け、理論モデルを大幅に改訂します。新しいアルゴリズムは、より強力で柔軟かつ効率的なMetaTrader5プラットフォーム用に設計されます。

EAコード、要件仕様、テスト設定、28通貨ペアの設定例、およびイベント確率を計算するためのExcelテーブルを以下に添付します。

アイデアと要件の仕様の著者はMaxim Romanovです。コードはVyacheslav Ivanovによって作成されました。

トピックに関する以前の記事

自己適応アルゴリズムの開発(第I部): 基本的なパターンの検索

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

添付されたファイル |
robot.zip (43.21 KB)
Set.zip (152.63 KB)
technical_task.zip (67.45 KB)
自己適応アルゴリズム(第III部):最適化の放棄 自己適応アルゴリズム(第III部):最適化の放棄
履歴データに基づく最適化を使用してパラメータを選択する場合、真に安定したアルゴリズムを取得することは不可能です。安定したアルゴリズムは、常時、どんな取引商品で作業していても、必要なパラメータを認識している必要があります。予測や推測ではなく、確実に知っているべきです。
パターン検索への総当たり攻撃アプローチ(第III部): 新しい水平線 パターン検索への総当たり攻撃アプローチ(第III部): 新しい水平線
本稿では、総当たり攻撃のトピックを続けます。プログラムアルゴリズムに市場分析の新しい機会を導入することで分析速度を高め、結果の品質を向上します。新しい追加により、このアプローチ内でグローバルパターンの最高品質で表示できるようになります。
DoEasyライブラリでの価格(第60部): 銘柄ティックデータのシリーズリスト DoEasyライブラリでの価格(第60部): 銘柄ティックデータのシリーズリスト
本稿では、単一銘柄のティックデータを格納するためのリストを作成し、EAでの必要なデータの作成と取得を確認します。さらに、使用される銘柄ごとの個別のティックデータリストでティックデータのコレクションを構成します。
CatBoostアルゴリズムを使用した外国為替市場の季節によるパターンの特定 CatBoostアルゴリズムを使用した外国為替市場の季節によるパターンの特定
本稿では、時間フィルタを使用した機械学習モデルの作成について検討し、このアプローチの有効性について説明します。人的要因はモデルに特定の曜日の特定の時間に取引するように指示するだけで排除できるようになっています。パターン検索は、別のアルゴリズムで提供できます。