English Русский 中文 Español Deutsch Português
preview
MLモデルとストラテジーテスターの統合(結論):価格予測のための回帰モデルの実装

MLモデルとストラテジーテスターの統合(結論):価格予測のための回帰モデルの実装

MetaTrader 5 | 11 4月 2024, 14:11
110 0
Jonathan Pereira
Jonathan Pereira

初めに

前回は、金融市場関連のデータを保存検索するためのCSVファイル管理クラスの実装を完了しました。インフラを構築したことで、このデータを使用して機械訓練モデルを構築し、訓練する準備が整いました。

この記事の課題は、1週間以内の金融資産の終値を予測できる回帰モデルを実装することです。この予測によって、市場の動きを分析し、金融資産を取引する際に十分な情報に基づいた判断を下すことができるようになります。

価格予測は、金融市場における取引戦略の策定や意思決定に役立つツールです。価格動向を正確に予測する能力は、より良い投資判断につながり、利益を最大化し、損失を最小化します。さらに、価格予測は取引機会の特定とリスク管理に役立ちます。

回帰モデルを実装するために、以下の手順を実行します。

  1. データの収集と準備:Pythonスクリプトを使用して、過去の価格データとその他の必要な情報を取得します。このデータを使用して、回帰モデルの訓練とテストをおこないます。

  2. モデルの選択と訓練:タスクに適した回帰モデルを選択し、収集したデータを使用してそれを訓練します。回帰モデルには、線形回帰、多項式回帰、サポートベクトル回帰(SVR)などがあります。モデルの選択は、私たちの問題を解くのに適しているかどうか、また訓練過程で得られるパフォーマンスによって決まります。

  3. モデルパフォーマンスの評価:回帰モデルが正しく機能することを確認するために、一連のテストを通してそのパフォーマンスを評価する必要があります。この評価は、潜在的な問題を特定し、必要に応じてモデルを調整するのに役立ちます。

この記事の最後には、1週間の金融資産の終値を予測できる回帰モデルを得ます。この予測によって、より効果的な取引戦略を開発し、金融市場において十分な情報に基づいた意思決定をおこなうことができるようになります。


第1節:回帰モデルの選択

金融資産の週次終値を予測するために回帰モデルを適用する前に、さまざまなタイプの回帰モデルとその特徴を理解する必要があります。これによって、問題を解決するのに最適なモデルを選ぶことができます。このセクションでは、最も一般的な回帰モデルについて説明します。

  1. 線形回帰は,最も単純で最もよく使われる回帰モデルの1つです。独立変数と従属変数の間に線形関係を仮定します。これは、二乗誤差の和を最小にしながら、データに最もよく合う直線を見つけることを目的としています。線形回帰は,理解しやすく実装しやすいが,変数間の関係が線形でない問題には適さないかもしれません。

  2. 多項回帰は,変数間の非線形関係を考慮に入れる線形回帰の拡張です。さまざまな次数の多項式を使用して、データに曲線を当てはめます。多項式回帰は、より複雑な問題に対してより良い近似を提供するかもしれません。しかし、モデルが訓練データに適合しすぎて、未知のデータに汎化する能力を低下させる過剰適合を避けることが重要です。

  3. 決定木回帰は、特徴空間を異なる、重複しない領域に分割する決定木ベースのモデルです。各地域の予測は、観測値の平均に基づいておこなわれます。決定木回帰は、変数間の複雑な非線形関係を捉えることができますが、特に木が非常に大きくなると、過剰適合を起こすことがあります。過剰適合に対抗するために、プルーニングと交差検証のテクニックを使用することができます。

  4. サポートベクトル回帰(SVR)は、回帰問題を解くためのサポートベクトルマシン(SVM)アルゴリズムの拡張です。SVRは、関数と訓練点の間のマージンを最大に保ちながら、データに最適な関数を見つけようとします。SVRは、放射基底関数(RBF)などのカーネル関数を使用して、非線形で複雑な関係をモデル化することができます。しかし、SVRの訓練は、他の回帰モデルに比べて計算コストがかかります。

1週間の金融資産の終値を予測するために最も適切な回帰モデルを選択するには、問題の複雑さと変数間の関係を考慮する必要があります。さらに、モデルのパフォーマンスと計算の複雑さのバランスも考慮しなければなりません。一般的には、さまざまなモデルを試し、最高のパフォーマンスを達成するために設定を調整することをお勧めします。

