この記事の内容をコピペしていけば、以下の記事で作成したテクニカル指標による売買判断を取り入れたFX自動売買ツールを拡張して、機械学習モデルによる売買判断ロジックを取り入れることが可能になります。
PythonとMT5を連携させることによって、Pythonで扱える機械学習モデルもFX自動売買にそのまま適用できるようになっています。
LSTMやLightGBMのような機械学習/ディープラーニングモデルにおいて、学習を行うコード例はよく紹介されているのですが、実際に自動売買ロジックに組み込む部分のコード例はあまり多くなかったのでここに整理しておきます。
初心者向けになるべくコードの意味まで丁寧に解説するように心がけていますので、初心者の方も是非、FX自動売買のMLbotの作成にチャレンジしてみてください。
FX自動売買ツールの設計概要
前回の記事でもご紹介した通り、基本的なFX自動売買ツール(bot)の設計概要は以下の通りです。
- 四本値(始値、高値、安値、終値)データを取得
- 四本値データを基にテクニカル指標を計算
- テクニカル指標を基に売買判断フラグを生成
- ポジション情報を取得して既存のポジションを確認
- 新規エントリー(買いまたは売り)の条件を満たしている場合、注文を送信
- エントリー時に設定した利確幅またはストップロス幅に到達したらポジションクローズ
- 上記全てをループ処理
ロジック概要
前回作成したFX自動売買ツール(bot)のロジック概要は以下の通りでした。
- テクニカル指標(MAとRSIなど)を用いて売買判断条件を作成
- 売買判断条件を満たした場合にbuyまたはsellの注文を行う
- ATR(Average True Range)を基準に利確幅とストップロス幅を決める
今回は、このテクニカル指標による売買判断条件を機械学習モデルによって拡張させる方法をご紹介します。
Inputの設定
以下のインプットを用意していますが、今回の拡張に関係してくるのは最後のbar_periodです。
symbol = "GOLD" # 取引対象
first_lot = 0.01 # 初期ロット数
tp_factor = 2.0 # 利確係数
sl_factor = 1.5 # ストップロス係数
magic_number = 10001 # マジックナンバー
slippage = 10 # スリッページ
bar_period = 30 # 取得する四本値の本数
取得する四本値の本数(bar_period)
これは取得するバー(四本値)の本数です。使用する機械学習モデルに合わせて必要な本数を設定するようにしてください。
例えば、LSTMモデルのルックバックを10と設定している場合は、10本のバーが必要になります。また、モデルのインプットとしてテクニカル指標を含めている場合は、10本のテクニカル指標を作成する必要がありますので、10本前のテクニカル指標を計算するのに必要な過去分のデータも必要になります。必要に応じて調整してください。ある程度余裕を持たせてバーの本数を設定しても良いと思います。
MLbot(機械学習モデル)とは
MLbot(機械学習モデル)は、ディープラーニング(深層学習)モデルとそれ以外のモデルに大きく分けられます。
ディープラーニングモデルとそれ以外のモデルの違い
ディープラーニングモデルとそれ以外のモデルの違いは主に以下の点です。どちらのモデルが適切かは、問題設定やデータの性質、計算リソースによって異なります。適切なモデルを選択し、データに適した前処理や特徴抽出を行うことが重要です。
構造
ディープラーニングモデルは、多層のニューラルネットワーク構造を持っており、層を重ねることでより複雑なデータ表現や抽象化が可能です。それに対して、それ以外のモデル(伝統的な機械学習モデル)は、決定木や線形回帰などシンプルな構造を持ち、データの表現力はディープラーニングに比べて限定的です。
学習能力
ディープラーニングモデルは、大量のデータや複雑なデータ構造から特徴を自動的に学習する能力があります。それに対して、伝統的な機械学習モデルでは、特徴量の選択や前処理が重要であり、手動で特徴を設計することが一般的です。
計算負荷
ディープラーニングモデルは、大量のパラメータと複雑な構造を持つため、学習や推論に多くの計算リソース(GPUやメモリ)が必要です。それに対して、伝統的な機械学習モデルは計算負荷が低く、学習や推論が比較的高速です。
適用範囲
ディープラーニングモデルは、画像認識、自然言語処理、音声認識など幅広い分野で高い性能を発揮します。それに対して、伝統的な機械学習モデルは、特定のタスクに特化したモデルが多く、適用範囲がディープラーニングに比べて狭いことがあります。
機械学習モデルの紹介
機械学習モデルには以下の通り様々なモデルが存在します。
- ディープラーニングモデル(深層学習モデル)
- LSTM (長短期記憶)
- GRU (ゲート付き回帰型ユニット)
- CNN (畳み込みニューラルネットワーク)
- それ以外のモデル(伝統的な機械学習モデル)
- LightGBM(勾配ブースティングマシン)
- SVM(サポートベクターマシン)
FXの価格予測には、時系列データを扱うことができるLSTMやGRUが適しているとされています。これらのモデルは、過去の価格データやテクニカル指標を学習し、未来の価格変動を予測することができます。
しかし、CNNやLightGBMも、適切な特徴量や設定でFXの価格予測に対応できる可能性があります。
またSVMは、適切なカーネル関数やハイパーパラメータ設定によって、FXの価格予測に対応できる可能性があります。ただし、データの前処理や特徴選択が重要であるため、他のモデルと比較して手間がかかることもあります。
以下でそれぞれのモデルを簡単にご紹介します。
ディープラーニングモデル(深層学習モデル)
LSTM (長短期記憶)
LSTMは、「Long Short-Term Memory(長短期記憶)」の略です。
リカレントニューラルネットワーク (RNN) の一種で、時系列データの長期的な依存関係を捉えることができます。FXの価格予測においては、過去の価格データを用いて未来の価格を予測する際に有用です。
GRU (ゲート付き回帰型ユニット)
GRUは、「Gated Recurrent Unit(ゲート付き回帰型ユニット)」の略です。
LSTMに似たリカレントニューラルネットワークで、LSTMよりもパラメータが少なく、計算負荷が低いです。時系列データを扱う際にLSTMと同様に利用されますが、性能は問題設定によって異なります。
CNN (畳み込みニューラルネットワーク)
CNNは、「Convolutional Neural Network(畳み込みニューラルネットワーク)」の略です。
主に画像認識に利用されるニューラルネットワークですが、時系列データに対しても適用可能です。局所的な特徴を捉えることが得意で、FXの価格予測においては短期的なパターン検出に有用です。
それ以外のモデル(伝統的な機械学習モデル)
LightGBM(勾配ブースティングマシン)
GBMは、「Gradient Boosting Machine(勾配ブースティングマシン)」の略です。
勾配ブースティングアルゴリズムを用いた決定木モデルで、高速で精度が高いことが特徴です。FXの価格予測においては、過去の価格データやテクニカル指標を特徴量として使用し、未来の価格変動を予測することができます。
SVM(サポートベクターマシン)
SVMは「Support Vector Machine(サポートベクターマシン)」の略です。
教師あり学習の分類および回帰モデルで、線形・非線形の境界を学習することでデータの分類や予測を行います。マージン最大化という考え方に基づいており、汎化性能が高いことが特徴です。FXの価格予測においては、過去の価格データやテクニカル指標を特徴量として使用し、未来の価格変動を予測することができます。
機械学習モデルによる売買判断フラグの設定
generate_trade_flgs関数を機械学習モデルによるアウトプットに切り替える方法です。
以下の前提でそれぞれのモデルにおけるサンプルコードを用意しました。
- 事前に学習済みの機械学習モデルを読み込む。
- 必要な特徴量(テクニカル指標)を計算し、データを前処理する。
- buy_flg用モデルとsell_flg用モデルを使って、売買フラグを生成する。
今回は、各モデルの特徴量はMAとRSIのみにしています。この部分はモデルの調整に合わせて変更する部分です。
また、buy_flg用モデルとsell_flg用モデルはそれぞれ別々に学習させて保存してある前提で記載しています。
LSTM / GRU / CNNモデル
ディープラーニングモデル(LSTM/GRU/CNN)は、基本的に同じコードで設定可能ですので以下にコード例を示します。
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import load_model
def generate_trade_flgs(data, symbol_tick):
# 事前に学習済みのモデルをロードする
buy_model = load_model('buy_lstm_model.h5')
sell_model = load_model('sell_lstm_model.h5')
# テクニカル指標の計算
data = calculate_ma(data)
data = calculate_rsi(data)
# データの前処理
lookback = 10 # ルックバック期間はモデルに合わせて変更してください
input_data = data[['ma', 'rsi']].iloc[-lookback-1:-1].values.reshape(1, lookback, -1)
# 売買判断フラグ
buy_flg = (buy_model.predict(input_data)[0, 0] > 0.5)
sell_flg = (sell_model.predict(input_data)[0, 0] > 0.5)
return buy_flg, sell_flg
この例は、LSTMモデルを'buy_lstm_model.h5'
、'sell_lstm_model.h5'
というファイル名で保存している前提です。
モデルの変更方法は、「#事前に学習済みのモデルをロードする」部分を変更して、各モデルに対応したファイルを呼び出すだけです。
LightGBMモデル
LightGBMモデルによるコード例です。
import lightgbm as lgb
import numpy as np
def generate_trade_flgs(data, symbol_tick):
# 事前に学習済みのLightGBMモデルをロードする
buy_lgb_model = lgb.Booster(model_file='buy_lgb_model.txt')
sell_lgb_model = lgb.Booster(model_file='sell_lgb_model.txt')
# テクニカル指標の計算
data = calculate_ma(data)
data = calculate_rsi(data)
# データの前処理
input_data = data[['ma', 'rsi']].iloc[-2].values.reshape(1, -1)
# 売買判断フラグ
buy_flg = buy_lgb_model.predict(input_data)[0] > 0.5
sell_flg = sell_lgb_model.predict(input_data)[0] > 0.5
return buy_flg, sell_flg
学習済みのLightGBMモデルが、buy_lgb_model.txt
とsell_lgb_model.txt
というファイル名で保存されている前提です。
SVMモデル
SVMモデルによるコード例です。
import pickle
from sklearn.preprocessing import StandardScaler
def generate_trade_flgs(data, symbol_tick):
# 事前に学習済みのSVMモデルをロードする
with open('buy_svm_model.pkl', 'rb') as f:
buy_svm_model = pickle.load(f)
with open('sell_svm_model.pkl', 'rb') as f:
sell_svm_model = pickle.load(f)
# テクニカル指標の計算
data = calculate_ma(data)
data = calculate_rsi(data)
# データの前処理
input_data = data[['ma', 'rsi']].iloc[-2].values.reshape(1, -1)
scaler = StandardScaler()
input_data_scaled = scaler.fit_transform(input_data)
# 売買判断フラグ
buy_flg = buy_svm_model.predict(input_data_scaled) == 1
sell_flg = sell_svm_model.predict(input_data_scaled) == 1
return buy_flg, sell_flg
学習済みのSVMモデルが、buy_svm_model.pkl
とsell_svm_model.pkl
というファイル名で保存されている前提です。
まとめ
以上、”売買判断フラグを設定する関数”部分をMAやRSIのようなテクニカル指標を用いて単純な計算式で判断するのではなく、機械学習モデルによるアウトプットに置き換える方法をご紹介しました。今回取り上げたの特徴量がMAとRSIだけという非常にシンプルなパターンですが、各々が使用する学習済みモデルに合わせてこのコードを様々なパターンに発展させることも可能だと思います。
是非、オリジナルの学習済みモデルでMLbotを作成してみてください。
機械学習×FX自動売買のサンプルコード全文
この記事では、学習済みの機械学習モデルを呼び出して売買判断を設定するロジックをご紹介しましたが、以下の記事では、LightGBMの実践的な活用方法をコード全文を添えて紹介しています。
PythonスクリプトをMT5のチャート上で直接実行する方法
MT5(MetaTrader5)では、Pythonスクリプトを通常のMQL5プログラムと同様にチャート上で直接実行できる機能が存在します。その方法を解説しています。
ChatGPTを機械学習に活かす方法
何度も試行錯誤が必要で大変な工程なのですが、最近ではChatGPT等のAIを上手く活用すれば効率的に行う方法も出てきました。
以下の記事では、ChatGPTを用いて機械学習を進める方法をご紹介しています。