B面#1.ORBを1時間足に移したら、2本の線が引っ越せなかった

FX Bot開発ログ

Abstract

  • 出典: Trading Steady「Is the ORB Strategy Actually Profitable? 6 Month Results
  • やったこと: EURUSD・15分足で使われていたORBの最終形を、USDJPY・1時間足に翻訳して検証
  • 対象: USDJPY(ドル円) / 1h / 結果固定時点の720暦日(2024-07-21〜2026-07-10、判定はニューヨーク時間)
  • 結論: 固定スプレッド控除後でプラス。……でも、薄い。そして数字より、翻訳で2つの道具の働きが変わっていたほうが本題だった。
指標
トレード数 82
勝率 54.9%
固定スプレッド控除後リターン +3.04%(年率にすると 1.5% くらい)
最大ドローダウン(決済ベース) −3.62%
1トレードあたり平均損益 +0.038R

1. Introduction — 深夜に、他人の手法を見ていた

自分の手法が、うまく揃わなかった。

詰まると、他人のやってることを眺めたくなる。人の手法は、気楽だ。決めるところが、もう全部決まってる。深夜のターミナルの横で、動画を流していた。

海外の人が、淡々と数字を出していた。「ORB、半年回してみました」。オープニングレンジ・ブレイクアウト。チャートはEURUSD。ニューヨーク市場が開く最初の15分で高値と安値の箱を作って、そこを抜けたらついていく。抜けた反対側に損切りを置いて、利確はリスクの1.5倍。

半年で70本、勝率44.3%、リターン+6.5%。実現したリワード・リスク比は1.44だった、と動画ではまとめていた。

利確の +1.5R か損切りの −1R だけで全トレードが終わる、と単純化すれば、トントンになる勝率は 1 ÷ (1 + 1.5) = 40.0%。44.3%は、そこから4.3ポイント上にある。

ただし、これは時間切れもコストもない、きれいな二択の線だ。動画の実現値は1.44だし、途中でルールも変わっている。そのまま損益分岐点には使えない。

……それでも、余白は厚くなさそう。
ちょっと条件が変わったら、形も変わるかもしれない。

そして、わたしがやろうとしているのは、条件を変えることだった。この手法はEURUSD・15分足の話。でも、わたしの手元に15分足の長いデータはない。yfinanceから降ってくる15分足は、せいぜい60日ぶん。半年には届かない。

だから、長く取れたUSDJPYの1時間足に置き換えてみる。足も、通貨ペアも変わる。置き換えたら、これはもう、あの人の手法そのものじゃない。わたしの翻訳になる。


2. Method — 翻訳する

2.1 動画のルールを書き取る

まず、動画で確認できたルールを、自分用に写す。

項目 動画で確認できた内容
対象 EURUSD(動画内チャートは OANDA)
足・市場 15分足 / ニューヨーク市場オープン
レンジ定義 9:30の足(最初の15分)の高値と安値
エントリー レンジ外で終値が確定 → 次の足の始値で成行
ストップ レンジの反対側の端
利確 リワード・リスク 1.5 : 1
時間フィルタ 12:00以降はエントリーしない
ATRフィルタ レンジ幅 > 3.0×ATR、または < 1.25×ATR なら見送り
ATRの期間・平滑化 動画では確認できず
保有の終了時刻 動画では確認できず

ATRフィルタは、動画の最初から使われていたわけではない。3か月回したあと、負け方を見て追加されていた。動画の70本と+6.5%は、ATRなしの前半と、ATRありの後半が混ざった6か月の記録だった。

決まって見えた1.25にも、向こう側の三か月があった。

今回は、最後に残った1.25と3.0を、最初の日から全区間に置くことにした。動画の6か月を再現するのではなく、最終形のルールを別の場所へ運んでみる。

2.2 翻訳の決断

書き写して、すぐ手が止まった。「9:30の足」が、USDJPYの1時間足にはない

この1h足は、正時きざみ。9:00、10:00、11:00……。9:30から始まる足は、どこにもない。原文の起点が、宙に浮いてしまう。

いくつか置き換え方を考えて、9:00〜10:00の1時間足の高値・安値をレンジにすることにした。9:30を中に含む正時の箱で、「ニューヨークの寄り」という時刻だけは残す。(東京の9時やロンドンの寄りを選ぶ案もあった。でも、それはさらに別の手法になる。)

もうひとつ、あとで効いてくる決断。損切り幅の基準を、「エントリー価格から、レンジの反対端まで」にした。エントリーは次の足の始値だから、すでにレンジの外。損切り幅は、レンジ幅そのものにはならない。