モデルを選択する際には、モデルの質と適用性に影響するいくつかの基準を考慮することが重要です。このセクションでは、回帰モデルを選ぶときに考慮に入れなければならない主な基準について見ていきます。

  1. 回帰モデルのパフォーマンスは、予測の正確さと有用性を保証するために非常に重要です。平均二乗誤差(MSE)や平均絶対誤差(MAE)などの指標を用いてパフォーマンスを評価することができます。さまざまなモデルを比較する場合、これらの指標で最高のパフォーマンスを発揮するものを選ぶことが重要です。

  2. モデルの解釈可能性とは、変数間の関係を理解し、それらが予測にどのように影響するかを理解する能力です。一般的に、線形回帰のような単純なモデルの方が、ニューラルネットワークのような複雑なモデルよりも解釈しやすくなります。解釈可能性は、自分の予測を他人に説明したり、結果に影響を与える要因を理解したい場合に特に重要です。

  3. 回帰モデルの複雑さは、パラメータの数とモデルの構造に関係します。より複雑なモデルは、データのより微妙で非線形な関係を捉えることができるが、過剰適合を起こしやすくなる可能性もあります。モデルの複雑さと、それを未知のデータに一般化する能力のバランスを見つけることが重要です。

  4. 訓練時間は、特に大規模なデータセットを扱う場合や、モデルを繰り返し訓練する場合に考慮すべき重要なポイントです。線形回帰や多項式回帰のような単純なモデルは、ニューラルネットワークやサポートベクトル回帰のような複雑なモデルよりも、一般的に訓練時間が少なくて済みます。モデルを確実に適用するためには、モデルのパフォーマンスと訓練時間のバランスを見つけることが重要です。

  5. 回帰モデルのロバスト性とは、データの外れ値や雑音に対処する能力です。ロバストなモデルはデータの小さな変化に対する感度が低く、より安定した予測をおこなうことができます。データの外れ値や雑音を扱えるモデルを選ぶことが重要です。

終値を予測するために最も適切な回帰モデルを選択する際には、これらの基準を比較検討し、それらの間の適切なバランスを見つけることが重要です。通常、さまざまなモデルをテストし、パフォーマンスを最適化するためにパラメータを微調整することを推奨します。こうすることで、特定の問題に最適なモデルを選択することができます。

以上の基準に基づいて、この記事では、終値を予測するために決定木回帰モデルを使用することにしました。このモデルの選択は、以下の理由から正当化されます。

  1. パフォーマンス決定木は、変数間の非線形関係や相互作用を捉えることができるため、一般的に回帰問題に適しています。木の深さや葉ごとの最小サンプル数など、モデルのハイパーパラメータを適切に調整することで、適合性と汎化のバランスをとることができます。

  2. 解釈可能性:決定木の主な利点の1つは、その解釈可能性です。決定木は、属性とその値に基づく一連の決定であり、理解しやすくなります。これは、予測を正当化し、終値に影響を与える要因を理解するのに役立ちます。

  3. 複雑さ:決定木の複雑さは、モデルのハイパーパラメータを調整することで制御できます。これにより、複雑な関係をモデル化する能力とモデルの単純さとのバランスを見つけることができ、同時に過剰適合を避けることができます。

  4. 訓練時間:決定木は通常、ニューラルネットワークやSVMのような複雑なモデルに比べ、比較的短時間で訓練します。この事実は、決定木回帰モデルを訓練時間が重要な要素である場合に適しています。

  5. ロバスト性:決定木は、各決定が単一の観測ではなく、一連のサンプルに基づいているため、データの外れ値や雑音に対してロバストであり、これは予測の安定性とモデルの信頼性に寄与します。

議論された基準と決定木回帰の利点を考えると、このモデルは週次終値を予測するのに適していると思います。しかし、各問題の具体的な状況や要件によって、モデルの選択が異なる可能性があることを覚えておくことが重要です。したがって、特定の問題に最も適切なモデルを選択するために、さまざまな回帰モデルをテストして比較する必要があります。


第2節:データ準備

