コンテンツにスキップ

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

Hidden Markov Model

この記事の3行まとめ

  1. 「価格」の裏には目に見えない「状態(トレンド/レンジ)」があると仮定し、その確率を算出する理論。
  2. 「今は80%レンジ相場」といった確率的な答えが出せるため、クオンツ(金融工学)では常識的な手法
  3. Pythonの hmmlearn ライブラリを使えば数行で実装可能。MT5との連携方法もゼロから解説!

隠れマルコフモデル (HMM) とは?

FXをやっていると、「今はトレンドなのか?それともレンジなのか?」と迷うことが必ずあります。 移動平均線などのインジケータは「価格」を加工したものですが、HMMのアプローチは根本的に異なります

「目に見えるもの」と「隠れているもの」

HMMでは、世界を2つの層に分けて考えます。

  1. 観測値 (Observation): 私たちが目で見ているもの(価格、ローソク足)。
  2. 隠れ状態 (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の環境構築は済んでいる前提ですが、必要なコマンドは以下の通りです。

Bash
# 必要なライブラリのインストール
pip install MetaTrader5 pandas numpy matplotlib hmmlearn
  • MetaTrader5: PythonからMT5を直接操作するための公式ライブラリ。
  • hmmlearn: HMM(隠れマルコフモデル)を計算するための機械学習ライブラリ。

Step 2: MT5の設定

Pythonから接続するためには、MT5側で以下の設定が必要です。

  1. MT5を起動する。
  2. 「ツール」メニュー -> 「オプション」 -> 「エキスパートアドバイザ」タブを開く。
  3. 「アルゴリズム取引を許可する」 にチェックを入れる(念のため)。
  4. その他の設定はデフォルトでOKです。

Step 3: 分析コード (Python)

以下のコードを HMM_MT5_Tutorial.py という名前で保存してください。 このスクリプトは以下の動作をします。

  1. 起動中のMT5に接続し、EURUSDの1時間足データを2000本取得。
  2. 「価格の変化率」と「ボラティリティ」を計算。
  3. HMMで「3つの状態(上昇、下降、レンジなど)」に分類。
  4. チャートに状態ごとの色分けをして表示。
Python
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: 実行と結果の解釈

スクリプトを実行すると、チャートが表示されます。

  • 赤色の期間: 例えば「上昇トレンド」
  • 青色の期間: 例えば「レンジ」
  • 緑色の期間: 例えば「下落・高ボラティリティ」

機械学習(教師なし学習)なので、「どの色がどの状態か」は毎回変わる可能性があります。 しかし、「同じ色の期間は、相場の性質が同じ」 ということは保証されます。

また、コンソールには以下のように表示されます。

Text Only
【直近の足の状態確率】
  状態 0: 12.5%
  状態 1: 85.3%
  状態 2:  2.2%

この場合、「現在は 状態1(例えばレンジ)である確率が圧倒的に高い」と判断できます。 もしこれが「状態0: 45%, 状態1: 55%」のように拮抗していたら、「相場の転換点(または迷い)」 である可能性が高いのです。


MQL5への応用

今回はPythonで分析しましたが、このロジックをEAに組み込むにはどうすれば良いでしょうか?

  1. CSV連携: Pythonで計算した state をCSVに書き出し、EAから読み込む(最も簡単)。
  2. ソケット通信: Pythonをサーバー、EAをクライアントにしてリアルタイム通信(上級者向け)。
  3. ONNX: モデルをONNX形式で保存し、MQL5の OnnxRun 関数で実行(最速だが実装難度高)。

まずは、「Pythonで相場の健康診断をする」 という使い方がおすすめです。 週末に過去データをHMMにかけて、「今の相場はどの状態に近いのか?」を知っておくだけでも、週明けの戦略は大きく変わるはずです。

サンプルコード (HMM_MT5_Tutorial_v2.zip) をダウンロード


【初心者向け】Pythonスクリプトの実行完全ガイド

「Pythonの設定がよくわからない」「ダウンロードしたけど何も起きない」という方のために、環境構築から実行までの手順をまとめました。

1. なぜ「何も起こらない」のか?

Pythonスクリプト(.py)は、必要な設定が一つでも欠けているとエラー画面が一瞬で閉じてしまい、「何も起こらなかった」ように見えてしまいます。これを防ぐため、以下の手順を順番に行いましょう。

2. 事前準備(ライブラリのインストール)

今回作成したAI分析プログラムを動かすには、いくつかの拡張機能(ライブラリ)が必要です。

  1. Windowsのスタートメニューから「コマンドプロンプト」または「PowerShell」を開きます。
  2. 開いた黒い(または青い)画面に、以下のコマンドをコピー&ペーストしてEnterキーを押してください。
    Bash
    pip install MetaTrader5 pandas numpy matplotlib hmmlearn
    
  3. 画面に文字が全自動で流れます。元の入力待ち(C:\Users\名前> など)に戻るまで数分お待ちください。

3. MT5側の設定(超重要)

プログラムがMT5から価格データを取得するため、MT5側の許可が必要です。

  1. MT5を起動します。
  2. メニューバーの「ツール」>「オプション」を開きます。
  3. エキスパートアドバイザ」タブを開き、「アルゴリズム自動取引を許可する」にチェックを入れて「OK」を押します。 (※プログラムがうまくMT5と通信できずフリーズする場合は、一度MT5を終了し、アイコンを右クリックして「管理者として実行」で起動し直してください)

4. いざ、実行!

  1. 本記事のダウンロードボタンから保存したZIPファイルを解凍し、HMM_MT5_Tutorial.py を用意します。
  2. 先ほどのコマンドプロンプトpython (※最後に半角スペース) と入力します。
  3. そのまま、HMM_MT5_Tutorial.py のファイルを黒い画面の中にドラッグ&ドロップしてEnterキーを押します。
  4. 数十秒の計算処理の後、以下のような状態ごとに色分けされたチャート分析結果がポンッと別ウィンドウで飛び出してくれば大成功です!

HMM分析結果のチャート例


関連記事

この記事を読んだ方におすすめ

コラム一覧に戻る