FX自動売買システムのSwingモード(4時間足ベースの中期保有)に加えて、Dayモード(1時間足ベースの日中決済)を運用している。しかしDayモードの初期勝率は30.3%と壊滅的だった。
6つの改善施策(DAY-D1〜D6)を段階的に適用した結果、勝率を37.1%まで引き上げ、4ペアの合計期待値を+726,000円のプラスに転換した。本記事では、最も効果の大きかった「Tier C銘柄除外」と「セッション限定フィルター」について記録する。
Dayモードの特性
SwingモードとDayモードの違い
| 項目 | Swing | Day |
|---|---|---|
| 時間足 | H4(4時間足) | H1(1時間足) |
| 保有期間 | 数日〜数週間 | 数時間(日中に決済) |
| トレード頻度 | 月5〜10回 | 月20〜40回 |
| 勝率目標 | 55〜65% | 45〜55% |
| TP/SL | TP=4.0×ATR, SL=2.0×ATR | TP=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のペアは以下の共通特徴を持っていた。
- スプレッドが相対的に広い: H1足でのトレードでは、スプレッドコストがより大きな影響を及ぼす
- ボラティリティが不安定: Dayトレードに必要な「十分な日中値動き」が安定しない
- バックテストで期待値マイナス: 長期的にマイナスの戦略を走らせる意味はない
除外の効果
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:00 | 09:00〜17:00 | ボラ低め、レンジ傾向 |
| ロンドン | 08:00〜16:00 | 17:00〜01:00 | ボラ最大、トレンド多い |
| ニューヨーク | 13:00〜21:00 | 22: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点だ。
- Tier分類による銘柄選定: バックテスト成績でA/B/Cに分類し、Cを除外。「やめる」が最大の改善
- セッション限定フィルター: ロンドンセッション(08:00〜16:00 UTC)限定で勝率7%向上
- 実コスト反映BT: スプレッド + スリッページを明示的に組み込み、BT精度を向上
勝率30%から37%への改善は派手ではないが、RR比4.0のシステムでは勝率5%の差が月利の正負を分ける。地味な改善の積み重ねが、収益の差を生む。