【検証#03】隠れマルコフモデル (HMM) — 相場の「状態」を確率で読む¶

この記事の3行まとめ
- 「価格」の裏には目に見えない「状態(トレンド/レンジ)」があると仮定し、その確率を算出する理論。
- 「今は80%レンジ相場」といった確率的な答えが出せるため、クオンツ(金融工学)では常識的な手法。
- Pythonの
hmmlearnライブラリを使えば数行で実装可能。MT5との連携方法もゼロから解説!
隠れマルコフモデル (HMM) とは?¶
FXをやっていると、「今はトレンドなのか?それともレンジなのか?」と迷うことが必ずあります。 移動平均線などのインジケータは「価格」を加工したものですが、HMMのアプローチは根本的に異なります。
「目に見えるもの」と「隠れているもの」¶
HMMでは、世界を2つの層に分けて考えます。
- 観測値 (Observation): 私たちが目で見ているもの(価格、ローソク足)。
- 隠れ状態 (Hidden State): 直接は見えないが、価格を動かしている根本的な環境(上昇トレンド、下降トレンド、レンジ...)。
「価格が乱高下している(観測値)」から、「今はボラティリティが高い状態(隠れ状態)なんだな」と逆推測する。これがHMMの正体です。
なぜ高性能なのか?¶
従来のインジケータは「RSIが70を超えたら売り」のように 0か1かの断定的な判断 をしがちです。 しかし相場は白黒はっきりしていません。
HMMは確率を出します。 「現在は State 0 (レンジ) である確率が 85%、State 1 (トレンド) である確率が 15%」 といった具合です。 これにより、「確度が高いときだけエントリーする」「確率が下がってきたら早めに逃げる」といった高度な資金管理が可能になります。
【実践】Python × MT5 でHMMを動かそう¶
ここからは、実際にPythonを使ってHMMで相場分析を行う手順を解説します。 「Pythonなんて触ったことない」という方でも大丈夫です。コピペで動くように作りました。
Step 1: Python環境の準備¶
まず、Pythonおよご必要なライブラリをインストールします。 AnacondaやVS Codeの環境構築は済んでいる前提ですが、必要なコマンドは以下の通りです。
- MetaTrader5: PythonからMT5を直接操作するための公式ライブラリ。
- hmmlearn: HMM(隠れマルコフモデル)を計算するための機械学習ライブラリ。
Step 2: MT5の設定¶
Pythonから接続するためには、MT5側で以下の設定が必要です。
- MT5を起動する。
- 「ツール」メニュー -> 「オプション」 -> 「エキスパートアドバイザ」タブを開く。
- 「アルゴリズム取引を許可する」 にチェックを入れる(念のため)。
- その他の設定はデフォルトでOKです。
Step 3: 分析コード (Python)¶
以下のコードを HMM_MT5_Tutorial.py という名前で保存してください。 このスクリプトは以下の動作をします。
- 起動中のMT5に接続し、EURUSDの1時間足データを2000本取得。
- 「価格の変化率」と「ボラティリティ」を計算。
- HMMで「3つの状態(上昇、下降、レンジなど)」に分類。
- チャートに状態ごとの色分けをして表示。
import MetaTrader5 as mt5
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from hmmlearn import hmm
# --- 設定 ---
SYMBOL = "EURUSD"
TIMEFRAME = mt5.TIMEFRAME_H1
DATA_COUNT = 2000
N_COMPONENTS = 3 # 状態数(3つくらいが丁度いいことが多い)
def main():
# 1. MT5接続
if not mt5.initialize():
print("MT5接続失敗:", mt5.last_error())
return
# 2. データ取得
rates = mt5.copy_rates_from_pos(SYMBOL, TIMEFRAME, 0, DATA_COUNT)
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
# 3. 特徴量作成(対数収益率 & ボラティリティ)
df['log_return'] = np.log(df['close'] / df['close'].shift(1))
df['range'] = (df['high'] - df['low']) / df['close']
df.dropna(inplace=True)
# 学習用データ
X = df[['log_return', 'range']].values
# 4. HMM学習
print("HMM学習中...")
model = hmm.GaussianHMM(n_components=N_COMPONENTS, covariance_type="full", n_iter=100)
model.fit(X)
# 状態を推定
hidden_states = model.predict(X)
# --- 結果の表示 ---
print("\n【直近の足の状態確率】")
last_probs = model.predict_proba([X[-1]])[0]
for i, prob in enumerate(last_probs):
print(f" 状態 {i}: {prob*100:.1f}%")
# チャート描画
plot_results(df, hidden_states)
mt5.shutdown()
def plot_results(df, hidden_states):
plt.figure(figsize=(12, 6))
colors = ['red', 'blue', 'green']
# 状態ごとに色を変えてプロット
for i in range(N_COMPONENTS):
mask = (hidden_states == i)
plt.plot(df['time'][mask], df['close'][mask], '.', label=f'State {i}', color=colors[i], markersize=3)
plt.title(f"HMM Analysis: {SYMBOL}")
plt.legend()
plt.show()
if __name__ == "__main__":
main()
Step 4: 実行と結果の解釈¶
スクリプトを実行すると、チャートが表示されます。
- 赤色の期間: 例えば「上昇トレンド」
- 青色の期間: 例えば「レンジ」
- 緑色の期間: 例えば「下落・高ボラティリティ」
機械学習(教師なし学習)なので、「どの色がどの状態か」は毎回変わる可能性があります。 しかし、「同じ色の期間は、相場の性質が同じ」 ということは保証されます。
また、コンソールには以下のように表示されます。
この場合、「現在は 状態1(例えばレンジ)である確率が圧倒的に高い」と判断できます。 もしこれが「状態0: 45%, 状態1: 55%」のように拮抗していたら、「相場の転換点(または迷い)」 である可能性が高いのです。
MQL5への応用¶
今回はPythonで分析しましたが、このロジックをEAに組み込むにはどうすれば良いでしょうか?
- CSV連携: Pythonで計算した
stateをCSVに書き出し、EAから読み込む(最も簡単)。 - ソケット通信: Pythonをサーバー、EAをクライアントにしてリアルタイム通信(上級者向け)。
- ONNX: モデルをONNX形式で保存し、MQL5の
OnnxRun関数で実行(最速だが実装難度高)。
まずは、「Pythonで相場の健康診断をする」 という使い方がおすすめです。 週末に過去データをHMMにかけて、「今の相場はどの状態に近いのか?」を知っておくだけでも、週明けの戦略は大きく変わるはずです。
サンプルコード (HMM_MT5_Tutorial_v2.zip) をダウンロード
【初心者向け】Pythonスクリプトの実行完全ガイド¶
「Pythonの設定がよくわからない」「ダウンロードしたけど何も起きない」という方のために、環境構築から実行までの手順をまとめました。
1. なぜ「何も起こらない」のか?¶
Pythonスクリプト(.py)は、必要な設定が一つでも欠けているとエラー画面が一瞬で閉じてしまい、「何も起こらなかった」ように見えてしまいます。これを防ぐため、以下の手順を順番に行いましょう。
2. 事前準備(ライブラリのインストール)¶
今回作成したAI分析プログラムを動かすには、いくつかの拡張機能(ライブラリ)が必要です。
- Windowsのスタートメニューから「コマンドプロンプト」または「PowerShell」を開きます。
- 開いた黒い(または青い)画面に、以下のコマンドをコピー&ペーストしてEnterキーを押してください。
- 画面に文字が全自動で流れます。元の入力待ち(
C:\Users\名前>など)に戻るまで数分お待ちください。
3. MT5側の設定(超重要)¶
プログラムがMT5から価格データを取得するため、MT5側の許可が必要です。
- MT5を起動します。
- メニューバーの「ツール」>「オプション」を開きます。
- 「エキスパートアドバイザ」タブを開き、「アルゴリズム自動取引を許可する」にチェックを入れて「OK」を押します。 (※プログラムがうまくMT5と通信できずフリーズする場合は、一度MT5を終了し、アイコンを右クリックして「管理者として実行」で起動し直してください)
4. いざ、実行!¶
- 本記事のダウンロードボタンから保存したZIPファイルを解凍し、
HMM_MT5_Tutorial.pyを用意します。 - 先ほどのコマンドプロンプトに
python(※最後に半角スペース) と入力します。 - そのまま、
HMM_MT5_Tutorial.pyのファイルを黒い画面の中にドラッグ&ドロップしてEnterキーを押します。 - 数十秒の計算処理の後、以下のような状態ごとに色分けされたチャート分析結果がポンッと別ウィンドウで飛び出してくれば大成功です!

関連記事¶
この記事を読んだ方におすすめ
- 🌀 【検証#01】ハースト指数 — カオス理論で市場の「記憶」を読む — R/S分析で相場の持続性を数値化
- 📐 【検証#02】Lorentzian Classification — 機械学習で「似た相場」を特定
- 🏯 トレンド相場 vs レンジ相場:江戸の米相場に学ぶ — 相場判定の理論的背景
- 🤖 【実験#03】マーチンゲールEAの全仕様を公開 — ハーストフィルターを実際にEAに組み込んだ事例