Web Lukes
📄

『黄金のスキャルピングFX』EMA13手法を13年分バックテスト検証→ランダムより勝率低い

公開日: 2025/12/29

話題の本を検証してみた

「黄金のスキャルピングFX」という本がある。

EMA13とEMA100を使った押し目買い・戻り売り。シンプルで美しいロジック。

本を読んで「これは検証してみる価値がある」と思った。

結果はどうだったのか?13年分のデータで検証した。

※本記事は書籍に記載された手法を客観的にバックテスト検証したものです。投資判断は自己責任でお願いします。


検証した手法の条件

本に書いてある通りに実装した。

エントリー条件

買いエントリー:

  1. EMA100が右肩上がり(上昇トレンド)
  2. 価格がEMA13にタッチ(上から下に接近)
  3. でも終値はEMA13の上で確定

売りエントリー:

  1. EMA100が右肩下がり(下降トレンド)
  2. 価格がEMA13にタッチ(下から上に接近)
  3. でも終値はEMA13の下で確定

決済条件

項目設定値
TP(利確)10pips
SL(損切)10pips
RR比1:1

フィルター

本に書いてあるフィルターも全部入れた:

  1. 時間フィルター: JST 8:00〜24:00のみ(深夜は避ける)
  2. ラウンドナンバーフィルター: 50pips単位(150.00、150.50など)の±5pips圏内は避ける

その他条件

項目設定値
通貨ペアUSDJPY
時間足1分足
スプレッド0.2pips(往復で0.2pips)
検証期間2012年1月〜2025年5月

13年分、約500万本のローソク足で検証。


結果:-10,180pips

指標結果
総トレード数36,358回
勝ち17,670回
負け18,688回
勝率48.6%
合計pips-10,180pips
平均pips-0.28pips

13年間で1万pips以上の損失。

0.1ロット(1万通貨)で回してたら約-1,000万円。


勝敗分布:RR 1:1の残酷な現実

RR 1:1(TP10pips / SL10pips)での勝敗:

結果回数割合
勝ち(+10pips)17,670回48.6%
負け(-10pips)18,688回51.4%

勝ち vs 負け = 17,670 vs 18,688

負けが1,018回多い。

Code
損益 = (17,670 × 10) - (18,688 × 10)
= 176,700 - 186,880
= -10,180pips

RR 1:1では、勝率50%でトントン。48.6%では確実に負ける。


買い vs 売り

方向トレード数勝率合計pips
買い18,086回49.0%-3,640pips
売り18,272回48.2%-6,540pips

両方マイナス。売りのほうがひどい。


衝撃の事実:ランダムエントリーのほうが勝率が高い

EMA13手法に優位性があるのか?

ランダムにエントリーした場合と比較してみた。

ランダムエントリー検証(5万回サンプル)

すべての終値からランダムにエントリーして、TP10pips/SL10pipsでどちらに先に到達するか検証。

エントリー方法勝率
ランダム(買い)51.05%
ランダム(売り)49.05%
ランダム(合計)50.05%
EMA13手法48.6%

驚きの結論

ランダムにエントリーしたほうが勝率が高い!

  • ランダム: 50.05%
  • EMA13手法: 48.6%
  • 差: -1.45%

EMA13手法は、エントリータイミングを「悪化」させている。

何もしないでランダムに入ったほうがマシ。


なぜ負けるのか?数学的に解説

RR 1:1の損益分岐点

TP10pips、SL10pipsのRR 1:1の場合:

Code
損益分岐勝率 = 50%(スプレッドがエントリー価格に織り込み済みの場合)

実際の勝率は48.6%。1.4%足りない。

ランダムより悪い理由

買いの場合、ランダムエントリーでは**51.05%**勝てる(USDJPYは長期的に上昇傾向)。

でもEMA13手法の買いは49.0%。

「EMA13タッチ」という条件が、むしろ不利なタイミングを選んでしまっている。

期待値計算

Code
期待値 = (勝率 × TP) - (敗率 × SL)
= (0.486 × 10) - (0.514 × 10)
= 4.86 - 5.14
= -0.28pips/トレード

1回トレードするごとに0.28pips失う。

36,358回 × -0.28pips = -10,180pips

計算通り。


時間帯別勝率

時間(JST)勝率
8時48%
9時47%
10時48%
11時49%
......
22時51%
23時49%

22時だけギリギリ51%。他は全部50%未満。

「時間帯を絞れば勝てる」という希望もない。


累積損益グラフ

開始直後から一直線に下落。

  • 5,000トレード時点:-1,500pips
  • 10,000トレード時点:-3,000pips
  • 20,000トレード時点:-6,000pips
  • 36,000トレード時点:-10,000pips以上

一度もプラス圏に浮上することなく沈み続けた。


なぜこの手法は機能しないのか

問題1:EMA13タッチは頻繁すぎる

1分足でEMA13へのタッチはめちゃくちゃ頻繁に起きる。

ノイズだらけの1分足で「タッチしたから押し目」は無理がある。