データの準備とクリーニングは、回帰モデルを実装するプロセスの中で重要な手順です。なぜなら、入力データの質がモデルの効率とパフォーマンスに直接影響するからです。これらの手順は、以下の理由から重要です。

  1. 外れ値と雑音の除去:生データには、外れ値、雑音、誤差が含まれている可能性があり、モデルのパフォーマンスに悪影響を及ぼす可能性があります。このような矛盾を特定し修正することで、データの質を向上させ、その結果、予測の精度を向上させることができます。

  2. 欠損値の補充と除去:不完全なデータはデータセットによくあり、欠損値はモデルのパフォーマンスを低下させる原因となります。データの完全性と信頼性を確保するために、欠損値を代入したり、欠損データのあるレコードを削除したり、そのようなデータに対処するための特別なテクニックを使用することを検討するかもしれません。代入と削除のどちらを選択するかは、データの性質、欠損値の数、欠損値がモデルのパフォーマンスに与える潜在的な影響によって決まります。それぞれの状況を注意深く分析し、問題解決に最も適切なアプローチを選択することが重要です。

  3. 変数の選択:データセットに存在するすべての変数が終値を予測する上で重要であったり有用であったりするとは限りません。適切な変数選択により、モデルは最も重要な特徴に集中することができ、パフォーマンスが向上し、モデルの複雑さが軽減されます。

  4. データ変換:回帰モデルの仮定に一致させるため、または独立変数と従属変数の間の関係を改善するために、元のデータを変換する必要があることがあります。変換の例としては、正規化、標準化、対数や平方根などの数学的関数の使用などがあります。

  5. データ分割:回帰モデルのパフォーマンスを適切に評価するために、データ集合を訓練サブセットとテストサブセットに分割します。この分割により、モデルをデータのサブセットで訓練し、未知のデータへの汎化能力をテストすることができるので、実世界の状況におけるモデルのパフォーマンスを評価することができます。

データの準備とクリーニングの段階は、モデルが質の高いデータから訓練評価され、終値予測における有効性と有用性が最大化されることを保証します。

Pythonを使用して回帰モデル用のデータを準備する基本的な例を見てみましょう。ただし、特定のデータセットや問題ごとに、特別な準備アプローチや方法が必要になる可能性があるため、知識を深めることが重要です。時間をかけて様々なデータ準備の方法を学び、理解することを強くお勧めします。

データを収集するためにはget_rates_between関数を使用します。この関数は、特定の資産と特定の期間の財務データを収集するためのものです。MetaTrader 5ライブラリを使用して取引プラットフォームに接続し、さまざまな時間間隔の過去の価格データを取得します。

この関数には以下のパラメータがあります。

  • symbol:金融記号を表す文字列(例:"PETR3"、"EURUSD")
  • period:データが収集される期間を指定する整数(例:週次データの場合はmt5.TIMEFRAME_W1)
  • ini:データ収集の時間間隔の開始時刻と日付を表すdatetimeオブジェクト
  • end:データ収集の時間間隔の終了日時を表すdatetimeオブジェクト

この関数は MetaTrader 5の起動を確認することから始まります。起動に失敗した場合、この関数は例外を返し、プログラムを終了します。

次に、この関数はmt5.copy_rates_range()を使用して、指定した銘柄と期間の金融データを取得します。データはpandasのDataFrameオブジェクトに保存されます。これは2次元の軸ラベル付きデータ構造で、金融データの保存に適しています。

データを受け取った後、この関数はDataFrameが空かどうかを確認します。もし関数が空であれば、データ収集中にエラーが発生したことを示す例外が返されます。

うまくいけば、この関数は、DataFrameのtime列を、読みやすい日付と時刻のフォーマットに変換します。pd.to_datetime()関数を使用して、読みやすい日時形式に変換します。time列はDataFrameのインデックスとして定義され、データへのアクセスや操作を容易にします。

def get_rates_between(symbol:str, period : int, ini : datetime, end : datetime):
    if not mt5.initialize():
        print("initialize() failed")
        mt5.shutdown()
        raise Exception("Error Getting Data")

    rates = mt5.copy_rates_range(symbol, period, ini, end)
    mt5.shutdown()
    rates = pd.DataFrame(rates)

    if rates.empty:
        raise Exception("Error Getting Data")

    rates['time'] = pd.to_datetime(rates['time'], unit='s')
    rates.set_index(['time'], inplace=True)

    return rates

