記事「古典的な戦略を再構築する(第11回):移動平均クロスオーバー(II)」についてのディスカッション

 

新しい記事「古典的な戦略を再構築する(第11回):移動平均クロスオーバー(II)」はパブリッシュされました:

移動平均とストキャスティクスオシレーターは、トレンドに従う取引シグナルを生成するために使用できます。ただし、これらのシグナルは価格変動が発生した後にのみ観察されます。AIを使用することで、テクニカルインジケーターに内在するこの遅れを効果的に克服できます。この記事では、既存の取引戦略を改善できるような、完全に自律的なAI搭載のエキスパートアドバイザー(EA)を作成する方法を説明します。最も古い取引戦略であっても、改善することは可能です。

移動平均線のクロスオーバーを予測するアイデアについては以前取り上げました。その記事はここにリンクされています。私たちは、価格の変化そのものよりも、移動平均線のクロスオーバーの方が予測しやすいことを確認しました。本日は、この馴染みのある問題に対して、まったく異なるアプローチで再び挑戦します。
 
今回は、このアプローチが取引戦略にどの程度の影響を与えるのか、そしてどのようにして皆さんの取引戦略の改善につながるのかを徹底的に検証していきます。移動平均線のクロスオーバー戦略は、最も古典的な取引戦略のひとつです。しかし、広く知られているがゆえに、この手法を用いて利益を上げる戦略を構築するのは容易ではありません。それでも、本記事を通じて「古い手法でも新しい工夫次第で進化できる」ことをお見せしたいと思います。

比較をより実証的に行うために、まずは以下のインジケーターのみを用いて、MQL5でEUR/GBPペアの取引戦略を構築します。

  1. 終値に適用する2本の指数移動平均線:1つは期間が20に設定され、もう1つは60に設定されています。
  2. デフォルト設定の5,3,3が適用されたストキャスティクスオシレーター:指数移動平均モードに設定され、CLOSE_CLOSEモードで計算をおこなうように設定されています。
  3. 14期間のAverage True Rangeインジケーター:テイクプロフィットとストップロスのレベルを設定します。

本戦略は日足での取引を想定し、2022年1月1日から2024年6月初旬までの期間でバックテストをおこないます。初期段階では、従来の古典的な取引ルールを適用します。したがって、短期移動平均が長期移動平均を上抜けし、ストキャスティクスの値が80を超えた場合に買いシグナルが生成されます。そして、売りシグナルについてはその逆であり、短期移動平均が長期移動平均を下回り、ストキャスティクスの値が20を下回った場合に売りシグナルを登録します。


作者: Gamuchirai Zororo Ndawana

 

ありがとう、Gamu 。私はあなたの出版物を楽しみ、あなたのステップを再現することによって学ぼうとしています。

私はいくつかの問題を抱えています。

1) EURGBP_Stochastic dailyを使用し、提供されたスクリプトでテストしたところ、2つの注文しか出ず、シャープレシオは0.02でした。私はあなたと同じ設定をしていると思いますが、2つのブローカーでは2つの注文しか出ません。

2) 他の方への注意として、必要であれば、ブローカーに合わせてシンボル設定を変更する必要があるかもしれません(例えば、EURGBPをEURGBP.iに)。

3) 次に、データをエクスポートしようとすると、ATRの範囲外の配列が表示されます。これは、配列に100000レコードが入らないためだと思います(677に変更すると)。もしかしたら、データ抽出スクリプトもダウンロードに含めることができるかもしれません。

4)あなたの記事からコードをコピーしてPythonで試してみましたが、look_aheadが定義されていないというエラーが出ました ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:].


NameError: 'look_ahead' という名前が定義されていません。

5) あなたのJuypiterノートブックをロードしたとき、先読みを設定する必要があることがわかりました。

look_ahead = 20 , この後、同梱のファイルのみを使用しましたが、677行しかないためか、以下のエラーに引っかかっています。

可視化を開始する前に、#データのスケーリングを実行しました。

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow', 'Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow', 'Stoch Main']])

とすると、解決方法がわからないエラーが発生する。

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning:値を DataFrame からのスライスのコピーに設定しようとしています。https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main]]))

 
linfo2 #:

ありがとう、Gamu 。私はあなたの出版物を楽しみ、あなたのステップを再現することで学ぼうとしています。

私はいくつかの問題を抱えていますが、これが他の人の助けになることを願っています。

1) EURGBP_Stochastic dailyを使用し、提供されたスクリプトでテストしたところ、2つの注文しか出ず、シャープレシオは0.02でした。私はあなたと同じ設定をしていると思いますが、2つのブローカーで2つの注文しか出ません。

2) 他の方への注意事項として、必要に応じて、ブローカーに合わせてシンボル設定を変更する必要があるかもしれません(例:EURGBPをEURGBP.iに)。

3) 次に、データをエクスポートしようとすると、ATRの範囲外の配列が表示されます。これは、配列に100000レコードが入らないためだと思います(677に変更すると)。もしかしたら、データ抽出スクリプトもダウンロードに含めることができるかもしれません。

4)あなたの記事からコードをコピーしてPythonで試してみましたが、look_aheadが定義されていないというエラーが出ました ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:].


NameError: 名前 'look_ahead' は定義されていません。

5) あなたのJuypiterノートブックをロードしたとき、先読みを設定する必要があることがわかりました。

look_ahead = 20 , この後、同梱のファイルのみを使用しましたが、677行しかないためか、以下のエラーに引っかかっています。

可視化を開始する前に、#データのスケーリングを実行しました。

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow', 'Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow', 'Stoch Main']])

というエラーが出て、解決方法がわかりません。

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning:値を DataFrame からのスライスのコピーに設定しようとしています。https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main]]))

どうしたニール。

お役に立てることがあれば、お教えしましょう:

1) このエラーはかなり奇妙です:

私たちのシステムは、両方のAIモデルが同じ予測をした場合のみ取引を開始します。モデルをトレーニングし、係数を評価することで、それぞれのモデルがシグナルを生成するタイミングとシグナルが何であるかを知ることができます。そして、バックテストを注意深くモニターして、モデルが置かれている条件が取引回数を説明しているかどうかを確認する。

2) これは恒常的な問題であり、各ブローカーが独自の命名規則を持っているため、コントロールするのは難しい。

3) これは、期間計算を除いて、あなたのブローカーが使用できる日足データが677本しかないことを示しているのかもしれません。これは普通のことです。時々、1年分の日足データを取得しようとしても、200以上のバーしか取得できないことがあります。

4) 問題を引き起こしているステートメントのすぐ上を定義してみてください。

5) これは、ライブラリのバージョンやPythonのバージョンなどの違いによる問題かもしれません。ということで

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow', 'Stoch Main']] =

に調整する必要があるかもしれません:

data.loc[:,['Open','High',...,'Stoch Main']] = 次のように調整する必要があるかもしれません。
 
Gamuchirai Zororo Ndawana #:
ニール、元気だと信じているよ。

何か手伝えることがあれば言ってくれ:

1) このエラーはかなり奇妙です:

私たちのシステムは、両方のAIモデルが同じ予測をした場合のみ取引を開始します。モデルをトレーニングし、係数を評価します。そうすることで、それぞれのモデルがいつシグナルを発生させるのか、シグナルはどうなるのかがわかります。そして、バックテストを注意深くモニターして、モデルが置かれている条件が取引数を説明するかどうかを確認する。

2) これは不変の問題であり、各ブローカーが独自の命名規則を持っているため、コントロールするのは難しいが、あなたが提供した解決策は有効である。

3) これは、あなたのブローカーが、期間計算を除いて、使用できる日足データを677本しか持っていないことを示しているのかもしれません。これは普通のことです。時々、1年分の日足データを取得しようとしても、200以上のバーしか取得できないことがあります。

4) 問題を引き起こしているステートメントのすぐ上でルック・アドバンスを定義してみてください。

5) これは、ライブラリのバージョンやPythonのバージョンなどの違いによる問題かもしれません。ということで

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] =

に調整する必要があるかもしれない:

data.loc[:,['始値','高値',...,'ストッホ・メイン']] = = = [始値','高値',...

Gamuさん、ありがとうございます。可動部分が多いことは承知しています。

 
linfo2 #:

そうだね、可動部分が多いのは分かっている。

そうだろ?これだけたくさんあって、これは簡単な実装に過ぎない