利確はその損切り幅の1.5倍。12:00以降は建てない。ここまでは動画で確認できた。

一方、16:00 ETで強制的に閉じるのは、わたしが足した条件だ。動画では保有の終了時刻を確認できなかった。ORBを当日中の手法として閉じるために置いたけど、この1本は原文から運んだ線ではない。

2.3 これは、わたしの翻訳

忘れそうだから、先に残す。

ここで確かめてるのは、動画の6か月そのものじゃない。
EURUSD・15分足の最終ルールを、USDJPY・1h足へ移したあとのルール
「9:30の足」は9:00の箱で代えた。終了時刻は16:00に置いた。
数字が何を言っても、それは翻訳を経たあとの数字。

2.4 翻訳の代償 — 入り口が、1日1回になった

1時間足で手順を追い直すと、変なことに気づく。

レンジは9:00〜10:00。その外で終値が確定しうる最初の足は10:00〜11:00で、確定するのは11:00。エントリーはその次、11:00の始値。次のブレイクを確認してから建てる時刻は12:00になって、時間フィルタで消える。

つまり、1日に入れるチャンスは、ちょうど1回。15分足では何度かあったはずの入り口が、1個になった。

これは「1hだと少し粗くなる」だけじゃない。手法の骨格が変わってる

2.5 ATRを、初めてちゃんと見る

書き写したルールの中に、ずっと素通りしてた数字がある。ATRフィルタ、1.25と3.0。

正直、ATRが何なのか、あんまり分かってないまま打ち込んでた。「× 1.25」「× 3.0」。……平均、なんだっけ。

いちど、定義に戻ってみる。ATRが見ていたのは、その足の高値と安値だけじゃなかった。前の終値からできた隙間も拾って、その中でいちばん大きい値幅を残している。それを、今回は14本ぶん、単純に平均した。

動画では、期間も平均の取り方も確認できなかった。

置いてみて、走らせる前に、日ごとのレンジ幅がフィルタを通るか数えてみた。そこで、手が止まる。

下限(1.25倍)で、半分以上の日が消えた。58%。 安全のためのフィルタ、のはずなのに。……半分、以上?

レンジ幅をATRで割った比を、ぜんぶ並べてみる。中央値は1.18。四分の一が0.94、四分の三が1.51。

レンジ幅÷ATRの分布

横軸がレンジ幅÷ATR。山のいちばん厚いところに、1.25の赤い線が立ってる。上限の3.0(点線)は、ずっと右で、ほとんど何も引っかからない。

1.25の線。……端っこじゃない。
分布の、ほとんど真ん中に刺さってる。

「1時間足にしたからだ」と書きかけて、止めた。

動画のEURUSD・15分足でも、「1本」とATRを作る足は同じ長さだ。通貨ペア、時間帯、足の長さ、平均の取り方。まとめて変えすぎて、犯人を一人にできない。

分かってるのは、USDJPY・1h・14本の単純平均では、中央値が1.18で、1.25の下限が58%の日を落としたことまで。

元動画の1.25は、数か月の結果を見て追加された数字だった。それを別の場所へ固定値のまま置いたら、平凡な日を半分捨てるゲートとして働いた。壊れた、と言うより、働きが変わっていた。

2.6 検証の設計(走らせる前に決めたこと)

数字を見てから条件を緩めない。これは、たぶん、ルールより先に必要なルールだった。

項目 設定
データ yfinance / USDJPY / 1h / 720暦日
時刻 ニューヨーク時間。夏時間・冬時間に追随
レンジ 9:00〜10:00。1日で最初に確定したブレイクだけを見る
エントリー ブレイク確定の次の足の始値
終了 損切り / 利確 / 16:00の強制手仕舞い
コスト 固定スプレッドだけを反映。ほかは0として置く
サイズ 1回の初期リスク = 口座の1%
期間分割 720暦日を144日ずつ、5つに分ける
調整 今回の結果を見て数字を変えない

固定スプレッドは、OANDA証券が公表していたUSDJPY 0.3銭〜 の下限を使った。売る側と買う側に半分ずつ。ずっと下限のまま、という置き方だから、現実より静かな相場を仮定している。

今回の数字を見て、1.25や1.5は動かしていない。向こうで選ばれた数字を借り、USDJPY・1時間足への翻訳条件は、走らせる前に固定した。

ひとつ、走らせる前に正直に置いておく。標本が薄い。数えたら、720日で82本。「100を割ったら統計の話は控える」と先に決めていたから、それに引っかかってる。動画の70本と、だいたい同じ厚みしかない。「厚く確かめる」つもりが、そうならなかった。