この例では、2000年1月1日から2022年12月31日までの週単位のEURUSD通貨ペアの財務データを使用します。そのために、get_rates_between関数を使用します。まず、必要なライブラリを読み込みます。

import pandas as pd
from datetime import datetime, timezone
import MetaTrader5 as mt5
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

次に、分析したい金融銘柄に関する情報を決定します。

symbol = "EURUSD"
date_ini = datetime(2000, 1, 1, tzinfo=timezone.utc)
date_end = datetime(2022, 12, 31, tzinfo=timezone.utc)
period = mt5.TIMEFRAME_W1

ここで、先に定義した情報を使用してget_rates_between関数を呼び出すことができます。

df = get_rates_between(symbol=symbol, period=period, ini=date_ini, end=date_end)

データを入手したら、次の手順は機械学習モデルを作成するための準備です。準備には、外れ値や雑音の除去、変数の選択、データの変換、訓練セットとテストセットへの分割などが含まれます。それぞれの手順を詳しく考えてみましょう。

雑音や異常値を取り除く

最初の手順は、データから外れ値や雑音を取り除くことです。雑音とは、データの無作為で不要な変化のことで、パターンの特定を困難にします。外れ値とは、データセット内の他の値と著しく異なる値です。どちらもモデルのパフォーマンスに悪影響を与える可能性があります。

外れ値や雑音を除去する方法はいくつかあります。この記事では、指数平滑法を使用します。これは、指数関数的に減少する重みを最新のデータに割り当てるもので、変動を滑らかにするのに役立ちます。そのためにpandasのewm関数を使用します。

smoothed_df = df.ewm(alpha=0.1).mean()

実際には、ご自分のモデルとデータに合わせ、どのような方法を使用しても大丈夫です。ここでは、例を単純化し、データの処理方法を示すために指数平滑化を使用しています。実世界のシナリオでは、特定のデータセットと特定の問題に最適なアプローチを見つけるために、さまざまな外れ値や雑音の除去方法を研究し、評価することが推奨されます。その他の一般的な方法には、移動平均フィルタリング、パーセンタイルスクリーニング、クラスタリングなどがあります。


変数選択

次の手順は、特徴と目標として使用する変数を選択することです。この例では、始値、MACD(移動平均収束拡散、Moving Average Convergence Divergence)指標、EMA(指数移動平均、Exponential Moving Average)を特徴として使用します。目標は終値となります。

# Function to calculate MACD
def macd(df, fast_period=12, slow_period=26, signal_period=9):
    ema_fast = df['close'].ewm(span=fast_period).mean()
    ema_slow = df['close'].ewm(span=slow_period).mean()
    macd_line = ema_fast - ema_slow
    signal_line = macd_line.ewm(span=signal_period).mean()
    return macd_line, signal_line

# Function to calculate EMA
def ema(df, period=30):
    return df['close'].ewm(span=period).mean()

# Calculating MACD and the signal line
smoothed_df['macd'], smoothed_df['signal'] = macd(smoothed_df)

# Calculating EMA
smoothed_df['ema'] = ema(smoothed_df)

# Selecting the   variables
selected_df = smoothed_df[['open', 'macd', 'ema', 'close']].dropna()

データ変換

データの変換は、変数が同じ尺度になり、正しく比較できるようにするために重要です。この例では、データを0から1のスケールに変換するMin-Max正規化を使用しています。

scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(selected_df), columns=selected_df.columns, index=selected_df.index)

データ分割

最後に、データを訓練セットとテストセットに分割します。訓練セットを使用してモデルを訓練し、テストセットを使用してそのパフォーマンスを評価します。

X = normalized_df[['open', 'macd', 'ema']]
y = normalized_df['close']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

第2節では、データが機械学習モデルで使用できる状態になっていることを確認するために、いくつかの重要な手順を実行します。

MetaTrader 5 APIを使用して金融銘柄データを読み込むことから始め、それをpandas DataFrameに変換し、インデックスとして使用する時間列を設定します。その後、欠損値を取り除き、外れ値や矛盾がないかを確認することでデータをきれいにします。この措置は、モデルが無効な値や無関係な値の影響を受けないようにするために必要です。

変数として、Open、MACD、EMAを特徴として、Closeを目標として選択しました。ただし、これは明確な例を示すために無作為に選ばれたものであることに留意してください。

