最終更新: 2026年6月
PythonとMT5を連携させて機械学習ベースの自動売買をやってみたい——。そう考えている人が増えている。実際、MT5が公式のPythonライブラリ(MetaTrader5パッケージ)を提供してからというもの、機械学習を使ったFX自動売買の敷居は大きく下がった。
本記事では、Python × MT5 × 機械学習の基本的な構成を解説する。ただし先に言っておくと、機械学習を使えばFXで必ず利益が出るわけではない。筆者が実装・検証した範囲では、過学習を適切に防いだ予測モデルの方向性精度は55〜60%程度が現実的な水準だ。それでも「確率的優位を積み重ねる」という思想のもとでシステムを設計する価値はある。
免責事項: 本記事は技術的な情報提供を目的としています。FX取引には元本割れのリスクがあります。投資判断は自己責任でお願いします。
Python × MT5 の基本アーキテクチャ
Python × MT5 × 機械学習の自動売買システムは、大きく3層で構成される。
| 層 | 役割 | 主要ツール |
|---|---|---|
| データ取得層 | MT5から価格データを取得 | MetaTrader5 ライブラリ |
| 予測モデル層 | 特徴量生成・モデル訓練・予測 | scikit-learn / XGBoost / LightGBM |
| 注文執行層 | 予測シグナルをMT5注文に変換 | MetaTrader5 ライブラリ |
MT4ではこの3層をシームレスに繋ぐには相当な工夫が必要だったが、MT5の公式Pythonサポートによって「Pythonで書いた機械学習モデルの予測結果を直接MT5の注文に変換する」というパイプラインが素直に実装できる。
Claudeと会話しながらインジケータが作れる[hedgrow-fx]はこちら: https://hedgrow-fx.com/
環境構築: 必要なライブラリのインストール
pip install MetaTrader5 pandas numpy scikit-learn xgboost lightgbm matplotlib
MT5のインストール(Windows版)が前提となる。macOS/LinuxではMT5が動かないため、Windowsマシンまたはリモートデスクトップ経由のWindowsサーバーが必要になる点に注意。
MT5の初期化確認:
import MetaTrader5 as mt5
if not mt5.initialize():
print("MT5の初期化に失敗しました:", mt5.last_error())
quit()
print("MT5バージョン:", mt5.version())
mt5.shutdown()
Step 1: MT5から価格データを取得する
機械学習モデルの訓練には過去の価格データが必要だ。copy_rates_range() 関数で指定期間のOHLCデータを取得できる。
import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
mt5.initialize()
# USDJPY の日足データを2年分取得
rates = mt5.copy_rates_range(
"USDJPY",
mt5.TIMEFRAME_H1, # 1時間足
datetime(2024, 1, 1),
datetime(2026, 6, 1)
)
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)
mt5.shutdown()
print(df.head())
取得できるカラムは open, high, low, close, tick_volume, spread, real_volume の7つ。
Step 2: 特徴量エンジニアリング
機械学習モデルに「何を教えるか」が最も重要なステップだ。価格の絶対値ではなく、「変化率」「比率」「パターン」を特徴量にすることが基本になる。
def create_features(df):
df = df.copy()
# リターン(対数差分)
df['return_1h'] = df['close'].pct_change(1)
df['return_4h'] = df['close'].pct_change(4)
df['return_24h'] = df['close'].pct_change(24)
# 移動平均からの乖離率
df['ma20'] = df['close'].rolling(20).mean()
df['ma50'] = df['close'].rolling(50).mean()
df['ma_dev_20'] = (df['close'] - df['ma20']) / df['ma20']
# ボラティリティ(ATR相当)
df['high_low_range'] = (df['high'] - df['low']) / df['close']
df['volatility_20'] = df['return_1h'].rolling(20).std()
# 目的変数: 次の1時間のリターンが正なら1
df['target'] = (df['close'].shift(-1) > df['close']).astype(int)
return df.dropna()
df_features = create_features(df)
ここで重要な点を一つ。筆者が実装で何度もやらかしたミスが「未来データのリーク(look-ahead bias)」だ。特徴量に未来の価格が混入すると、バックテストでは信じられないほど良い結果が出る。しかしそれは幻想で、実運用では全くその通りにならない。shift(-1) の使い方には細心の注意を払うこと。
Step 3: 機械学習モデルの訓練と評価
時系列データの分割は通常の train_test_split をそのまま使うと時間順が崩れてしまう。時系列では「過去データで訓練、未来データでテスト」という順序を守る必要がある。
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
import numpy as np
# 特徴量と目的変数の定義
feature_cols = ['return_1h', 'return_4h', 'return_24h',
'ma_dev_20', 'high_low_range', 'volatility_20']
X = df_features[feature_cols]
y = df_features['target']
# 時系列分割(過去80%で訓練、直近20%でテスト)
split_idx = int(len(X) * 0.8)
X_train, X_test = X.iloc[:split_idx], X.iloc[split_idx:]
y_train, y_test = y.iloc[:split_idx], y.iloc[split_idx:]
# モデル訓練
model = GradientBoostingClassifier(
n_estimators=100,
learning_rate=0.05,
max_depth=3, # 浅めにして過学習を抑制
random_state=42
)
model.fit(X_train, y_train)
# 評価
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
実際に動かしてみると、精度(accuracy)が55〜58%程度という結果が出ることが多い。「それだけ?」と思うかもしれないが、コインの裏表(50%)を有意に超えていれば理論上は優位がある。ただし、スプレッドと手数料を考慮した実質的な優位性の検証まで行ってはじめて「使えるモデル」かどうかが分かる。
Step 4: MT5への注文送信
モデルの予測シグナルを実際のMT5注文に変換する部分だ。
import MetaTrader5 as mt5
def send_order(symbol, direction, lot_size=0.01):
"""
direction: 1=買い, 0=売り
"""
mt5.initialize()
price = mt5.symbol_info_tick(symbol).ask if direction == 1 else mt5.symbol_info_tick(symbol).bid
order_type = mt5.ORDER_TYPE_BUY if direction == 1 else mt5.ORDER_TYPE_SELL
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": lot_size,
"type": order_type,
"price": price,
"deviation": 10, # スリッページ許容(ポイント)
"magic": 123456, # EA識別番号
"comment": "ML_signal",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC,
}
result = mt5.order_send(request)
if result.retcode != mt5.TRADE_RETCODE_DONE:
print(f"注文エラー: {result.retcode}, {result.comment}")
else:
print(f"注文成功: {result.order}")
mt5.shutdown()
return result
ロットサイズは極めて小さく(0.01ロット)から始めることを強く推奨する。機械学習モデルがどんなに良い結果を示していても、実際の相場では想定外の動きが必ず起きる。
よく陥る落とし穴と対策
機械学習 × FX を実装する過程で筆者が遭遇した問題を3つ共有する。
落とし穴1: 過学習(Overfitting)
バックテストでは95%精度が出るのに、リアルでは50%以下になる。対策はモデルの複雑度を下げること(max_depth=3程度に抑える)とウォークフォワード検証の実施。
落とし穴2: サバイバーシップバイアス 訓練データに現在存在するペアしか含まれていない場合、「生き残った相場パターン」だけで学習してしまう。できるだけ長い期間のデータで検証すること。
落とし穴3: スプレッドのコスト計算漏れ バックテストで勝率55%でも、スプレッドが広ければ実質的に赤字になる。必ずスプレッドを考慮したコスト込みのシミュレーションを行うこと。
まとめ
Python × MT5 × 機械学習の構成をまとめると:
MetaTrader5ライブラリで価格データを取得- パンダスで特徴量エンジニアリング(リーク注意)
- 時系列を壊さないデータ分割でモデル訓練
- スプレッドコミコミの実質評価
- 0.01ロットの小ロットから実運用開始
機械学習でFXに「確実な利益」はない。しかし「統計的優位を持つ戦略を検証・改良し続ける」という工学的アプローチは、感覚だけのトレードより再現性が高い。
Claudeと会話しながらインジケータが作れる[hedgrow-fx]はこちら: https://hedgrow-fx.com/
よくある質問(FAQ)
Q: Pythonの機械学習でFXを自動売買すれば必ず利益が出ますか? A: いいえ。機械学習モデルでも予測が外れることは常にあります。過去データで良い結果が出ても、相場の構造変化で性能が劣化することがあります。リスク管理を最優先に設計してください。
Q: MT5のPythonライブラリはmacOSで使えますか? A: MT5自体がWindowsアプリケーションのため、macOSでは直接動作しません。Windowsマシンが必要です。クラウドのWindowsサーバー(VPS)を借りる方法もあります。
Q: どの機械学習アルゴリズムがFXに向いていますか? A: XGBoost、LightGBM、Gradient Boostingが実績が多いですが、「最適なアルゴリズム」は相場環境やデータ特性によって変わります。複数試して交差検証で比較することが重要です。
Q: どのくらいのデータ量が必要ですか? A: 最低でも2〜3年分の時間足データを推奨します。データが少ないと過学習しやすくなります。
Q: 機械学習のFX自動売買をリアル口座で始めるまでに何をすべきですか? A: デモ口座で最低3ヶ月の実運用検証をし、プロフィットファクターが1.5以上・最大ドローダウンが20%以下を確認してから、最小ロットのリアル口座に移行することを推奨します。
Q: Claudeなどの生成AIを組み合わせることはできますか? A: 可能です。生成AIをシグナルの解釈やリスク判断の補助として使う実装事例があります。ただし、生成AIの出力を注文判断の唯一の根拠にするのは避けてください。
著者: 金融工学出身システムトレーダー