だから、この先の数字から、手法の良し悪しは言わない。言えるのは「わたしの翻訳では、この窓で、こう出た」まで。


3. Results — 数字、そのあとで気づいたこと

3.1 数字

主版 参考(判定には使わない)
内容 12:00カットあり カット撤廃
トレード数 82 169
勝率 54.9% 52.1%
固定スプレッド控除後リターン +3.04% +6.46%
最大ドローダウン(決済ベース) −3.62% −5.31%
純プラスの区間 3 / 5 3 / 5

判定は通った。全期間+3.04%。5つの区間のうち、3つがプラス。

固定スプレッドを外すと+3.59%。0.56ポイント削られて、それでもプラス側には残った。少なくとも、わたしが置いた0.3銭では死ななかった。ほかのコストは、まだここに入ってない。

勝率54.9%の横に、「40.0%より上」と書きかけた。

消した。

82本のうち、ほとんどは +1.5R でも −1R でも終わっていなかった。同じものさしじゃない。

動画の6か月と、並べておく。

わたしの翻訳(USDJPY / 1h / 720日) 動画の記録(EURUSD / 15分 / 6か月)
トレード数 82 70
勝率 54.9% 44.3%
リターン +3.04%(固定スプレッドのみ控除) +6.5%
ルール 最終形を全期間に固定 途中からATRフィルタを追加

EURUSDとUSDJPY。15分と1時間。途中でルールが増えた6か月と、最初から固定した720日。

並べることはできても、比べることはできない。表にしたら、別物になった輪郭だけが見えた。

3.2 決済理由を、開いてみる

判定は通った。でも、ずっと引っかかってた。1トレードあたりの平均損益が、+0.038R。ほとんどゼロ。プラスなのに、なんでこんなに薄いんだろう。

トレードを、どういう理由で閉じたかで数えてみる。

  • 16:00の強制手仕舞い … 76本
  • 損切り … 5本
  • 利確 … 1本

82本のうち、76本が「時間切れ」で閉じてる。利確まで届いたのは、1本だけ。

決済理由の内訳

ほとんどが16:00の時間切れ。利確(緑)まで届いたのは、82本のうち1本。

なんで届かないんだろう、と手を動かす。損切り幅(エントリーからレンジ反対端まで)の中央値を見たら、52pipsもあった。利確はその1.5倍、だいたい78pips先。損切りは52pips逆行したところ。11:00に建てて16:00に閉じるまで、5時間。1時間足5本ぶん。

だから、大半の日が、どっちの線にも触れないまま16:00を迎える。利確も損切りも、5時間の箱には遠い場所に引いてある。

1トレードの当日足

標本のなかで、損切り幅が中央値くらいの1本を選んだ。エントリー(黒)から利確(緑)まで遠く、価格はレンジ帯と利確線のあいだを漂って、そのまま16:00を迎える。

リワード・リスク1.5の設計が、ほとんど働いていない。これは「ブレイクを11:00に買って、16:00に成行で閉じる」手法に近くなってる。

ATRのときと、おなじだ、と思った。
でも、16:00に閉じる線を足したのは、わたしだった。
1hに持ってきて、5時間の箱に入れた。その中では、届かない場所に線があった。
……時間足だけのせいには、できない。

3.3 時期でも、割れてる

固定した5つの144日区間を、古いほうから見る。区間1〜3はプラス、区間4〜5はマイナス。新しい2区間では弱っている。

固定144日ごとの区間損益

720暦日窓を、開始日から144日ずつ5つに固定分割。緑の区間1〜3はプラス、赤の区間4〜5はマイナス。

「この窓の後半2区間では、この翻訳ルールは負けてた」。それ以上は、82本からは言わない。各区間は10〜22本しかない。


4. Discussion — 線だけを、連れてきてしまった

4.1 条件は、あとから来なかった

1.25は、USDJPY・1hでは58%の日を落とす門になった。1.5の先に置いた利確線は、16:00が来るまでに、ほとんど届かなかった。

1.25も1.5も、ここへ置いたときには、完成した数字に見えた。

ただし、同じ原因とは言えない。ATRでは通貨ペア、足、時間帯、計算方法をまとめて変えた。損切りと利確には、1時間のレンジに加えて、動画で確認できなかった16:00決済が入っている。

法則、とまでは言わない。ひとつの翻訳で、二度、条件の置き忘れを見つけただけ。

4.2 まだ、線の外にあるもの

82本しかない。まだ、手法の良し悪しを言えるほど厚くない。

今回の数字を見てパラメータは変えていない。ただ、借りてきたのは、向こうで三か月の結果を見たあとに残った最終形だった。

