コンテンツにスキップ

MTF分析(マルチタイムフレーム)

概要

MTF分析(Multi-Timeframe Analysis) は、Geminiとの戦略議論で「すなっちゃん氏の勝率を支える重要な要素」として特定された機能です。

核心理念

「木を見て森を見ず」を防ぐため、上位足のトレンドを必須条件としてエントリー判断に組み込む。


アーキテクチャ

graph TD
    A[日足 Daily] -->|環境認識| B[フィルター]
    C[1時間足 Hourly] -->|セットアップ| D[予兆検知]
    E[5分足 5min] -->|トリガー| F[実行判断]

    B --> G{MTF整合?}
    D --> G
    F --> G

    G -->|Yes| H[エントリー許可]
    G -->|No| I[エントリー拒否]

3つのタイムフレーム

1. 日足(Daily)- 環境認識

役割: 全体方向感の決定

def analyze_daily_trend(bars: List[ChartBar]) -> TrendDirection:
    """
    日足トレンドを判定
    - 20EMA > 50EMA かつ 価格 > 20EMA → STRONG_BULLISH
    - 20EMA < 50EMA かつ 価格 < 20EMA → STRONG_BEARISH
    - それ以外 → NEUTRAL
    """
指標 用途 閾値
20 EMA 短期トレンド 価格との位置関係
50 EMA 中期トレンド 20EMAとのクロス
200 EMA 長期トレンド ゴールデン/デッドクロス

2. 1時間足(Hourly)- セットアップ

役割: 押し目/戻りの判定

def analyze_hourly_setup(bars: List[ChartBar], vwap: float) -> SetupType:
    """
    1時間足でセットアップを判定
    - VWAPからの乖離
    - RSI(14期間)の位置
    - ボリュームプロファイル
    """
指標 用途 閾値
VWAP 平均コスト ±0.5%ブレイク
RSI(14) 過熱感 40-60が健全
出来高 確信度 平均の1.5倍以上

3. 5分足(5min)- トリガー

役割: エントリーポイントの精密決定

def check_5min_trigger(bars: List[ChartBar], key_level: float) -> bool:
    """
    5分足でブレイクアウトを確認
    - 重要ラインのブレイク
    - 2本の足で確定(ダマシ回避)
    - 出来高確認
    """

実装詳細

core/mtf_analyzer.py

@dataclass
class MTFAnalysis:
    """MTF分析結果"""
    daily_trend: TrendDirection      # 日足トレンド
    hourly_setup: SetupType          # 1時間足セットアップ
    trigger_confirmed: bool          # 5分足トリガー確認
    alignment_score: float           # 整合スコア (0.0-1.0)
    recommendation: str              # "ENTRY" / "WAIT" / "SKIP"

class MTFAnalyzer:
    """マルチタイムフレーム分析エンジン"""

    def analyze(self, symbol: str, current_price: float) -> MTFAnalysis:
        # 1. 日足データ取得 & トレンド判定
        daily_bars = self._get_daily_bars(symbol, lookback=50)
        daily_trend = self._analyze_daily_trend(daily_bars)

        # 2. 1時間足データ取得 & セットアップ判定
        hourly_bars = self._get_hourly_bars(symbol, lookback=50)
        hourly_setup = self._analyze_hourly_setup(hourly_bars)

        # 3. 5分足データ取得 & トリガー確認
        intraday_bars = self._get_5min_bars(symbol, lookback=20)
        trigger = self._check_trigger(intraday_bars, current_price)

        # 4. 整合スコア計算
        alignment_score = self._compute_alignment_score(
            daily_trend, hourly_setup, trigger
        )

        return MTFAnalysis(...)

すなっちゃん戦略との統合

Spear戦略でのMTF使用

# run_paper_trading.py での使用例

async def _should_enter_spear(self, symbol: str, flow: OptionFlow) -> bool:
    # MTF分析を実行
    mtf = self.mtf_analyzer.analyze(symbol, current_price)

    # 日足トレンドが不明確な場合はスキップ
    if mtf.daily_trend == TrendDirection.NEUTRAL:
        logger.info(f"[{symbol}] MTFスキップ: 日足トレンド不明確")
        return False

    # 整合スコアが低い場合はスキップ
    if mtf.alignment_score < 0.6:
        logger.info(f"[{symbol}] MTFスキップ: 整合スコア低 ({mtf.alignment_score:.2f})")
        return False

    return True

Beat戦略でのMTF使用

# Beat Shieldは「レンジ相場」を好むため、強トレンド中はスキップ

async def _should_enter_beat(self, symbol: str) -> bool:
    mtf = self.mtf_analyzer.analyze(symbol, current_price)

    # 強トレンド中はBeat戦略をスキップ
    if mtf.daily_trend in [TrendDirection.STRONG_BULLISH, TrendDirection.STRONG_BEARISH]:
        logger.info(f"[{symbol}] Beat スキップ: 強トレンド中")
        return False

    return True

Gemini推奨パラメータ

EMA期間設定

タイムフレーム 短期EMA 中期EMA 長期EMA
日足 20 50 200
1時間足 20 - -
5分足 - - -

Geminiからの提言

「1時間足の20EMA ≒ 日足の約3EMA」という単純換算よりも、各時間枠での参加者の心理を重視すべき。

整合スコア計算

def _compute_alignment_score(
    daily: TrendDirection,
    hourly: SetupType,
    trigger: bool
) -> float:
    """
    MTF整合スコアを計算

    重み配分:
    - 日足トレンド: 50%
    - 1時間足セットアップ: 30%
    - 5分足トリガー: 20%
    """
    score = 0.0

    # 日足(50%)
    if daily in [TrendDirection.STRONG_BULLISH, TrendDirection.STRONG_BEARISH]:
        score += 0.5
    elif daily != TrendDirection.NEUTRAL:
        score += 0.25

    # 1時間足(30%)
    if hourly == SetupType.PULLBACK_TO_SUPPORT:
        score += 0.3
    elif hourly == SetupType.CONSOLIDATION:
        score += 0.15

    # 5分足(20%)
    if trigger:
        score += 0.2

    return score

バックテストでの使用

バックテスト(run_beat_sunacchan_backtest.py)でもMTF分析を使用:

# バックテストサマリーに追加される統計
{
    "mtf_stats": {
        "mtf_aligned": 245,      # MTF整合した日数
        "mtf_rejected": 89,      # MTF拒否した日数
        "alignment_rate": 0.73   # 整合率
    }
}

ログ出力例

[AAPL] MTF分析:
  日足: STRONG_BULLISH (20EMA > 50EMA, 価格 > 20EMA)
  1時間足: PULLBACK_TO_SUPPORT (VWAPに接近中)
  5分足: TRIGGER_CONFIRMED (直近高値ブレイク)
  整合スコア: 0.85
  推奨: ENTRY

関連ファイル

ファイル 役割
core/mtf_analyzer.py MTF分析エンジン
core/momentum.py EMA/VWAP計算
scripts/run_paper_trading.py ペーパートレード統合
scripts/run_beat_sunacchan_backtest.py バックテスト統合

更新履歴

日付 変更内容
2025-11-29 Gemini分析に基づき実装・統合