また、データの正規化もおこないました。これは、データのスケールの違いがモデルに影響を与えないようにするために重要です。最後に、モデルを新しいデータに汎化する能力を評価するために、データを訓練セットとテストセットに分けます。

これらのデータ準備手順は、モデルの予測を正確かつ効率的におこなうために非常に重要です。データの準備ができたら、次の段階、つまり機械訓練モデルの作成と訓練に移ることができます。


第3節:決定木を使用した回帰モデルの訓練と評価

訓練セットとテストセットを作成し、それに応じてデータを準備すると、決定木回帰モデルを作成し、訓練し、評価する準備が整います。決定木は教師あり学習の手法で、分類と回帰の両方の問題に適用できます。今回は、決定木を使用して金融資産の終値を予測します。

  • ライブラリの読み込みとモデルの作成

必要なライブラリを読み込み、scikit-learnからDecisionTreeRegressorモデルのインスタンスを作成することから始めましょう。

from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score

regressor = DecisionTreeRegressor(random_state=42)

  • モデル訓練

次に、訓練データセット(X_trainとy_train)を使用してモデルを訓練します。

regressor.fit(X_train, y_train)

  • 予測をおこなう

訓練済みモデルを使用して、テストデータセット(X_test)で予測をおこない、テストデータセットの実際の値(y_test)と結果を比較することができます。

y_pred = regressor.predict(X_test)

  • モデルパフォーマンスの評価

モデルのパフォーマンスを評価することは、そのモデルがどの程度データに適合し、予測をおこなうかを理解する上で重要です。平均2乗誤差(MSE)と決定係数(R²)に加えて、決定木回帰モデルのパフォーマンスを評価するために、他の測定基準も使用できます。私たちが調査できるその他の指標には、以下のようなものがあります。

  • 平均絶対誤差(MAE):予測値と実績値の差の絶対値の平均値。予測が実際の値からどの程度離れているかを示すわかりやすい指標です。
  • 平均絶対パーセンテージ誤差(MAPE):予測値と実際値の間の絶対パーセンテージ誤差の平均値。この指標は、モデルの効率をパーセンテージで評価することができ、異なる価値尺度のモデルを比較する際に有用です。
  • 二乗平均平方根誤差(RMSE):MSEの平方根。この指標の利点は、目標変数と同じ単位を持つため、結果の解釈が容易になることです。

Scikit-learnライブラリを使用すれば、これらの追加メトリクスを計算できます。まず、必要な関数を読み込みます。

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

次に、予測値と実績値を用いて指標を計算します。
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

これで結果を実証することができます。

print(f"MAE: {mae:.4f}")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"R²: {r2:.4f}")

  • モデルの設定と最適化

得られた結果によっては、モデルの調整と最適化が必要になるかもしれません。これは、最大深度(max_depth)、内部ノードを分割するのに必要な最小サンプル数(min_samples_split)、リーフノードに必要な最小サンプル数(min_samples_leaf)などの決定木ハイパーパラメータをチューニングすることによっておこなうことができます。

ハイパーパラメータを最適化するために、scikit-learnのグリッド探索(GridSearchCV)や無作為化探索(RandomizedSearchCV)といった手法があります。これらの方法によって、ハイパーパラメータのさまざまな組み合わせをテストし、モデルに最適な設定を見つけることができます。

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeRegressor


regressor = DecisionTreeRegressor(random_state=42)

param_grid = {
    'max_depth': [3, 4, 5, 6, 7, 8],
    'min_samples_split': [2, 3, 4],
    'min_samples_leaf': [1, 2, 3]
}

grid_search = GridSearchCV(estimator=regressor, param_grid=param_grid, scoring='neg_mean_squared_error', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)

best_params = grid_search.best_params_
print(f"Melhores hiperparâmetros: {best_params}")

best_regressor = DecisionTreeRegressor(**best_params, random_state=42)
best_regressor.fit(X_train, y_train)

y_pred_optimized = best_regressor.predict(X_test)

mae_optimized = mean_absolute_error(y_test, y_pred_optimized)
mse_optimized = mean_squared_error(y_test, y_pred_optimized)
rmse_optimized = np.sqrt(mse_optimized)
r2_optimized = r2_score(y_test, y_pred_optimized)