コストとして入れたのも、ずっと一定のスプレッドだけ。急に広がる夜も、滑る瞬間も、この中にはいない。ドローダウンも、決済したあとの残高だけを見ている。持っている途中の、まだ名前のついていない痛みまでは数えてない。

だから、+3.04%は答えじゃない。この窓で、この置き方をしたら、少しだけ上に残った。それだけ。

4.3 次は、一つずつ運ぶ

今度は、いっぺんに戻さない。

今回は、部屋を移したうえに、家具の置き場所まで変えて、それで「前と違う」と言っていたみたいだった。

一段戻すたびに、どの働きが戻ってくるのか。

わたしが変えたから届かなくなったのか。場所を離れたから、意味が薄くなったのか。

今度は、急がずに見たい。

「平均」って言葉、ずっと使ってたのに、なんの平均なのか、ちゃんと見たのは今日が初めてだった。

決済理由の表を一緒に眺めてもらって、AIに「これ、時間切ればっかりだね」って言ったら、「そうですね」って静かに返してきた。……そうですね、って。まあ、そうなんだけど。

布団に入ってから、思い出した。人の手法は気楽だ、って思ってたんだった。決めるところが、もう決まってるから、って。

レンジの時刻も、ATRの計算も、16:00の線も、ぜんぶ、わたしが決めてた。

……借りられたの、ルールの形だけだ。いまごろ気づいた。


Appendix — 再現環境

  • 再現コード: GitHub
  • 記事時点CSVの照合: python chapters/season2/ch01_orb_1h_translation/run.py
  • Yahoo Financeからの再実行: python chapters/season2/ch01_orb_1h_translation/run.py --live
  • 図の生成: python chapters/season2/ch01_orb_1h_translation/figures.py
  • 結果生成コード: src/bocchi_the_botter_repro/season2/orb.py
  • 再照合日時: 2026-07-11 23:57:17 UTC
  • Python: 3.13.7 / yfinance 1.3.0 / pandas 3.0.2 / numpy 2.4.4
  • データ: JPY=X 1h / period="max" / auto_adjust=False
  • 取得時に得られた約730暦日から、末尾720暦日を使用(730日は保証された仕様ではなく、この取得時点の観測)
  • 窓(ET): 2024-07-21 19:00:00−04:00 〜 2026-07-10 16:00:00−04:00
  • 実効バー数: 12,084 / ATR評価可能日: 510
  • スプレッド: OANDA証券「スプレッド比較」の2026-04-14取得記録を使用(2026-04-06〜04-10計測、東京サーバー裁量プランMT5、USDJPY 0.3銭〜、配信率96.56%帯の下限)
  • トレード明細: results/reference/ch01_orb_1h_translation/trades_S2-1_ORB_USDJPY_{main,ref}_net.csv
  • 固定144日区間: results/reference/ch01_orb_1h_translation/segments_S2-1_ORB_USDJPY_main_net.csv
  • 元動画: Trading Steady、2025-09-19公開。ルール・チャート・自動字幕を2026-07-11再確認
  • 元OHLCは保存していない。保存済みなのはトレード明細のため、Yahoo側の修正後に完全再現できない可能性がある

検証条件の詳細

  • ATR: max(H−L, |H−前Close|, |L−前Close|) の14本SMA。9:00 ETのレンジ足確定時点で判定
  • シグナル: ET日ごとに最初に確定したブレイクのみ。次足Openで約定
  • 足内判定: 同一1h足でSLとTPの両方に到達した場合はSL優先
  • 強制決済: 16:00 ETの1h足Open
  • コスト: 固定bid-ask全幅0.3銭相当のみ。手数料・スリッページ・スワップ・スプレッド変動は0
  • サイズ: 初期リスク1% / 証拠金率4%。サイズ不足による見送りは0件
  • 休場日: NYSE休場日を除外しない
  • 最大DD: 各取引の決済後残高から算出。保有中の時価評価を含めない

固定144日区間の内訳

区間 期間(開始日を含み、終了日を含まない) 取引数 損益
S1 2024-07-21〜2024-12-12 19 +29,607円
S2 2024-12-12〜2025-05-05 22 +18,419円
S3 2025-05-05〜2025-09-26 18 +12,329円
S4 2025-09-26〜2026-02-17 13 −9,219円
S5 2026-02-17〜2026-07-11 10 −20,770円

取得時点の公開データと記載条件に基づく検証です。データ仕様の変更・欠損・修正などで結果は変わりえます。投資助言ではなく、売買判断はご自身の責任で。