AIにFXチャート分析させて戦略立てさせてみた

当ページのリンクには広告が含まれています。

こんにちは、しゃーろです。

今回は、MT5のcsvデータを使用してAIにチャート分析をしてもらい、トレード戦略まで立てられるのか試してみました。

感情が入る人の判断より、数字を元に戦略を立てられるAIに任せた方がいいんじゃないか…と思ったからです。

分析結果は保証できませんので、自己責任でお願いします。

使用したもの
  • Windows 11
  • XM Trading(MT5)
目次

AIチャート分析 & 戦略立ての流れ

AIチャート分析 & 戦略立ての流れは以下。

  1. エクスプローラーにフォルダを作成する。
  2. pythonコードを貼り付け、PYファイルを作る。
  3. MT5からcsvファイルを取得する。
  4. コマンドプロンプトを開いて実行する。

僕はプログラミングに全く詳しくないので細かい説明は出来ませんが、同じやり方で分析できると思います。

1. エクスプローラーにフォルダを作成する

まずは、エクスプローラーに必要なフォルダを作成していきます。

最終的なフォルダ構成は以下です。

fx_ai/
├─ main.py
└─ data/
├─ USDJPY/
│ ├─ W1.csv
│ ├─ D1.csv
│ ├─ H4.csv
│ ├─ H1.csv
│ └─ M15.csv
├─ EURUSD/
├─ GBPUSD/
├─ GBPJPY/
├─ EURJPY/
├─ GBPEUR/
└─ XAUUSD/

今回は、「fx_ai」という名前のフォルダを作成しました。

その中にPYファイルとdataフォルダを作成していきます。

fx_aiフォルダの中で「右クリック→新規作成→フォルダ」と進み、名前を「data」にします。

この中に各通貨ペアのフォルダを作成し、csvファイルを入れていく感じです。

2. pythonコードを貼り付け、PYファイルを作る

続いて、PYファイルを作成していきます。

fx_aiフォルダの中で「右クリック→新規作成→テキストドキュメント」と進み、名前を「main」とします。

拡張子が「.txt」となっていると思うので、「.py」に変更します。

警告が出ますが、そのまま進みましょう。

そして、main.pyを開き、以下のコードを貼り付けます↓

import numpy as np

# ==============================
# 🔥 通貨強弱(例)
# ==============================
currency_strength = {
    'USD': -2,
    'JPY': -3,
    'EUR': 2,
    'GBP': 2,
    'XAU': 1
}

# ==============================
# 🔥 状態判定(改良版)
# ==============================
def detect_state(trend_score, atr, price_range):
    if trend_score >= 7:
        return "TREND"
    if atr > price_range * 0.6:
        return "VOLATILE"
    if trend_score <= 3:
        return "CHOP"
    return "RANGE"

# ==============================
# 🔥 ゾーン生成(反発ベース簡易)
# ==============================
def generate_zones(price):
    step = price * 0.0015
    return [price + i * step for i in range(-3, 4)]

# ==============================
# 🔥 エントリー厳選(最重要)
# ==============================
def select_entry(zones, direction):
    if direction == "BUY":
        return min(zones)
    else:
        return max(zones)

# ==============================
# 🔥 TP(構造ベース)
# ==============================
def calc_tp(entry, zones, direction):
    if direction == "BUY":
        higher = [z for z in zones if z > entry]
        return max(higher) if higher else entry * 1.002
    else:
        lower = [z for z in zones if z < entry]
        return min(lower) if lower else entry * 0.998

# ==============================
# 🔥 SL(固定+余裕)
# ==============================
def calc_sl(entry, direction):
    if direction == "BUY":
        return entry - entry * 0.002
    else:
        return entry + entry * 0.002

# ==============================
# 🔥 EV(距離補正あり)
# ==============================
def calc_ev(score, rr, distance):
    base = score / 20
    rr_factor = min(rr / 2, 1.2)
    dist_penalty = 1 - min(distance / 2, 0.5)
    ev = base * rr_factor * dist_penalty
    return round(min(ev, 0.9), 2)

# ==============================
# 🔥 RR計算
# ==============================
def calc_rr(entry, sl, tp):
    risk = abs(entry - sl)
    reward = abs(tp - entry)
    if risk == 0:
        return 0
    return reward / risk

# ==============================
# 🔥 最終フィルター(神ルール)
# ==============================
def final_filter(trade):
    if trade["ev"] < 0.75:
        return False
    if trade["score"] < 10:
        return False
    if abs(trade["tp"] - trade["entry"]) < abs(trade["entry"] - trade["sl"]):
        return False
    return True

# ==============================
# 🔥 通貨ペア分析
# ==============================
def analyze_pair(pair, price, trend_score):
    base = pair[:3]
    quote = pair[3:]

    strength = currency_strength.get(base, 0) - currency_strength.get(quote, 0)

    # 方向
    if strength > 1:
        direction = "BUY"
    elif strength < -1:
        direction = "SELL"
    else:
        return None

    # 状態
    atr = price * 0.002
    state = detect_state(trend_score, atr, price * 0.01)

    # ゾーン
    zones = generate_zones(price)

    # エントリー(1つだけ厳選)
    entry = select_entry(zones, direction)

    # SL / TP
    sl = calc_sl(entry, direction)
    tp = calc_tp(entry, zones, direction)

    # RR
    rr = calc_rr(entry, sl, tp)

    # スコア(4軸統合)
    score = trend_score + abs(strength)

    # 距離補正
    distance = abs(price - entry) / price

    # EV
    ev = calc_ev(score, rr, distance)

    trade = {
        "pair": pair,
        "type": direction,
        "entry": round(entry, 6),
        "sl": round(sl, 6),
        "tp": round(tp, 6),
        "score": score,
        "ev": ev,
        "state": state
    }

    if final_filter(trade):
        return trade

    return None