print(f"MAE otimizado: {mae_optimized:.4f}")
print(f"MSE otimizado: {mse_optimized:.4f}")
print(f"RMSE otimizado: {rmse_optimized:.4f}")
print(f"R² otimizado: {r2_optimized:.4f}")


  • 価格の非正規化とチャートの作成

価格を非正規化してチャートをプロットするには、MinMaxScalerinverse_transformを使用できます。まず、実際の価格(y_test)と予想価格(y_pred_optimised)を非正規化し、matplotlibライブラリを使用してグラフを作成します。これが更新されたコードです。

import matplotlib.pyplot as plt

# Function for denormalizing prices
def denormalize_price(scaler, normalized_price, column_name):
    dummy_df = pd.DataFrame(np.zeros((len(normalized_price), len(selected_df.columns))), columns=selected_df.columns)
    dummy_df[column_name] = normalized_price
    denormalized_df = scaler.inverse_transform(dummy_df)
    return denormalized_df[:, selected_df.columns.get_loc(column_name)]

# Denormalize actual and forecast prices
y_test_denorm = denormalize_price(scaler, y_test, 'close')
y_pred_optimized_denorm

このセクションでは、金融資産の終値を予測するための決定木による回帰モデルの実装について説明します。モデルの訓練と評価をおこなった後、パフォーマンス指標を求め、ハイパーパラメータをチューニングしてパフォーマンスを最適化しました。

しかし、この例は基本的なアプローチに過ぎず、モデルの精度とパフォーマンスを向上させるための高度なテクニックや戦略は数多く存在することに注意することが重要です。さらに、回帰モデルとデータ準備の選択は、各タスクのコンテキストと特定の要件によって異なるかもしれません。

最後に、金融市場価格の予測におけるモデルのロバスト性と信頼性を確保するために、異なるシナリオ、異なるデータセットを用いて、常に包括的なモデルのテスト、検証、反復をおこなう必要があります。


第4節:回帰モデルをストラテジーテスターに統合する

このセクションでは、MetaTraderストラテジーテスターでPythonモデルを直接テストできるシステムの作成について詳しく見ていきます。このアプローチは、Pythonのシンプルさを生かしながら、モデル作成にさらなる柔軟性を追加します。MQL5用のONNXフォーマットにモデルを書き出しているため、検証プロセスはMetaTrader自体でおこなわれます。つまり、MetaTrader環境で厳密な検証をおこないながら、簡単にモデルを構築し、改良することができ、複雑な金融市場に対応できるようにします。。

PythonとMQL5の効果的な相互作用

このシステムは、PythonとMQL5の効果的な相互作用を確立する重要な必要性に基づいています。MQL5ストラテジーテスターとのメッセージ交換を可能にするPythonクラスを作成します。Pythonプログラムが実行されている間、ストラテジーテスターでおこなわれた取引を監視し、テスターが起動されると、資産価格データを速やかにPythonに送信します。この継続的な情報の流れは、回帰モデルにリアルタイムのデータを提供し、そのデータに基づいて決定を下すことを可能にします。また、CSVファイルを操作するためのMQL5クラスの実装に関する情報をリフレッシュするために、この記事に戻ることをお勧めします。

PythonとMQL5間の通信用Fileクラスの構築

Fileクラスは、PythonとMQL5ストラテジーテスター間の通信を可能にします。このクラスの主な機能を見てみましょう。主な目的はファイル操作の実装です。

クラスの初期化

Fileクラスはシングルトンとして設計されており、プログラム全体を通して1つのインスタンスしか存在しないことが保証されています。この点は、PythonとMQL5間の通信の整合性を保つために重要です。

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


ファイルの検証と処理

Fileクラスは、ファイルの存在を確認し、ファイルに関連するエラーを処理し、読み取りと書き込みの操作を実行するための基本的なメソッドを提供します。

  • init_fileメソッドは、ファイルが存在するかどうかを確認します。ファイルが存在しない場合、メソッドは1秒待ってからFalseを返します。この確認によって、ファイルがアクセス可能な状態にあることを確認できます。

  • handle_errorメソッドは、ファイル操作時に発生する可能性のある例外を処理します。PermissionErrorやFileNotFoundErrorなどの一般的なエラーを特定し、これらのエラーに関する詳細な情報を提供します。

  • check_init_paramメソッドとcheck_open_fileメソッドは、CSVファイルを読み込むために必要です。check_init_paramメソッドは、ファイルが存在するかどうかを確認し、存在すれば読み込んで、DataFrameのtyperun列から特定の値を返します。check_open_fileメソッドは、ファイルの存在を確認し、完全なDataFrameとして読み込みます。

