最終更新: 2026年06月
テクニカル分析の本質的な問題は「同じチャートを見ても人によって解釈が違う」ことだ。
RSI 68は「まだ買える」と見る人と「過熱圏に近い」と見る人がいる。EMAのゴールデンクロスを確認してエントリーするのが「遅すぎる」と感じるトレーダーと「確認してから入るべき」と考えるトレーダーがいる。この解釈の揺らぎが、同じシステムを使っても結果が変わる原因の一つになる。
AIエージェントをテクニカル分析に組み込む意義の一つは、「解釈基準を文書化・固定化する」ことにある。どのRSI水準を「過熱」と判断するか、どの条件の組み合わせで「強いトレンド」と分類するかを、プロンプトとして明示的に記述する作業が、自分のトレード哲学の言語化にもなる。
AIエージェントをテクニカル分析に使う3つのアプローチ
アプローチ1:数値データの言語解釈
最も実装が簡単なアプローチ。テクニカル指標の数値をLLMに渡して、「どういう相場状況か」を言語化させる。
現在の状況を評価してください:
- RSI14: 68(直前: 65)
- MACD: シグナルラインを上抜いて3バー経過
- ADX14: 32(トレンド強度: 強)
- EMA20 vs EMA50: EMA20がEMA50を150pips上回る
- ボリンジャーバンド: 中央バンドより上、上限バンドから25pips
評価形式: {"trend_strength": 1-5, "momentum_status": "accelerating/stable/fading", "risk_note": "注意事項があれば"}
LLMが返す「加速中かフェード中か」という評価は、トレンドフォロー戦略の精度向上に使える。単純な数値比較では拾えない「複数指標の組み合わせ的な状態」を文脈として捉えるのがLLMの強みだ。
アプローチ2:マルチモーダル(チャート画像解析)
Claude Opus 4.8はチャート画像を直接解析できる。Base64エンコードした画像をAPIに渡す実装で、視覚的なパターン認識が可能になる。
import anthropic
import base64
client = anthropic.Anthropic()
def analyze_chart_image(image_path: str, currency_pair: str) -> dict:
"""チャート画像をClaudeに送って分析させる"""
with open(image_path, "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
prompt = f"""このFXチャート({currency_pair}、4時間足)を分析してください。
以下のJSON形式のみで回答してください:
{{
"trend": "up/down/range",
"key_patterns": ["識別したパターンのリスト"],
"support": 数値(直近のサポートライン),
"resistance": 数値(直近のレジスタンスライン),
"bias_score": -5から+5(+が強気、-が弱気),
"key_concern": "最も重要な注意事項(1文)"
}}"""
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=256,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data,
},
},
{"type": "text", "text": prompt}
],
}]
)
import json
try:
return json.loads(message.content[0].text)
except:
return {"error": "parse_failed", "raw": message.content[0].text}
チャート画像の自動生成には、MT5のScreenShotFull関数や外部のChart-IMG APIが使える。実際に試した感触では、明確なトレンドパターンやダブルトップ/ボトム形状の識別は精度が高い。一方、微妙なサポート/レジスタンスラインの判定は「それらしい答え」を返すが、毎回一致するわけではない。
アプローチ3:複数時間軸の統合判断
個人が見落としやすいのが「複数時間軸の矛盾」だ。日足は上昇トレンドだが1時間足は調整中——このとき4時間足でロングを取るべきか。この判断をAIエージェントに整理させる。
複数時間軸の状況を評価してください:
日足: EMA20 > EMA50、RSI 58(強気バイアス)
4時間足: EMA20 が EMA50 を下抜き(弱気サイン)、RSI 44
1時間足: 下降チャネル形成中
トレード方向: 4時間足でのロングエントリーを検討中
以下を判定してください:
1. 時間軸間の整合性(高/中/低)
2. 現在の最適なアクション(エントリー待機/見送り/ショート検討)
3. エントリーを正当化する条件(何が揃えばロングできるか)
免責: テクニカル分析はパターンの認識に基づく判断補助であり、将来の価格動向を保証するものではありません。FX取引は元本損失リスクを伴います。
自動テクニカル分析パイプラインの設計
全体フロー
定期実行(例: 15分ごと)
↓
MT5からテクニカルデータを取得(Python mt5 ライブラリ)
↓
Claude APIに渡して分析実行(アプローチ1または2)
↓
判断スコアを評価
↓ スコアが閾値以上の場合のみ
EA(MT5)にシグナルを送信
↓
EA側でエントリー実行(ロット・SL・TPはEA側で制御)
MT5からのデータ取得
import MetaTrader5 as mt5
import pandas as pd
def get_technical_data(symbol: str, timeframe=mt5.TIMEFRAME_H4, bars=50) -> dict:
"""MT5からテクニカル指標データを取得する"""
mt5.initialize()
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, bars)
df = pd.DataFrame(rates)
# EMAの計算
df['ema20'] = df['close'].ewm(span=20).mean()
df['ema50'] = df['close'].ewm(span=50).mean()
# RSIの計算
delta = df['close'].diff()
gain = delta.where(delta > 0, 0).ewm(span=14).mean()
loss = (-delta.where(delta < 0, 0)).ewm(span=14).mean()
rs = gain / loss
df['rsi'] = 100 - (100 / (1 + rs))
# ADXの計算(簡略版)
# ※ 実際はtr/+DM/-DMの計算が必要
latest = df.iloc[-1]
return {
"symbol": symbol,
"close": float(latest['close']),
"ema20": float(latest['ema20']),
"ema50": float(latest['ema50']),
"rsi": float(latest['rsi']),
"ema_cross": "above" if latest['ema20'] > latest['ema50'] else "below"
}
実装時の注意点:LLMテクニカル分析の限界
限界1:チャートパターン認識の信頼性
マルチモーダル(画像解析)は視覚的なパターンを言語化するが、精度は一定しない。同じチャートを複数回送ると異なるパターン名が返ることがある。パターン認識の確認ツールとしては使えるが、シグナルの唯一の根拠にはしない。
限界2:過去のデータ分布への依存
LLMは過去のテキストデータから学習している。「RSI 70超は過熱」という一般論は学習されているが、特定の通貨ペア・市場環境における統計的有意性は検証されていない。LLMの「判断」を数十年分のバックテストデータと同等に扱うのは危険だ。
限界3:レイテンシの問題
API呼び出しに1〜3秒かかる。スキャルピングや高頻度取引には使えない。実用的な時間軸は15分足以上。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら。
実践的なシステムプロンプト設計
API経由で継続使用する場合のシステムプロンプト例:
あなたはFXシステムのテクニカル分析エージェントです。
役割:
- 数値テクニカルデータの統合解釈と環境分類
- チャートパターンの識別と言語化
- 複数時間軸の整合性評価
厳守事項:
- 「確実に上がる/下がる」等の断定表現は使用しない
- 出力は常にJSON形式(パース可能な構造化出力)
- 不確実な場合は "confidence: low" を設定する
- リスク要因を必ず含める
出力スコアの基準:
- bias_score +4以上: 強いロングバイアス
- bias_score +2〜+3: 緩やかなロングバイアス
- bias_score -1〜+1: 中立(取引見送り推奨)
- bias_score -2〜-3: 緩やかなショートバイアス
- bias_score -4以下: 強いショートバイアス
よくある質問(FAQ)
Q: チャート画像を送る場合、どの解像度が最適ですか?
A: Anthropicの公式ガイドでは1080pが「パフォーマンスとコストのバランスが良い」とされている。チャートの場合、インジケータのラベルが読めるサイズ(少なくとも800×600ピクセル以上)を確保することが重要だ。
Q: 複数の通貨ペアを同時分析する場合、コストはどうなりますか?
A: 画像解析は数値テキスト分析より多くのトークンを消費する。20通貨ペア×15分足で1日96回呼び出すと、月間コストは数十〜百ドルの規模になる。コスト削減のため、まずアルゴリズムで「分析不要と判断できるケース」を弾いてからClaudeに送る設計を推奨する。
Q: 日本語プロンプトと英語プロンプト、精度に差はありますか?
A: Claude Opus 4.8は両言語で高精度だが、テクニカル用語(「スクイーズ」「バンドウォーク」等)は英語の方が安定している場合がある。JSONキーは英語にしてコンテンツ部分だけ日本語にするのが実用的なバランス。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら。
免責事項: 本記事はFXテクニカル分析システムの技術情報提供を目的としています。記載の実装例・分析手法はいかなる投資収益も保証しません。FX取引は元本損失リスクを伴い、損益はすべて投資家自身の責任に帰します。
