ラウンドナンバーだけで勝てる?←AIで検証した結果
結論:ラウンドナンバーだけでは勝てない
AIによる長期検証の結果、ラウンドナンバー(.00/.50)だけでは勝てない。
勝率は 49.45%、プロフィットファクター(PF)は 0.978。
つまり「勝っているようで負けている」典型的な統計結果だ。
しかし、ここに RSI(相対力指数) を組み合わせることで状況が一変。
PFは 1.229 に上昇し、安定して右肩上がりのカーブを描いた。
AIの結論は明確だ。
「ラウンドナンバーは確かに意識されるが、方向の裏づけがなければ勝てない。」
ラウンドナンバーとは
ラウンドナンバー(キリ番)とは、0.00や0.50といったキリのいい価格帯を指す。
例
-
・USDJPY=150.00、150.50、151.00
・EURUSD=1.0900、1.0950、1.1000
このような水準は、トレーダー心理の節目として注文が集中しやすい。
「150円を超えたら買う」「151円にストップを置く」
といった形で、多くのトレーダーが意識する価格帯である。
その結果、ラウンドナンバー付近では
-
・反発(サポート・レジスタンス)
・ブレイク(抜けて加速)
・フェイク(だまし)
が頻発する。
つまり、チャート上の「人間心理の集積点」がラウンドナンバーなのだ。
ラウンドナンバーが人気の理由
ラウンドナンバーがこれほど多くのトレーダーに好まれる理由は、シンプルで信じやすい からだ。
-
・数字がきれいで覚えやすい
・誰が見ても同じ節目
・機関投資家や大口注文も集まりやすい
特にYouTubeやSNSでは、「.00で反発」「.50ブレイクで順張り」といった解説が数多く出回っており、わかりやすさがそのまま信仰につながっている。
また、実際にラウンドナンバー付近で出来高が増えるのも事実。
AIも「相場の意識点としての存在価値」は認めている。
しかし、それが「勝てる根拠」になるかというと別問題だ。
AI検証:00・50ライン+TP/SL固定15pips
使用AI:ChatGPT Pro(統計モジュール搭載)
データ:Axioryヒストリカルデータ(USDJPY/5分足)
ラウンドナンバーだけで勝てるかどうかを検証してください。
条件:
・環境 : MT4
・通貨ペア:USDJPY
・期間:2021年1月〜2025年8月
・時間足:5分足
- datetimeをユニーク化(重複削除)
- 欠損を補うために「全1分足の時系列インデックス」を生成し、足りない部分は直前値で補完
- そこから改めて5分足にリサンプリング
・売買ルール:ラウンドナンバーを使ったロジック
・決済:TP/SL固定
・資金管理:固定ロット
出力内容:
①総トレード数
②勝率
③平均リスクリワード比
④トータル損益
⑤プロフィットファクター(PF)
結果
-
① 総トレード数:11,393
② 勝率:49.45%
③ 平均リスクリワード比:1.00(固定TP/SL)
④ トータル損益:-1,875.0 pips
⑤ プロフィットファクター(PF):0.978
→ 統計的に誤差レベル。
つまり「手数料とスプレッドを考慮すると確実にマイナス」。
再検証:ラウンドナンバー+RSIフィルタ
次に、方向性を補うためにRSIを組み合わせた。
RSIフィルタ
RSI期間:14(5分足)
条件:
RSI > 50 → 上昇優勢(買い圧力が強い) → ロングブレイクのみ許可
RSI < 50 → 下降優勢(売り圧力が強い) → ショートブレイクのみ許可
結果
-
① 総トレード数:7,507
② 勝率:54.94%
③ 平均リスクリワード比:1.00
④ トータル損益:+14,820.0 pips
⑤ プロフィットファクター(PF):1.219
→ 明確に右肩上がりのカーブを形成。
RSIで勢いのある方向だけを取ることで、だましを回避し、トレンドフォロー型の成績に変化した。
ラウンドナンバーだけで勝てない理由
AI解析によると、ラウンドナンバーが単体で機能しない理由は主に3つ。
方向性がランダム
ラウンドナンバーは売買が交錯する「戦場」。
反発かブレイクかは常に50/50であり、期待値はゼロに近い。
短期ノイズに弱い
5分足レベルではスプレッドとノイズで優位性が消える。
反応が早すぎても遅すぎても負けトレードになる。
心理的バイアスが働く
「150.00は意識される」という思い込みが、無意識に逆張りを誘発する。
この集団認知バイアスが、むしろ勝率を下げている。
TradingViewで使えるインジケーター
//@version=5
indicator("Round Number Breakout + RSI Filter (00/50, M5 RSI14)", overlay=true, max_labels_count=500, max_lines_count=500)
// ── 入力
use00 = input.bool(true, "検出: .00 レベル", inline="lv")
use50 = input.bool(true, "検出: .50 レベル", inline="lv")
rsiLen = input.int(14, "RSI期間(5分足)", minval=2)
rsiTf = input.timeframe("5", "RSIの計算足(推奨=5)")
rsiThrHi = input.float(50.0, "RSIロング閾値(超えたら買いのみ)", minval=0, maxval=100, step=0.5)
rsiThrLo = input.float(50.0, "RSIショート閾値(下回ったら売りのみ)", minval=0, maxval=100, step=0.5)
showTPSL = input.bool(true, "TP/SL目安ラインを表示")
tpPips = input.float(20.0, "TP(pips)", minval=1)
slPips = input.float(20.0, "SL(pips)", minval=1)
showLevels= input.bool(false, "直近に触れたRNを水平線で表示")
// ── 価格単位(JPYペアは0.01)
var float pip = syminfo.currency == "JPY" ? 0.01 : 0.0001
// ── RSI(5分足で計算して現在足に前方埋め)
rsi5 = request.security(syminfo.tickerid, rsiTf, ta.rsi(close, rsiLen), lookahead=barmerge.lookahead_on)
// ── このバーの高安から、含まれる .00/.50 レベルをスキャン
low2 = math.floor(low * 2.0)
high2 = math.ceil(high * 2.0)
var bool longSig = false
var bool shortSig = false
var float hitLevel = na
longSig := false
shortSig := false
hitLevel := na
// レベルが.00/.50かどうか
isHalf(x) =>
frac = x - math.floor(x)
math.round(frac * 10.0) == 5
// 対象レベル判定
levelEnabled(x) =>
isHalf(x) ? use50 : use00
// バー内で最初に触れたラウンドナンバーを走査して決定
for n = low2 to high2
level = n / 2.0
if levelEnabled(level) and (low <= level and high >= level)
// RSIフィルタ:上方向は rsi > rsiThrHi、下方向は rsi < rsiThrLo
if level >= open and rsi5 > rsiThrHi and close >= level
longSig := true
hitLevel := level
break
if level < open and rsi5 < rsiThrLo and close <= level
shortSig := true
hitLevel := level
break
// ── シグナル描画
plotshape(longSig, title="RN+RSI Long", style=shape.triangleup, location=location.belowbar, size=size.tiny, text="RN▲", color=color.new(color.teal, 0))
plotshape(shortSig, title="RN+RSI Short", style=shape.triangledown, location=location.abovebar, size=size.tiny, text="RN▼", color=color.new(color.orange, 0))
// ── TP/SL目安ライン(オプション)
var line tpLine = na
var line slLine = na
if showTPSL and not na(hitLevel) and (longSig or shortSig)
line.delete(tpLine)
line.delete(slLine)
if longSig
tpLine := line.new(bar_index, hitLevel + tpPips * pip, bar_index + 1, hitLevel + tpPips * pip, extend=extend.right, color=color.new(color.green, 0))
slLine := line.new(bar_index, hitLevel - slPips * pip, bar_index + 1, hitLevel - slPips * pip, extend=extend.right, color=color.new(color.red, 0))
if shortSig
tpLine := line.new(bar_index, hitLevel - tpPips * pip, bar_index + 1, hitLevel - tpPips * pip, extend=extend.right, color=color.new(color.green, 0))
slLine := line.new(bar_index, hitLevel + slPips * pip, bar_index + 1, hitLevel + slPips * pip, extend=extend.right, color=color.new(color.red, 0))
// ── アラート設定
alertcondition(longSig, title="RN+RSI Long", message="RoundNumber Breakout LONG at {{close}}")
alertcondition(shortSig, title="RN+RSI Short", message="RoundNumber Breakout SHORT at {{close}}")
まとめ
| 手法 | 勝率 | PF | 備考 |
|---|---|---|---|
| ラウンドナンバー単体 (.00/.50) | 49.45% | 0.978 | 手数料負けレベル |
| ラウンドナンバー+RSI | 54.94% | 1.219 | 有意な優位性を確認 |
結論として、ラウンドナンバーだけでは勝てない。
だが、RSIやトレンドフィルタを組み合わせることで「意識される節目」から「狙える節目」へと変わる。
節目を使うな、節目を読め。
AIが導いたラウンドナンバーの真実はそこにあった。
-
特典&ご案内
今回の検証は Axioryのヒストリカルデータを使用しました。
(AXIORY口座を利用しない場合、同じ結果は再現できません)
詳細データや手法はPDFにまとめ、
今だけ【メルマガ登録者限定】で無償配布しています。
さらに、FX手法をAIで作る方法、EA化する方法を公開しています。
▶︎ 無料で今すぐ手に入れる(次回より有償化予定)
※この条件での配布は今回限り。
再配布は一切行いません。