![見出し画像](https://assets.st-note.com/production/uploads/images/131637842/rectangle_large_type_2_029f3cc108d4813b16cdd16e8c89e9d0.png?width=1200)
ML-EA(機械学習型FX自動売買)の特徴量エンジニアリング
機械学習、特にLightGBM(Light Gradient Boosting Machine)モデルにおいて予測精度を高めるための工夫は多岐にわたります。まず、LightGBMは勾配ブースティングアルゴリズムの一種で、決定木ベースの学習アルゴリズムです。このモデルは特に大規模なデータセットや高次元のデータで優れた性能を発揮することで知られています。
予測精度を高める工夫として、一般的には以下のようなことが挙げられます。
パラメータチューニング:
学習率(Learning Rate): 学習率を調整することで、モデルの収束速度と精度のバランスを取ることができます。
木の数(Number of Trees)と深さ(Depth of Trees): 木の数と深さを増やすことでモデルの複雑さが増し、過学習のリスクとバランスを取りながら精度を高めることができます。
データの前処理:
データの正規化や標準化を行うことで、特徴量間のバランスを取り、学習効率を高めます。
特徴量エンジニアリング:
新しい特徴量の生成や既存の特徴量の変換を通じて、モデルがデータをよりよく理解できるようにします。
欠損値と異常値の処理:
欠損値や異常値を適切に処理することで、データの品質を向上させ、モデルの性能を高めます。
アンサンブル学習:
複数のモデルを組み合わせることで、各モデルの強みを活かし、精度を向上させることができます。
今回は、この中でも特に特徴量エンジニアリングに着目して、モデルの精度向上を目指してみたいと思います。
ML-EAモデルと特徴量エンジニアリング
以前の記事では、ML-EAという機械学習を取り入れたFX自動売買のベースモデルを作成し解説しました。
このベースモデルでは、1分足、5分足、15分足、1時間足のMA(移動平均線)のみを特徴量としていました。今回は、このベースモデルをさらに進化させて、RSI(相対力指数)とMACD(移動平均収束拡散指数)も特徴量に追加したモデルを作成しています。
FX自動売買ロジックの概要
改めて、ロジック概要です。ベースモデルからの変更は特徴量のみです。
機械学習モデルはLight-GBMモデルを採用
訓練や予測に使う特徴量は、MAとRSIとMACDについて、それぞれ1分足、5分足、15分足、1時間足の4種類ずつ
目的変数(y)は、4時間後の価格が0.1%以上上昇していればy=1、4時間後の価格が0.1%以上下落していればy=2、それ以外の場合はy=0とする。つまり、y=0,1,2とする三値分類モデル
過去1,000時間のデータでモデルの訓練を行う。4時間毎にモデルの訓練を繰り返し、常に最新データで訓練されたモデルにアップデート
訓練済みモデルによる予測は1分間隔で行い、予測結果がy=1であれば買い注文、y=2であれば売り注文を行う
特徴量の追加による評価指標の変化
ML-EAのベースモデルに特徴量としてRSIとMACDを追加した結果、モデルの性能に顕著な改善が見られました。以下は、それぞれベースモデルと特徴量追加後の拡張モデルの評価指標です。
ベースモデル(特徴量追加前)
![](https://assets.st-note.com/img/1708517568500-dw5sMRJbD6.png?width=1200)
訓練精度(Training Accuracy): 87.22%
テスト精度(Test Accuracy): 86.24%
分類レポート(Classification Report):
0クラスの精度: 82%, 再現率: 85%, F1スコア: 83%
1クラスの精度: 88%, 再現率: 87%, F1スコア: 88%
2クラスの精度: 90%, 再現率: 87%, F1スコア: 88%
拡張モデル(特徴量追加後)
![](https://assets.st-note.com/img/1708517595444-AOUU3xZjJJ.png?width=1200)
訓練精度(Training Accuracy): 93.07%
テスト精度(Test Accuracy): 91.81%
分類レポート(Classification Report):
0クラスの精度: 88%, 再現率: 91%, F1スコア: 89%
1クラスの精度: 94%, 再現率: 93%, F1スコア: 93%
2クラスの精度: 94%, 再現率: 92%, F1スコア: 93%
評価指標の比較
これらから、以下のような変化が観察されます。
全体的な精度の向上:
訓練精度が約5.8%、テスト精度が約5.6%向上しました。これは、追加した特徴量がモデルにとって有意義な情報を提供し、より正確な予測を可能にしたことを示していると言えます。
クラスごとの改善:
全てのクラスで精度、再現率、F1スコアが向上しています。特に1クラスと2クラスでの改善が顕著で、これは新たな特徴量が売買判定(1はbuyフラグ、2はsellフラグ)に特に効果的であったことを意味していると言えます。
バランスの取れた性能:
ベースモデルと比べ、特徴量追加後のモデルでは全クラスにわたってバランスの取れた改善が見られます。これは、モデルが特定のクラスに偏ることなく、全体的に均等に改善されたことを示していると言えます。
以上、特徴量エンジニアリング、特にRSIとMACDの追加は、ML-EAの予測性能を顕著に向上させる効果があることが確認されました。これは、適切な特徴量がモデルの理解と予測能力を大幅に強化できる良い例です。今後もこのようなアプローチを通じて、さらなるモデルの最適化を試してみたいと思っています。
ML-EAのコード変更
ここからは、ML-EAのベースモデルから、今回の拡張のために変更した部分について各コードをご紹介します。改めて、ベースモデルは以下の記事でご確認ください。
MQL5のメイン処理
まず、以下のメイン処理は何も変えなくてOKです。各関数の中身を調整することで対応します。
//+------------------------------------------------------------------+
//| 起動時の処理
//+------------------------------------------------------------------+
void OnInit()
{
// プロセス完了ファイルを作成
CreateProcessDoneFile();
// モデルを訓練
TrainModel();
}
//+------------------------------------------------------------------+
//| ティック毎の処理
//+------------------------------------------------------------------+
void OnTick()
{
// モデルを訓練
TrainModel();
// Ask、Bidとスプレッドを取得
GetMarketInfo(_Symbol, Ask, Bid, Spread);
// スプレッドが許容スプレッドを超える場合は以降の処理をスキップ
if(Spread > spread_limit * Point())
return;
// 訓練済みモデルによる予測
PredictFlg();
// 予測結果を読み込み
LoadPredictionOutcome();
// ポジションの確認
CheckPositions();
// buyエントリー注文
if(order_flg == 1)
{
PlaceEntryOrder(1, buy_position, last_buy_time);
}
// sellエントリー注文
if(order_flg == 2)
{
PlaceEntryOrder(2, sell_position, last_sell_time);
}
// buyクローズ注文
if(buy_position > 0)
{
bool result = CloseBuyPositions();
}
// sellクローズ注文
if(sell_position > 0)
{
bool result = CloseSellPositions();
}
}
有料部分の内容
有料部分ではML-EAをベースに、特徴量を増やして機械学習機能を拡張するための変更用コードを掲載しています。
具体的には、以下の関数およびPythonスクリプトの変更部分を掲載しています。
モデルを訓練する関数
各種指標をファイルに出力する関数
訓練済みモデルで予測する関数
確定した最新のRSIを返す関数
確定した最新のMACDを返す関数
予測用のデータを出力する関数
Pythonスクリプト
訓練用(train.py)
予測用(predict.py)
注意点
当記事で掲載しているコードはPythonの環境設定含め、必要な準備が整っている上での実行を想定しています。また、以下の記事のML-EA(MQL5用)をベースとした変更部分のコードしか掲載していませんので、当記事の有料部分の内容だけでは実際に動かすことはできません。以下の記事の内容と組み合わせる必要があります。
記事執筆時点で稼働確認を行なっており、エラーが出ないことを確認しておりますが、その後の環境変化等で想定通りに稼働しない可能性はございます。動作保証等はいたしかねますのでご了承ください。
リアル口座にアクセスして取引を行うことも可能なコードになっておりますが、必ずデモ口座で事前に稼働確認をしていただくことを推奨いたします。
当記事で解説しているロジック通りの動作を保証するものではございません。あくまでFX自動売買ツール開発のためのサンプルコードとしてご活用ください。
その他の改善については以下の記事にまとめています。
インジケーターのパラメータ
グローバル変数として、以下のパラメータを追加しておきます。ベースモデルでは、MA_periodだけであったところに、RSIとMACDのパラメータも追加します。
//+------------------------------------------------------------------+
//| インジケーターのパラメータ
//+------------------------------------------------------------------+
int MA_period = 14;
int RSI_period = 14;
int MACD_fastEMA = 12;
int MACD_slowEMA = 26;
int MACD_signalSMA = 9;
ひとまず、それぞれ一般的なパラメータにしています。
ここから先は
¥ 1,000
Amazonギフトカード5,000円分が当たる
よろしければ応援お願いします。いただいたチップは今後の記事の執筆に活用させていただきます。