from pathlib import Path
from time import sleep
from typing import Tuple
import pandas as pd
from pandas.core.frame import DataFrame
import os
from errno import EACCES, EPERM, ENOENT
import sys

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

CSV_SEPARATOR = ';'

class File(metaclass=Singleton):

    def __init__(self) -> None:
        pass

    def __init_file(self, name_arq: str) -> bool:
        return Path(name_arq).is_file() or sleep(1) or False

    def __handle_error(self, e, name_arq: str):
        ERRORS = {
            EPERM: "PermissionError",
            EACCES: "PermissionError",
            ENOENT: "FileNotFoundError"
        }
        print(f"{ERRORS.get(e.errno, 'Unknown error')} error({e.errno}): {e.strerror} for:\n{name_arq}")

    def check_init_param(self, name_arq : str) -> Tuple[str]:
        while True:
            try:
                if self.__init_file(name_arq):
                    df = pd.read_csv(name_arq, sep=CSV_SEPARATOR)
                    return (df.typerun.values[0])
            except (IOError, OSError) as e:
                self.__handle_error(e, name_arq)
            except:
                print('Unexpected error:', sys.exc_info()[0])

    def check_open_file(self, name_arq: str) -> pd.DataFrame():
        while True:
            try:
                if self.__init_file(name_arq):
                    return pd.read_csv(name_arq, sep=CSV_SEPARATOR)
            except (IOError, OSError) as e:
                self.__handle_error(e, name_arq)
            except:
                print('Unexpected error:', sys.exc_info()[0])

    @staticmethod
    def save_file_csv(name_arq: str, dataset:DataFrame = pd.DataFrame({'col':['ok']})):
        dataset.to_csv(name_arq, sep=CSV_SEPARATOR)

    @staticmethod
    def save(name_arq:str, data:str):
        with open(name_arq, 'w') as f:
            f.write(data)

    @staticmethod
    def delete_file(name_arq: str):
        try:
            os.remove(name_arq)
        except:
            pass


ファイルの保存と削除

Fileクラスはファイルの保存と削除も管理します。

  • save_file_csvメソッドは、DataFrameをCSVファイルに保存します。これは、後で分析するためにアクセス可能な形式でデータを保存する必要がある場合に便利です。

  • Saveメソッドは、データをテキストファイルに保存するために使用されます。csvファイルのデータは、読みやすい形式で保存されます。

  • delete_fileメソッドは、システムからファイルを削除します。

Pythonによるデータ処理

Python側では、プログラムが銘柄価格のデータを受け取り、それを前処理します。この前処理の目的は、データが回帰モデルで使用する準備ができていることを確認することです。では、この仕組みを詳しく見てみましょう。

  1. データの標準化:最初の段階で、データは正規化されます。これは、ある範囲、通常は0から1の間で値を設定することを意味します。正規化は、様々な特性(例えば、株価や取引量)が同じ尺度になるようにするために必要です。これにより、モデルの誤差を避けることができます。

  2. 異常値の検出と除去:財務データは不安定である可能性があり、異常値はシミュレーション結果に悪影響を及ぼす可能性があります。Pythonプログラムは、ソースデータの品質を保証するために、これらの偏差を検出し、必要に応じて修正します。

  3. 追加機能の作成:多くの場合、元のデータに基づいて追加の特徴が作成されます。これらは例えば、移動平均、テクニカル指標、またはモデルがより多くの情報に基づいた意思決定をおこなうために使用できるその他の指標です。

データが完全に準備されてから、回帰モデルに投入します。

回帰モデルの動作

決定木に基づく回帰モデルは、過去のデータで訓練されました。現在、このデータはPythonプログラムに読み込まれ、最新の価格データに基づく予測に使用されています。これらの予測は、資産の未来の挙動に関する貴重な情報を提供するため、取引の意思決定をおこなうための基本的なものです。この例では特定の回帰モデルを使用していますが、このアプローチは取引戦略の特定の要件に応じて、さまざまなモデルに適用できることに留意すべきです。このように、このシステムは柔軟性に富んでいるため、各戦略の個別のニーズに合わせてさまざまなモデルを取り入れることができます。

