【MT5実測7年】日経225アノマリー徹底検証 — 月曜は『本物』、でも日付フィルターはエッジの75%が幻だった
📩「月曜って上がる気がする」を、気のせいで終わらせたくなかった
日経のチャートを毎日見てると、ふと思う。
「月曜、なんか上げてる気がする」 「月末はいつも嫌な下げ方する気がする」
その"気がする"を確かめたくて、Exness の MT5 に直接つないで日経225(JP225m)を 7年分・1,806営業日 引っ張り、曜日・時間帯・日付で殴り続けた。
そして最後にもうひとつ、悪魔の囁きも検証した。
「じゃあ、一番上がりやすい日だけ買えば最強やん?」
結論を先に言う。アノマリーは半分本物。でも"日付だけ買う"は、ほぼ全部が幻やった。 これはその全記録や。
⏰ 「どの時間窓をトレードすべきか(PF/Sharpe・スプレッド込み)」は、別ブローカー(XM)で検証した姉妹記事 日経225時間アノマリー、スプレッド片道&XM半減を織り込んだ正しい評価 に凝縮済み。本記事は 曜日・日付の"実態"と、それを手法化する時の"罠" を扱う。
🔧 検証環境
データ : MetaTrader5 (Exness) — JP225m (Japan 225 Index)期間 : 2019-07-11 ~ 2026-06-24(約7年)時間足 : H1(28,868本)→ JSTカレンダー日にリサンプル営業日 : 1,806セッション(月〜金、出来高ゼロ日は除外)タイムゾーンは"実証"で確定させた
時間アノマリーはTZが1時間ズレるだけで結論が全部狂う。なので推測せず裏取りした。
- Exnessサーバー時刻は UTC(GMT+0)固定。ライブtickのepochを実UTCと突き合わせ誤差0秒
- さらに毎年の出来高ピークを見ると、どの年も JST 9時(東京の寄り付き)が最大(2022の弱気相場年だけ米国時間23時が最大=レジームの差で、TZズレではない)
JST = サーバー時刻 + 9時間 で一本化できた。
📅 ① 曜日アノマリー:月曜の「日中」が主役
終値→翌終値(CC)と、寄付→引けの日中(OC)の両方で見た。
| 曜日 | CC平均 | CC勝率 | 日中平均 | 日中勝率 | 日中 t値 |
|---|---|---|---|---|---|
| 月 | +0.149% | 56.8% | +0.217% | 60.4% | 3.16 |
| 火 | +0.012% | 47.9% | +0.009% | 48.8% | 0.14 |
| 水 | +0.162% | 55.5% | +0.165% | 56.6% | 2.50 |
| 木 | +0.035% | 52.9% | +0.041% | 53.4% | 0.56 |
| 金 | +0.012% | 51.5% | +0.014% | 51.8% | 0.20 |
- 月曜は「寄ってから引けまで」が最強(日中+0.217%・勝率60.4%・t=3.16)。週末の米株高や材料を、東京時間が日中かけて織り込む
- 水曜のCCも有意(t=2.46)。週半ばの押し目買い
- 火曜と金曜はほぼフラット。ここに賭ける理由はない
⚠️ ただし「月曜は鉄板」と言い切ってはいけない
t=3.16に踊る前に年別を見る。月曜CC平均:
| 2020 | 2021 | 2022 | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|
| +0.34% | -0.01% | -0.11% | +0.16% | +0.17% | +0.34% |
強気相場の年で効き、2022の弱気相場では負ける。月曜効果というより「上昇トレンド地合いの増幅装置」。外れ値をトリムしても+0.155%・t=2.47で残るが、レジーム依存は刻んでおくべき。
⏰ ② 時間帯アノマリー:9時の寄り付きが収益エンジン
1時間バーの「寄→引」をJST時刻ごとに平均。
| 時刻(JST) | 平均%/h | 累積寄与 | メモ |
|---|---|---|---|
| 9時 | +0.030% | +55.9% | 東京寄り付き。日中益の主エンジン(高ボラ) |
| 22時 | +0.015% | +18.9% | 米国時間入り(t=1.91) |
| 8時 | -0.010% | -11.1% | 寄り直前の調整 |
| 10時 | -0.008% | -9.6% | 寄り後の利確戻し |
| 12-13時 | -0.005% | -12.3% | 昼の中だるみ |
- 9時の寄り付き一本が累積リターンの大半を稼ぐ。寄りのギャップ&初動モメンタム
- 寄り直後(10時)と昼(12-13時)は軟調。米国時間入り(22時)は素直にプラス
🗓️ ③ 日付アノマリー:月末30日という落とし穴
暦日ごとの終値→終値を平均。
- 中旬〜下旬の節目(6-10日、22日、25日=給料日)が強い。給与・年金フローか
- 月末30日が全暦日で最弱。月またぎ持ち越しを嫌う調整
米株の「月替り上昇」は日経では効かない
米国株で有名な**ターン・オブ・マンス(月末数日+月初数日が上がる)**を営業日で切ると:
| 区分 | 平均%/日 |
|---|---|
| 月末-1営業日 | -0.21% |
| 月初+1営業日 | +0.11% |
| 月の中盤 | +0.11% |
日経では「月替りで上がる」どころか月末はむしろ軟調。米株の定番を輸入すると逆を踏む。稼ぎ場は中盤。
😈 ④「で、強い日付だけ買えばええやん」←これが罠だった
ここまで読んで、こう思わへんかった? 俺は思った。
「6日と8日は+0.4%、月末30日は最弱。強い日だけ買って弱い日を避ければ最強やん。」
でも待ってほしい。ランダムな数字でも、31個並べれば必ず『高い日』と『低い日』が生まれる。サイコロを31回振れば、たまたま6が多い目はある。それを「当たりの目」と呼ぶのが日付フィルターの正体かもしれん。
見抜く方法はひとつ。前後半テストや。
- データを**前半(2019-2022)と後半(2022-2026)**に二分
- 前半だけで「ベスト8日/ワースト8日」を選ぶ
- その日付を、**後半(=本番に相当する未知の期間)**で答え合わせ
結果①:前後半の相関は r=0.12(予測力ほぼゼロ)
各点が暦日。日付が本物なら右上がりの直線に乗るはず。現実は雲。前半で最高だった日が後半で平凡、前半最悪の30日が後半ゼロ近辺。「その暦日が過去どうだったか」は、未来を1ミリも予測してない。
結果②:エッジの75%が蒸発、ワースト日すらプラ転
| 前半(選んだ期間) | 後半(本番) | |
|---|---|---|
| ベスト8日 | +0.26% | +0.19% |
| ワースト8日 | -0.25% | +0.06% |
| 差(エッジ) | 0.50% | 0.13% |
- ベスト-ワーストの差は 0.50% → 0.13% へ約75%蒸発
- 前半で最悪だった日が、後半ではプラスに転じた
- 「強い日だけ買う」戦略は、選んだ瞬間にしか存在しない
なぜ:31個のツマミ × 少なすぎるサンプル
7年あっても、ある暦日に当たる営業日はせいぜい60回。60サンプルの平均で「この日は強い」と決めるのは、コイン60回投げて表が多めの面に賭けるのと同じ。次は普通に裏返る。しかも暦日は31個のツマミ。回せば過去にピッタリ合う形は必ず出る。それは法則やなく**過去への整形(カーブフィット)**や。
📏 フィルターは「粗いほど頑健、細かいほど危険」 曜日(5択)より暦日(31択)が、暦日より「特定日付+時間帯」がもっと危ない。ツマミの数だけ、自分を騙す自由度が増える。
📝 まとめ:アノマリーは天気予報、日付フィルターは占い
| 問い | 答え |
|---|---|
| 一番強い曜日は? | 月曜の日中(+0.22%・勝率60%・t=3.16)。次点で水曜CC |
| 月曜は鉄板? | NO。強気相場の増幅装置。2022は負け。地合いフィルタ必須 |
| 一番強い時間は? | 9時の寄り付き(累積+56%)。昼12-13時は中だるみ |
| 強い日付は? | 中盤(6-10日・22日・25日)。月末30日が最弱 |
| 強い日だけ買えば勝てる? | NO。前後半相関0.12、エッジの75%が本番で蒸発 |
- アノマリー自体は実在する(月曜・9時はそこそこ残る)。でも細かい日付ルールに刻んだ瞬間、占いになる
- バックテストで一番怖いのは、負ける手法やない。『過去にだけ完璧に勝つ』手法や
- 対策は前後半テストひとつ。これをやらずに数字に踊るのが、一番高くつく
俺もまんまと「6日と8日…」と皮算用した側の人間や。でも、実弾で溶ける前にデータで気づけてよかった。
あなたが今ニヤニヤしてる「勝てる日付ルール」、本番に出す前に一度だけ前後半で殴ってみてくれ。生き残ったら本物。溶けたら——よかった、気づけた。🍵
🛠️ 前後半テストの再現コード
import pandas as pd# d: 日次データ(index=日付, ret_cc=終値→翌終値%)d['dom'] = d.index.daymid = d.index[len(d)//2]A, B = d[d.index < mid], d[d.index >= mid] # 前半 / 後半
mA = A.groupby('dom')['ret_cc'].mean() # 前半の暦日別平均mB = B.groupby('dom')['ret_cc'].mean() # 後半の暦日別平均print("前後半 相関 r =", mA.corr(mB)) # → 0.12(ほぼ無相関)
best = mA.sort_values(ascending=False).head(8).indexworst = mA.sort_values().head(8).indexprint("後半ベスト8 :", B[B['dom'].isin(best)]['ret_cc'].mean())print("後半ワースト8:", B[B['dom'].isin(worst)]['ret_cc'].mean())データは MT5 から日経225を取得し JSTカレンダー日にリサンプルした7年分。どんなフィルターでもこの数行を通すのが、自分を騙さない一番安い保険になる。
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。