Skip to content
Go back

デイトレードのシグナル改善:セッション限定フィルターで勝率30%→37%に引き上げた

Edit page

FX自動売買システムのSwingモード(4時間足ベースの中期保有)に加えて、Dayモード(1時間足ベースの日中決済)を運用している。しかしDayモードの初期勝率は30.3%と壊滅的だった。

6つの改善施策(DAY-D1〜D6)を段階的に適用した結果、勝率を37.1%まで引き上げ、4ペアの合計期待値を+726,000円のプラスに転換した。本記事では、最も効果の大きかった「Tier C銘柄除外」と「セッション限定フィルター」について記録する。


Dayモードの特性

SwingモードとDayモードの違い

項目SwingDay
時間足H4(4時間足)H1(1時間足)
保有期間数日〜数週間数時間(日中に決済)
トレード頻度月5〜10回月20〜40回
勝率目標55〜65%45〜55%
TP/SLTP=4.0×ATR, SL=2.0×ATRTP=4.0×ATR, SL=1.5×ATR

Dayモードは頻度が高い分、1トレードあたりの期待値が低くても月間収支をプラスにできる。しかし勝率30%ではRR比が4.0以上ないとプラスにならない。


DAY-D2: Tier C銘柄(通貨ペア)の除外

Tier分類とは

8通貨ペアをバックテスト成績に基づいて3つのTier(段階)に分類した。

Tier A(安定的にプラス): EUR_JPY, GBP_JPY
Tier B(条件付きプラス): AUD_JPY, USD_JPY
Tier C(マイナスまたは不安定): CAD_JPY, NZD_JPY, CHF_JPY, EUR_USD, GBP_USD

Tier Cの特徴

Tier Cのペアは以下の共通特徴を持っていた。

  1. スプレッドが相対的に広い: H1足でのトレードでは、スプレッドコストがより大きな影響を及ぼす
  2. ボラティリティが不安定: Dayトレードに必要な「十分な日中値動き」が安定しない
  3. バックテストで期待値マイナス: 長期的にマイナスの戦略を走らせる意味はない

除外の効果

Tier C(5ペア)を除外し、Tier A + B(4ペア)に集中した結果:

Before: 8ペア, 勝率 30.3%, 月間期待値 -120,000円
After:  4ペア, 勝率 34.5%, 月間期待値 +180,000円(Tier Cの損失分がなくなった)

「トレードしない」ことが最大の改善になるケースだ。


DAY-D5: SL/TPの最適化

Swingモードで最適化されたSL/TPをそのままDayモードに使っていたが、保有時間が短いDayモードでは異なるパラメータが最適だった。

グリッドサーチの結果

SL=1.0, TP=2.0 → 勝率 38%, PF 0.95(ほぼブレークイーブン)
SL=1.0, TP=3.0 → 勝率 33%, PF 1.05
SL=1.5, TP=4.0 → 勝率 35%, PF 1.22 ★最適
SL=2.0, TP=4.0 → 勝率 40%, PF 1.10(SLが広すぎて損失額が大きい)

PF(Profit Factor、プロフィットファクター)は「総利益 ÷ 総損失」で、1.0以上で利益が出ている。PF = 1.22は「1万円の損失に対して1.22万円の利益が出る」という意味だ。

SL=1.5×ATR, TP=4.0×ATR が最適と判明し、4ペア合計で+726,000円のプラスを達成した。


DAY-D6: セッション限定フィルター

FXの3大セッション

FX市場は24時間動いているが、時間帯によって値動きの質が大きく異なる。

セッション時間(UTC)時間(JST)特徴
東京00:00〜08:0009:00〜17:00ボラ低め、レンジ傾向
ロンドン08:00〜16:0017:00〜01:00ボラ最大、トレンド多い
ニューヨーク13:00〜21:0022:00〜06:00経済指標で急変

Dayトレードに適したセッション

バックテストの結果、ロンドンセッションでエントリーしたトレードの勝率が最も高かった。

東京セッション:   勝率 28%, PF 0.82 → 除外
ロンドンセッション: 勝率 38%, PF 1.35 → 採用
NYセッション:     勝率 32%, PF 1.05 → 条件付き

東京セッションはボラティリティが低く、H1足のDayトレードでは値動きが不十分でSLに引っかかりやすい。ロンドンセッションはボラが大きく、トレンドが出やすいためトレンドフォロー戦略と相性が良い。

フィルターの実装

def is_valid_session(entry_time_utc: datetime) -> bool:
    """ロンドンセッション中のエントリーのみ許可"""
    hour = entry_time_utc.hour
    # ロンドンセッション: 08:00〜16:00 UTC
    return 8 <= hour < 16

このフィルターの追加だけで勝率が30.3% → 37.1%に改善した。


スリッページ・スプレッドコストの明示的組み込み(NEW-26)

Dayモードの改善と並行して、バックテストに実コストを明示的に組み込む施策も実施した。

バックテストと実運用の乖離

バックテストでは「指値で即座に約定する」前提で計算するが、実際にはスリッページ(注文価格と約定価格のずれ)とスプレッド(売値と買値の差)がコストとして発生する。

# 従来のBT: コスト無視
entry_price = signal_price  # 理想的な価格で約定

# 改善後のBT: 実コストを反映
spread_cost = get_typical_spread(pair, hour)  # 時間帯別のスプレッド
slippage = get_typical_slippage(pair)         # 通貨ペア別のスリッページ
entry_price = signal_price + spread_cost + slippage

Dayトレードは保有時間が短いため、コストの影響がSwingよりも大きい。実コストを反映したバックテストにより、「見かけ上プラスだがコスト込みでマイナス」のペアを特定できた。


学んだこと

1. 「トレードしない」は最強の改善

Tier Cの除外だけで月間期待値が-120,000円 → +180,000円に改善した。ダメなペアでトレードを続けることは、良いペアの利益を食い潰すだけだ。

2. セッションの選択は勝率に直結する

FXは24時間市場だが、「いつでもトレードして良い」わけではない。ロンドンセッション限定という単純なフィルターで勝率7%の改善は、どんな高度な指標追加よりも効果があった。

3. コストを無視したBTは嘘をつく

特にDayトレード(短期保有)では、スプレッドとスリッページの影響が大きい。バックテストに実コストを組み込むことで、「BTでは利益が出るが実運用で損をする」罠を回避できる。


まとめ

デイトレードのシグナル改善で重要なのは以下の3点だ。

  1. Tier分類による銘柄選定: バックテスト成績でA/B/Cに分類し、Cを除外。「やめる」が最大の改善
  2. セッション限定フィルター: ロンドンセッション(08:00〜16:00 UTC)限定で勝率7%向上
  3. 実コスト反映BT: スプレッド + スリッページを明示的に組み込み、BT精度を向上

勝率30%から37%への改善は派手ではないが、RR比4.0のシステムでは勝率5%の差が月利の正負を分ける。地味な改善の積み重ねが、収益の差を生む。


Edit page
Share this post on:

Previous Post
バルクCSV一括ダウンロード:バックフィル4時間を数分に短縮する
Next Post
バックテストを並列化して7日→1日に短縮した話