問題2:EMA100の傾きだけではトレンド判定が弱い

EMA100が「右肩上がり」かどうかを5本前との差で判定。

レンジ相場でも微妙に上向きならエントリーしてしまう。

問題3:RR 1:1では優位性が必要

TP=SL=10pipsの1:1では、50%以上の勝率がないと負ける。

この手法にはその優位性がない。

問題4:1分足のノイズ

1分足はノイズの塊。

テクニカル分析が機能しにくい時間足で、シンプルなEMAクロス系は厳しい。


検証に使用したPythonコード

完全公開。誰でも再現検証できる。

Python
# -*- coding: utf-8 -*-
"""
黄金のスキャルピングFX - EMA13パターン検証
1分足 USDJPY / EMA13 + EMA100 / TP10pips SL10pips
フィルター: JST 8:00-24:00 / ラウンドナンバー±5pips避ける
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
def load_m1_data(symbol='USDJPY'):
"""1分足データを読み込む"""
path = f'C:/Users/yourpath/fx_data/{symbol}_M1.csv'
if not os.path.exists(path):
print(f"データファイルが見つかりません: {path}")
return None
# MT4/MT5形式: 日付 時刻,Open,High,Low,Close,Volume
df = pd.read_csv(path, header=None,
names=['datetime', 'open', 'high', 'low', 'close', 'volume'])
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y.%m.%d %H:%M')
df = df.set_index('datetime')
return df[['open', 'high', 'low', 'close']].copy()
def calculate_ema(df, period):
"""EMAを計算"""
return df['close'].ewm(span=period, adjust=False).mean()
def is_round_number_zone(price, zone_pips=5):
"""ラウンドナンバー±zone_pips内かどうか判定"""
# USDJPYの場合、50pips単位がラウンドナンバー(150.00、150.50など)
round_price = round(price * 2) / 2
distance_pips = abs(price - round_price) * 100
return distance_pips <= zone_pips
def backtest_golden_scalping(df, tp_pips=10, sl_pips=10, spread_pips=0.2):
"""黄金のスキャルピングEMA13パターンのバックテスト"""
# EMA計算
df['ema13'] = calculate_ema(df, 13)
df['ema100'] = calculate_ema(df, 100)
df['ema100_slope'] = df['ema100'].diff(5) # 5本前との差でトレンド判定
# JST時間を計算(UTCから+9時間)
df['hour_jst'] = (df.index.hour + 9) % 24
trades = []
position = None
for i in range(101, len(df) - 100):
current = df.iloc[i]
prev = df.iloc[i-1]
# 時間フィルター: JST 8:00-24:00のみ
if current['hour_jst'] < 8:
continue
# ラウンドナンバーフィルター
if is_round_number_zone(current['close'], 5):
continue
# ポジションなしの場合、エントリー判定
if position is None:
# 買いエントリー条件
if (current['ema100_slope'] > 0 and # EMA100上向き
prev['close'] > prev['ema13'] and # 前回は上
current['low'] <= current['ema13'] and # 今回タッチ
current['close'] > current['ema13']): # でも終値は上
entry_price = current['close'] + spread_pips / 100
position = {
'type': 'BUY',
'entry_time': df.index[i],
'entry_price': entry_price,
'tp': entry_price + tp_pips / 100,
'sl': entry_price - sl_pips / 100
}
# 売りエントリー条件
elif (current['ema100_slope'] < 0 and # EMA100下向き
prev['close'] < prev['ema13'] and # 前回は下
current['high'] >= current['ema13'] and # 今回タッチ
current['close'] < current['ema13']): # でも終値は下
entry_price = current['close'] - spread_pips / 100
position = {
'type': 'SELL',
'entry_time': df.index[i],
'entry_price': entry_price,
'tp': entry_price - tp_pips / 100,
'sl': entry_price + sl_pips / 100
}
# ポジションありの場合、決済判定
else:
if position['type'] == 'BUY':
if current['high'] >= position['tp']:
position['exit_time'] = df.index[i]
position['pips'] = tp_pips
position['result'] = 'WIN'
trades.append(position)
position = None
elif current['low'] <= position['sl']:
position['exit_time'] = df.index[i]
position['pips'] = -sl_pips
position['result'] = 'LOSE'
trades.append(position)
position = None
else: # SELL
if current['low'] <= position['tp']:
position['exit_time'] = df.index[i]
position['pips'] = tp_pips
position['result'] = 'WIN'
trades.append(position)
position = None
elif current['high'] >= position['sl']:
position['exit_time'] = df.index[i]
position['pips'] = -sl_pips
position['result'] = 'LOSE'
trades.append(position)
position = None
return pd.DataFrame(trades)
def main():
# データ読み込み
df = load_m1_data('USDJPY')
if df is None:
return
print(f"データ期間: {df.index[0]} 〜 {df.index[-1]}")
print(f"データ件数: {len(df):,}件")
# バックテスト実行
trades_df = backtest_golden_scalping(df, tp_pips=10, sl_pips=10, spread_pips=0.2)
# 結果表示
total = len(trades_df)
wins = len(trades_df[trades_df['result'] == 'WIN'])
losses = len(trades_df[trades_df['result'] == 'LOSE'])
print(f"総トレード数: {total}")
print(f"勝ち: {wins} / 負け: {losses}")
print(f"勝率: {wins/total*100:.1f}%")
print(f"合計pips: {trades_df['pips'].sum():.1f}")
if __name__ == '__main__':
main()

データの準備

MT4/MT5から1分足データをCSV形式でエクスポートして使用。

Code
2012.01.03 07:00,76.886,76.886,76.885,76.886,3
2012.01.03 07:01,76.885,76.886,76.885,76.886,2
...

検証から学べること

重要な注意点

  • 本の手法が「間違っている」わけではない
  • 特定の相場環境では機能した可能性がある
  • 著者の意図した使い方と異なる可能性もある
  • バックテストと裁量トレードは別物

学んだこと

  1. 本や商材の手法は必ずバックテストしろ
  2. 「シンプルで美しいロジック」=「勝てる」ではない
  3. RR 1:1なら勝率50%以上必要
  4. 1分足スキャルピングは超高難度

まとめ

項目結果
検証期間2012年〜2025年(13年間)
総トレード数36,358回
勝率48.6%
合計損益-10,180pips

検証結果の解釈

機械的にルール通り実行した場合、この手法は長期的にマイナスになる。

ただし:

  • 裁量判断を加えれば結果は変わる可能性がある
  • 特定の相場環境に絞れば機能するかもしれない
  • 著者の意図した「使いどころ」がある可能性

本記事の目的

この検証は手法を批判するためではなく、客観的なデータを提供するために行った。

投資判断は各自の責任で。


教訓

「本に書いてある=勝てる」ではない。 必ず自分でバックテストしろ。

次に気になる手法があったら、まず検証。

それが本当の黄金ルールだ。


関連記事

🎁おすすめツール・サービス

FX自動売買VPSなら50%OFF

キャンペーンで月1,790円〜。MT4/MT5プリインストール済み、自動復旧機能付き。14日間無料お試し。

シンクラウドデスクトップ for FX
ゴトー日EAを探しているならソースコード付

4年で資金4.7倍のバックテスト実績。ソースコード付きで自由にカスタマイズ可能。

ゴトー日EA Ultimate版(3,980円)

※上記リンクにはプロモーション(広告)が含まれています

🔮
MEMBERSHIP

量子相場謀略|ホソノP

ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。

✓EAソースコード公開
✓バックテスト生データ共有
✓リアルタイム相場分析
✓メンバー限定記事
メンバーシップに参加する※ noteアカウントで簡単登録

📚あわせて読みたい

📄

GBPJPYおやすみ戦略×プロップファーム|ゴトー日ロングで+2,897pips!効率6倍の秘密

GBPJPYおやすみ戦略をプロップファーム(Fintokei等)で使えるか検証。ゴトー日のみロングなら勝率60%・平均+10.2pips!非ゴトー日の6倍効率で圧倒的パフォーマンス。

バックテスト検証2025/12/28
📄

ゴトー日EA×プロップファーム|00:00-09:55で+1,411pips!正しい時間帯が超重要

プロップファームでゴトー日EAは使えるのか?正しい時間帯(JST 00:00-09:55)で検証したら+1,411pips!さらに仲値後ショート(09:55-10:25)も+622pips。6年分データの真実。

バックテスト検証2025/12/28
📄

指標トレード×プロップファーム|スプレッド20pipsでも勝てる?CPI5分後エントリーの真実

Fintokeiはスプレッドが「あり得ないくらい拡大する」との噂。CPI発表5分後エントリーなら、スプレッド20pipsでも+86pips!プロップファームで指標トレードは使えるのか徹底検証。

バックテスト検証2025/12/28
📄

4万円の高額商材「スプレッドボリンジャー」を無料で検証してみた結果

パンローリングで41,800円で販売されている「スプレッドボリンジャー」手法を、過去6年分のデータで徹底検証。相関ペアのσ差を利用したキャッチアップ戦略は本当に機能するのか?

バックテスト検証2025/12/28
📄

突発ブレイクアウト×デモ口座=聖杯?|指標なしブレイクが+1,629pipsの真実

指標発表のない時間帯の突発ブレイクアウトは、デモ口座では聖杯になり得るのか?スリッページなし・スプレッド安定のデモ環境で+1,629pipsを記録した戦略の全貌と、プロップファームでの落とし穴を解説。

バックテスト検証2025/12/28
📄

😤「ピラミッティングで爆益!」は本当か?60日ブレイクアウトで徹底検証した結果...

60日高値安値ブレイクアウトで単ポジションとピラミッティングを比較検証。「積みながら建値ガードで安心!トレンド乗れれば爆益!」という夢は実現するのか?7年分のデータで検証した衝撃の結果をお届けします。

trading2025/12/20