見出し画像

ML-EAにおいて目的変数(y)をパーセンタイル法で動的に設定する方法

以前の記事では、ML-EAという機械学習を取り入れたFX自動売買のベースモデルを作成し解説しています。

このベースモデルにおいては、
目的変数(y)は、4時間後の価格が0.1%以上上昇していればy=1、4時間後の価格が0.1%以上下落していればy=2、それ以外の場合はy=0とする。つまり、y=0,1,2とする三値分類モデル
という前提を置いているのですが、この「価格が0.1%以上/以下」について少し考察した上で、パーセンタイル法で動的に設定してみるというのが今回の記事の内容になります。


時間の判定方法の変更

ML-EAのベースモデルでは、1,000時間分のバーを取得してモデルを訓練するという設定でした。この”1,000時間分”については、単純に時間で判定して訓練データを取得していました。
例えば、1,000時間前から現在までの1分足のバーを取得するというような処理です。この場合、バーデータは市場が閉まっている時間など作成されない時間帯が存在するため、1,000時間分(1分足ベースだと60,000レコード分)を完全に取得できるとは限りません。

例えば以下は、ある時点におけるML-EAベースモデルの性能評価(model_evaluation)結果です。

ML-EAベースモデル

supportというのが各クラス(0,1,2)のデータの数で、合計が11,951になっています。もしちょうど60,000レコードの訓練データであれば、この値は12,000になるべきですので、少しだけデータが欠落していることがわかります。

※12,000というのは、以下のように訓練データを「test_size=0.2」で分割してモデルの訓練を行っているためです。(60,000 × 0.2 = 12,000)

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

時間をバーのインデックスに変更

そこで、時間の考え方を時間そのものではなく、バーのインデックスで判定するように変更します。単純に1分足が作成されているレコードの数で時間を判定するわけです。1,000時間であれば、1分足のレコード60,000個分と数えるようにします。
変更後の結果は以下の通りです。

時間をバーインデックスに変更後

想定通り、supportの合計が12,000になりました。

価格変動率0.1%の変更

さて、ベースモデルでは目的変数(y)を決定するための価格変動率を0.1%と設定していました。これはどのように設定したかというと、各クラス(0,1,2)のデータの数がある程度均等に分かれるような値を適当に探して決めました。
上記の例では、y=0(4,953個)、y=1(3,998個)、y=2(3,049個)とそれなりに良い感じに分布しています。例えばこれが偏りすぎていてほとんどがy=0だとすると、y=1,2になる場合のデータが少なすぎてあまり良い学習効果は得られないと考えているためです。
つまり、この検証はGOLDで行っていますので、GOLDにおける最近のボラティリティ(価格変動率)がたまたま0.1%にマッチしていただけということです。
そこで、この固定値である0.1%の代わりに、価格変動率の閾値を取引通貨の情報から自動的に決定する方法として、パーセンタイル法を用います。

パーセンタイル法の適用

パーセンタイル法は、データを小さい順に並べたときに、特定の割合(パーセンタイル)に位置するデータの値を求める方法です。例えば、30パーセンタイルは、データを小さい順に並べたときに下から30%の位置にあるデータの値を指します。この方法は、データの分布を理解するのに役立ち、一般的にはデータの中央値(50パーセンタイル)や四分位数(25パーセンタイル、75パーセンタイル)などを求めるのに使われます。

今回は、全データの30%に相当するパーセンタイルを価格変動率の閾値としてみることにします。
また価格変動率の計算において、より実態に近付けるためにスプレッドも考慮するようにします。

具体的な手順は以下の通りです。

  1. 価格変動率の計算にスプレッドを加えて、スプレッドも考慮した価格変動率に変更します。

  2. 訓練データの全てのレコードの価格変動率を取得して、小さい順に並べます。

  3. 全データの30%の位置にある価格変動率の絶対値を特定し、この値を閾値として使用します。

以上の変更を適用した後の結果は以下の通りです。

パーセンタイル法適用後

ある程度想定通りの結果が得られました。これで、価格変動率の閾値を動的に設定することができました。

損益パフォーマンス比較

以下の記事でご紹介しているバックテスト用ツールを用いて、今回の変更が損益パフォーマンスに与える影響を比較してみます。

上記の記事における「特徴量にRSIおよびMACD追加後」のモデルを「パーセンタイル法適用前」として、「パーセンタイル法適用後」と比較してみましょう。

パーセンタイル法適用前

 Win Rate: 70.54%
 Entry Rate: 26.68%
 Total Net Profit: 16885.82

パーセンタイル法適用前


パーセンタイル法適用後

 Win Rate: 67.78%
 Entry Rate: 37.00%
 Total Net Profit: 19780.80

パーセンタイル法適用後

Win Rateは多少下がりましたが、Entry Rateが上がり、損益パフォーマンスが多少向上したようにも見受けられます。
価格変動率の閾値をその時々の状況に応じて動的に変化させた結果、エントリー率が向上したとも考えられます。

有料部分の内容

有料部分ではML-EAをベースに、時間の判定方法を変更し、価格変動率にスプレッドを考慮した上でパーセンタイル法を適用するための変更用コードを掲載しています。

具体的には、以下の関数の変更部分を掲載しています。

時間の判定方法の変更

  • モデルを訓練する関数

  • 訓練済みモデルで予測する関数

  • buyポジションをクローズする関数

  • sellポジションをクローズする関数

パーセンタイル法の適用

  • 終値から目的変数yを計算してファイルに出力する関数

今回の変更のみであれば、Pythonスクリプトの変更は不要です。

注意点

  • 当記事で掲載しているコードはPythonの環境設定含め、必要な準備が整っている上での実行を想定しています。また、以下の記事のML-EA(MQL5用)をベースとした変更部分のコードしか掲載していませんので、当記事の有料部分の内容だけでは実際に動かすことはできません。以下の記事の内容と組み合わせる必要があります。

  • 記事執筆時点で稼働確認を行なっており、エラーが出ないことを確認しておりますが、その後の環境変化等で想定通りに稼働しない可能性はございます。動作保証等はいたしかねますのでご了承ください。

  • リアル口座にアクセスして取引を行うことも可能なコードになっておりますが、必ずデモ口座で事前に稼働確認をしていただくことを推奨いたします。

  • 当記事で解説しているロジック通りの動作を保証するものではございません。あくまでFX自動売買ツール開発のためのサンプルコードとしてご活用ください。

その他の改善は以下の記事にまとめています。

ここから先は

14,857字

¥ 1,000

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

よろしければ応援お願いします。いただいたチップは今後の記事の執筆に活用させていただきます。