2023.06
林貴晴/AMSER Inc.
ChatGPTなどのAI技術は急速に進化していますが、MetaTrader 5 (MT5) 単体ではAIの活用には限界があります。そこで、Pythonとの連携を通じてAIを実装することが可能です。この記事では、MT5から取得したデータを用いてPythonで機械学習を行い、通貨ペアEUR/USDの30分後の価格を予測する方法を詳しく説明します。
MetaTrader 5のPythonパッケージをインストールします。まだインストールしていない場合は、次のコマンドを実行してください。
pip install MetaTrader5
MetaTrader5,pandas,numpyとsklearn,tensorflowの一部のライブラリをインポートします。
import MetaTrader5 as mt5 import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM, Dropout
MetaTrader 5 (MT5)と接続をします。MT5が起動していない時はMT5が起動します。
mt5.initialize()
次に、EUR/USDの30分足のデータを過去1500足分取得し、pandasのDataFrameに変換します。ここで、タイムスタンプは秒単位から適切な日時形式に変換します
通貨ペア名はMetaTrader 5 (MT5)の気配値表示に表示されている名前を正確に入れる必要があります。ここではフィリップ証券のサフィックス.ps01を付けています。
symbol = "EURUSD.ps01" rates = mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_M30, 0, 1500) data = pd.DataFrame(rates) data['time'] = pd.to_datetime(data['time'], unit='s')
取得した価格データの「終値(close)」を正規化します。これにより、データが0から1の範囲に収まるようになり、機械学習モデルの学習効率が向上します。
scaler = MinMaxScaler(feature_range=(0, 1)) data['close'] = scaler.fit_transform(data['close'].values.reshape(-1, 1))
過去1440足(30日分)のデータを用いて、次の時点の価格を予測するデータセットを作成します。
x = [] y = [] for i in range(1440, len(data)): x.append(data['close'][i-1440:i]) y.append(data['close'][i]) x, y = np.array(x), np.array(y)
LSTMネットワークを用いたモデルを構築し、訓練します。LSTMネットワーク(Long Short-Term Memory network)は、時系列データを扱うために特化したディープラーニングの一種です。このネットワークは、長期的な情報を記憶し続ける能力があり、情報を選択的に保持または忘却することができるため、相場予測などの複雑なタスクに適しています。ここで、Dropout層を用いることで過学習を防ぎます
model = Sequential([ LSTM(50, return_sequences=True, input_shape=(x.shape[1], 1)), Dropout(0.2), LSTM(50, return_sequences=False), Dropout(0.2), Dense(1) ]) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(x, y, epochs=50, batch_size=32)
学習したモデルを使用して、最新のデータから30分後の価格を予測します。予測された価格を元のスケールに戻して表示します。
recent_data = data['close'][-1440:].values.reshape(1, 1440, 1) predicted_price = model.predict(recent_data) predicted_price = scaler.inverse_transform(predicted_price) print(f"予測される30分後の価格: {predicted_price[0][0]}")
最後にMetaTrader 5 (MT5)との接続を切ります。
mt5.shutdown()
この方法により、MT5とPythonを活用してAIに基づく為替の価格予測を実現することができます。特に、深層学習を用いたこのアプローチは、従来の統計的手法や単純なテクニカル分析では捉えきれない市場の複雑な動きをモデル化する能力を持っています。以下に全体のコードを示します。
import MetaTrader5 as mt5 import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM, Dropout mt5.initialize() symbol = "EURUSD.ps01" rates = mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_M30, 0, 1500) data = pd.DataFrame(rates) data['time'] = pd.to_datetime(data['time'], unit='s') scaler = MinMaxScaler(feature_range=(0, 1)) data['close'] = scaler.fit_transform(data['close'].values.reshape(-1, 1)) x = [] y = [] for i in range(1440, len(data)): x.append(data['close'][i-1440:i]) y.append(data['close'][i]) x, y = np.array(x), np.array(y) model = Sequential([ LSTM(50, return_sequences=True, input_shape=(x.shape[1], 1)), Dropout(0.2), LSTM(50, return_sequences=False), Dropout(0.2), Dense(1) ]) model.compile(optimizer='adam', loss='mean_squared_error') model.fit(x, y, epochs=50, batch_size=32) recent_data = data['close'][-1440:].values.reshape(1, 1440, 1) predicted_price = model.predict(recent_data) predicted_price = scaler.inverse_transform(predicted_price) print(f"予測される30分後の価格: {predicted_price[0][0]}") mt5.shutdown()
30分足のデータを30日分使用して、機械学習を利用した30分後の価格予測を行うことができました。この条件での計算時間は数分程度です。サンプルデータを増やすことによって予測の精度を向上させることが期待できますが、計算時間は使用するデータ量に比例して長くなることを考慮する必要があります。そのため、1分や5分先の価格予測は計算時間の都合上、現実的ではありません。より長い時間スパン、例えば30分以上の価格予測が推奨されます。MetaTrader 5 (MT5) とPythonを組み合わせることで、機械学習を取り入れた新たな取引戦略のロジックを開発することができます。これにより、より高度な取引システムの構築が可能となり、市場での競争力を高めることができます。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。