# ==============================
# 🔥 メイン実行
# ==============================
pairs = {
    "USDJPY": (158.817, 4),
    "EURUSD": (1.181, 5),
    "GBPJPY": (215.544, 8),
    "EURJPY": (187.354, 8),
    "XAUUSD": (4796.6, 5)
}

results = []

print("\n==============================")
print("🔥 通貨強弱")
print("==============================")
print(currency_strength)

for pair, (price, trend) in pairs.items():
    print("\n==============================")
    print(f"◆ {pair}")
    print("==============================")
    print(f"価格: {price}")

    trade = analyze_pair(pair, price, trend)

    if trade:
        print("【エントリー】")
        print(trade)
        results.append(trade)
    else:
        print("👉 NO TRADE")

# ==============================
# 🔥 最終ランキング(最大2)
# ==============================
results = sorted(results, key=lambda x: x["ev"], reverse=True)

print("\n==============================")
print("🔥 最終エントリー(最大2)")
print("==============================")

for r in results[:2]:
    print(r)

貼り付けたら「Ctrl + S」で保存します。

3. MT5からcsvファイルを取得する。

続いて、csvファイルを取得していきます。

MT5を立ち上げましょう。

立ち上げたら、上のメニューバーから「表示→銘柄」と進みます。

銘柄画面を開いたら「チャートバー」を選択します。

通貨ペア・時間足・期間を選択して、「情報呼出」をクリックします。

【各時間足の取得期間目安】

1W→約4年分
1D→2年分
4h→4か月分
1h→1か月分
15m→半月分

データが表示されたら「バーをエクスポート」をクリックします。

読み込まない場合は、何回か情報呼出すると出てくると思います。

エクスポートしたデータは、dataフォルダの中に以下の名前で保存します。(他の通貨ペアも同様)

fx_ai/
└─ data/
├─ USDJPY/
│ ├─ W1.csv
│ ├─ D1.csv
│ ├─ H4.csv
│ ├─ H1.csv
│ └─ M15.csv

時間足が名前、拡張子が.csvです。(W1.csv.csvではない)

ちなみに、このExcelファイルは開けなくても問題ありません。

僕は登録していないのでExcelを使えませんが、ファイルさえあればデータ分析はできます。

4. コマンドプロンプトを開いて実行する

続いて、コマンドプロンプトを立ち上げていきます。

まずは、fx_aiフォルダを開きましょう。

フォルダ画面上のバーに「cmd」と入力してEnterを押します。

そうすると、黒い画面(コマンドプロンプト)が出てくるので、以下のコードを入力してEnterを押します。

python main.py

エラーが出る場合

上のような画面になった場合、pandas(データ分析用ツール)がまだ入っていません。

以下を入力してEnterを押しましょう。

pip install pandas

しばらく待つと、pandasがインストールされます。

他のエラーが出た場合、表示された内容をChatGPTなどに聞いてみると解決策が見つかるので試してみてください。

pandasがインストールできたら、再度以下を入力してEnterを押します。

python main.py

分析してもらった結果…

さて、csvデータを使ってPythonでチャート分析をした結果は…

==============================
🔥 通貨強弱
==============================
{‘USD’: -2, ‘JPY’: -3, ‘EUR’: 2, ‘GBP’: 2, ‘XAU’: 1}

==============================
◆ USDJPY
==============================
価格: 158.817
👉 NO TRADE

==============================
◆ EURUSD
==============================
価格: 1.181
👉 NO TRADE

==============================
◆ GBPJPY
==============================
価格: 215.544
【エントリー】
{‘pair’: ‘GBPJPY’, ‘type’: ‘BUY’, ‘entry’: 214.574052, ‘sl’: 214.144904, ‘tp’: 216.513948, ‘score’: 13, ‘ev’: 0.78, ‘state’: ‘TREND’}

==============================
◆ EURJPY
==============================
価格: 187.354
【エントリー】
{‘pair’: ‘EURJPY’, ‘type’: ‘BUY’, ‘entry’: 186.510907, ‘sl’: 186.137885, ‘tp’: 188.197093, ‘score’: 13, ‘ev’: 0.78, ‘state’: ‘TREND’}

==============================
◆ XAUUSD
==============================
価格: 4796.6
👉 NO TRADE

==============================
🔥 最終エントリー(最大2)
==============================
{‘pair’: ‘GBPJPY’, ‘type’: ‘BUY’, ‘entry’: 214.574052, ‘sl’: 214.144904, ‘tp’: 216.513948, ‘score’: 13, ‘ev’: 0.78, ‘state’: ‘TREND’}
{‘pair’: ‘EURJPY’, ‘type’: ‘BUY’, ‘entry’: 186.510907, ‘sl’: 186.137885, ‘tp’: 188.197093, ‘score’: 13, ‘ev’: 0.78, ‘state’: ‘TREND’}

こんな感じになりました。

いや、それっぽいけど勝てる気がしない笑

まとめ

今回は、AIを使ってFXのチャート分析 & 戦略立てができるのかどうか試してみました。

壁打ちしながら何度もコードを作り直したので、1週間くらいかかりましたね。

分析結果をもとにチャートを見ると、勝てないだろうなとは思いました。

ただ、数字を感情なしで分析できるので、何かしら使えそうな感じはします。

また他にアイディアがあれば試してみたいです。

最後まで読んでいただき、ありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

2001年生まれ。
「自分の幸せ」を追求しています。
日々の気づきや思ったこと、シェアしたいこと、とにかく書きたいことを書く雑記ブログです。

ワンピース、進撃の巨人、トリコ好き。

目次