MetaTrader 5を改善するONNXの統合

MetaTrader 5のシステムを向上させる興味深いヒントを共有したいと思います。ONNX (Open Neural Network Exchange)との統合です。ONNXは人工知能にとって非常に便利なツールで、モデルを簡単にMetaTrader 5に移行することができます。

MetaTrader 5で十分にテストし、モデルの有効性を確認した後、ONNXフォーマットへの書き出しを検討することができます。これにより、MetaTrader 5の機能が拡張されるだけでなく、様々なストラテジーやプラットフォームシステムでこのモデルを使用することが容易になります。

ONNXがMetaTrader 5にネイティブに統合されたことで、取引戦略におけるモデルの利用をさらに拡大することができます。

書き出し前の徹底的なテスト

MQL5環境との相互作用を伴う現在のアプローチを選択したのは、モデルをONNXフォーマットに書き出しする前に、管理された環境で広範なテストを実施する必要があるためです。モデルを構築し、MQL5に直接統合することは、複雑でエラーが発生しやすいプロセスです。したがって、この方法論によって、ONNXフォーマットに書き出す前であっても、望ましい結果を得るためにモデルを注意深く改良調整することができます。


結論

要約すると、この記事では回帰モデルを実装するための統合されたアプローチについて論じました。第1節では、手元の問題を解くのに適切なアルゴリズムを選択することの重要性に焦点を当て、回帰モデルの選択について議論しました。第2節では、モデル訓練のための処理とクリーニングを含むデータ準備について見ました。

第3節では、決定木を例として回帰モデルの訓練と評価をおこないました。さらに、データを訓練データとテストデータセットに分割し、モデルのパフォーマンスを最適化するためのハイパーパラメータを選択することも検討しました。

最後に第4節では、MetaTraderストラテジーテスターへの回帰モデルの統合、PythonとMQL5の相互作用、MetaTrader 5での実装を改善するためのONNXフォーマットの使用について検討しました。

要約すると、本稿では取引戦略にモデルを導入する際の重要な手順を概観し、適切なモデルの選択、データの準備、訓練と評価、そして取引環境への効果的な統合の重要性を強調しました。これらの手順は、よりロバストでデータ主導の取引システムを構築するための基礎となります。
上記のコードはGitリポジトリで利用可能です。

MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/12471

多銘柄多期間指標の作成 多銘柄多期間指標の作成
この記事では、多銘柄、多期間の指標を作成する原則について見ていきます。また、エキスパートアドバイザー(EA)や他の指標から、このような指標のデータにアクセスする方法も紹介します。EAや指標でマルチ指標を使用する主な特徴について考察し、カスタム指標バッファを使用してそれらをプロットする方法を見ていきます。
ニューラルネットワークが簡単に(第63回):Unsupervised Pretraining for Decision Transformer (PDT) ニューラルネットワークが簡単に(第63回):Unsupervised Pretraining for Decision Transformer (PDT)
引き続き、Decision Transformer法のファミリーについて説明します。前回の記事から、これらの手法のアーキテクチャの基礎となるTransformerの訓練はかなり複雑なタスクであり、訓練のために大規模なラベル付きデータセットが必要であることにすでに気づきました。この記事では、ラベル付けされていない軌跡をモデルの予備訓練に使用するアルゴリズムについて見ていきます。
CatBoostモデルにおける交差検証と因果推論の基本、ONNX形式への書き出し CatBoostモデルにおける交差検証と因果推論の基本、ONNX形式への書き出し
この記事では、機械学習を使用してボットを作成する方法を提案しています。
ニューラルネットワークが簡単に(第62回):階層モデルにおけるDecision Transformerの使用 ニューラルネットワークが簡単に(第62回):階層モデルにおけるDecision Transformerの使用
最近の記事で、Decision Transformerを使用するためのいくつかの選択肢を見てきました。この方法では、現在の状態だけでなく、以前の状態の軌跡や、その中でおこなわれた行動も分析することができます。この記事では、階層モデルにおけるこの方法の使用に焦点を当てます。