「ボリバン逆張りは、設定次第で勝てる」
もしあなたが今もそう信じているなら、悪いことは言わない。今すぐこのページを閉じ、FXから足を洗うべきだ。
私はEURUSDの2005年〜2025年の25年分の相場データに対して「1万通り」のパラメータを総当たりで叩きつけた。計算量は数千億回。物理的な限界まで計算し尽くした結果、導き出された結論は一つだ。
ボリンジャーバンド逆張りに、聖杯など1ミリも存在しない。
巷にあふれる「損小利大なら勝てる」「RR1以上なら理論上勝てる」といった薄っぺらな格言は、25年という時間の重みと、統計学という名の審判の前に、無残な瓦礫と化した。
この記事では、私がCPUを焼き尽くして暴いたボリバン逆張りの結果を公開する。
今回行う検証
今回はボリバンの逆張りが本当に勝てるのか?といったテーマで検証していこうと思う。
方法は総当り検証だ。
シンプルに、ボリバンの逆張り条件に当てはまる値動きが出たらエントリーして、指定された利確、損切りpipsでエグジットするというもの。
非常にシンプルだが、最も本質的でヘッジファンドなどでもこういった思想で利益をもたらしている。
『我々はデータの中にあるアノマリー(歪み)を探し、利用するのだ』 ーーJimSimons (Renaissance Technologies創業者)TEDのインタビューより引用
「投資とは科学的なプロセスであり、数千の仮設を厳密なデータ解析によって検証し続けることだ」 —— < Two Sigma > (公式レポート:The Innovation Equation)より引用
まずはよくある設定で検証
今回はどのように検証しているのかを実際に写真で見てもらおう。
以下は無料のバックテストツール、Delverの画面だ。
検証対象

-
銘柄・時間足: EURUSDの15分足
-
スプレッド: 0.7pips
-
スリッページとスワップ: 無効
-
レバレッジ: 25倍
-
リスク管理: 固定ロット(今回は運用の検証ではなく手法の検証であるため)
ボリバンの設定

基本的な2or-2でエントリーする設定。期間はベーシックな20。

こちらもRR1のExit設定だ。
利確と損切りによって成果が変わるだろうという意見もあるだろうが、それは後述する。
検証結果



絶望的な結果となり、破産してしまった。
-
プロフィットファクター 0.21: 投資として成立していない。稼ぐ金額の5倍を失っている計算だ。
-
最大ドローダウン -1044.9%: 口座が10回吹き飛んでもまだ足りない。
-
曜日別パフォーマンス: 火曜日だけで壊滅的な損失(約-21.0)を叩き出しており、特定の曜日や時間帯で救われるレベルの代物ではないことが一目でわかる。
-
連敗記録: 13連敗を記録。ボリバンの「平均回帰」を信じてナンピンなどしようものなら、一瞬で破滅へ導かれるだろう。
散々な結果となったが、これはあくまで一つの検証に過ぎない。
これらだけで結果を全部理解したつもりになるのは早計だ。
もしかしたらカーブフィッティングしているかもしれないのでここで検証したつもりになるのもよくない。
それでは更にじっくり検証してみよう。
Exit条件によるという仮説
先程の検証では両方とも20pipsで固定していたが、その指定が問題だったのではないか?
時間足が短いのだから、もっと利確ラインを短くして勝率を高めたほうがいいのではないか?
それとももっと損小利大にしたほうがプロフィットファクターは上昇するのではないだろうか?
様々な仮説が生まれてくる。
次の項ではそれらの仮説を一斉に検証してみよう。
Pythonでの総当り検証
Delverでも検証して良かったのだが、今回は1万通り以上の検証になるのでPythonで実行してみようと思う。
検証の全容
-
エントリー条件 : ボリンジャーバンドで2、-2σタッチで逆張りエントリー
-
利確(TP): 5〜100pips(1pips刻み)
-
損切(SL): 5〜100pips(1pips刻み)
-
検証期間: 5年(EURUSD M15、2020年から2025年)
-
総トレード数: 数百万回に及ぶシミュレーション
-
etc : スプレッドやリスクについては先程のDelver画面と同条件
この設定であれば、例えば利確を5pipsにして損切りを10pipsにして高勝率を狙うのはどうか?などなど1pips単位で総当り検証をしてみようと思う。
これであればExitでの検証の際のバイアスは消滅する。
検証結果
検証結果は驚くべき結果となった。
期待値
以下は期待値の分布を示したヒストグラムだ。

大部分の期待値がマイナスになっているが、少数、期待値がプラスになっているものがあるので期待できる。

こちらは利確(TP)と損切り(SL)と期待値の関係をヒートマップで表したものだ。
見ての通り、ヒートマップの大部分は死を意味する青から紫に染まっている。
しかし、黄色に輝く期待値がプラスの場所があるではないか。
利確を伸ばし、損切りを適正に配置すれば、ボリンジャーバンド逆張りでも利益が出る——。 膨大な計算の末にようやく見つけた「黄金のエリア」に、私も一瞬、希望を抱いた。
だが、ここで騙されてはいけない。
次は私がエンジニアとして、この『黄金のエリア』が本物かどうか、更に残酷かつ粘着質な2つのテストを課すことにした。
ドローダウンの可視化
ドローダウンは検証において最も重視すべき要素の一つだ。
勝率が高くとも、ドローダウンの呪いによって、何度も損失を生み出したことは私が経験済みだ。
多くのトレーダーにもあるだろう。
しかし、以下のヒートマップを見てほしい

このマップの見方はシンプルだ。
-
黄色いエリア: ドローダウンが極めて大きい「デッドゾーン」
-
青いエリア: ドローダウンが低く抑えられている「安全地帯」
ここでもう一度下記の期待値のヒートマップを見てほしい。

マップの右下、期待値が最も高く輝いていたあの場所に、 ドローダウンが沈静化している「青いスポット」 が点在しているのがわかるだろうか?
「利益(期待値)は最大化され、かつリスク(ドローダウン)は最小化されている」
1万通りの総当り検証という狂気の果てに、ついに私は、数学的に裏付けられた 「真の聖杯」 を掴み取ってしまったのかもしれない。
この組み合わせでトレードをすれば、もはや負けることなど不可能なのではないか? 震える手で、私はこの「黄金の設定」をさらに過酷な25年間の耐久テストへと放り込んだ。
優秀な条件だけで25年分を検証
先程の結果から、ボリンジャーバンドは非常に期待ができるインジケータのように考察することができた。
それでは、本当に私が先程言ったとおり、期待値が高くDDが少ない条件でトレードを行えば必ずプラスになるのか、25年分のデータを用いてトレードしてみた。
優秀な条件の定義
前述のグラフで解説したように、ヒートマップで青色と黄色が重なっているところを抽出しようと思うが、今回は更に正確に定義してみようと思う。
以下は実際に使用した優秀な条件を定義するPythonのプログラミングコードになるが、短く解説する。
取引回数フィルタ
df = df[df["trades"] >= MIN_TRADES_5Y]
こちらは条件が5年で400トレード以上の条件だけを抽出している。
それの理由は、取引数が少なく、たまたま当たっただけのカーブフィッティングを除外することと、期待値の統計的な安定性を担保することだ。
ここで再現性のない個体を除外することになる。
最大DDフィルタ
df = df[df["max_dd"] <= MAX_DD_PIPS_5Y]
これは5年間のトレードで、最大DDが5000pips以下の個体だけを抽出し、資金管理的に破綻する個体を排除している。
例えば、勝率は高くて2008年までプロフィットファクターが1以上の個体だったとしても、2009年以降からDDが深くなりすぎている個体は実務上使いようがないので排除という考え方だ。
DDを取引数で正規化
dd_per_trade = df["max_dd"] / df["trades"]
スプレッドが原因で、取引が多い戦略ほどDDは増えやすい傾向にある。
しかしそれだと頻度の差による不公平が生じるので、今回は**ボリンジャーバンドは勝てるのか?**というテーマに焦点を当てているためこのような措置を施した。
スコア計算
score = 期待値 - 0.30 × (最大DD / 取引数)
このように期待値を主軸とし、スコアで個体を評価することにした。
いわば、DDが大きい戦略は減点し、DDが小さく、同じ期待値なら高評価とし順位付けをしていく。
そしてスコア上位のみを採用した結果がこちらだ。

優秀条件での検証結果
解説するよりもまずは結果のグラフを見てもらおう。

このグラフの見方は、縦軸がPnL(利益と損失)で横軸がエグジット条件だ。
解説するまでもないが、すべてマイナスとなっており全滅である。
しかし、これだけでボリバンが使えないというのは少々ナンセンスである。
考察していこう。
なぜ優秀だった条件がマイナスになるのか?
このグラフはトレードと検証の本質を露呈させているといっても過言ではないだろう。
スプレッドによる損失が累積
5年間では0.7pipsを往復してもそこまでDDに影響しなかったが、25年ともなるとスプレッドの累積による損失は多大なものになるだろう。
15分足という短期間で11pipsに達したら損切りというのだから、エントリー頻度もスキャルピング的なエントリーになっていたことが伺える。
まさにスキャルピングの弱点によって大きな損失をもたらしたのだ。
たまたま勝てていた。
5年間という、一見すると十分な期間に思えるが、それを25年というスパンで見れば一部でしかなかったのだ。
しかし、私はこう考え、仮定することのほうが生産的だと考えている。
それは、ボリンジャーバンドは2020年〜2025年の間で優位性があったと。
これは検証において最大の成果物だろう。
まとめ
今回の検証でわかったことをまとめていこう。
-
ボリンジャーバンドは極限られた条件でのみ機能する
-
ボリンジャーバンド単体でトレードを行うと、長期では期待値がマイナスに収束する
-
スプレッドという取引コストの累積効果が、長期では致命的になる
以上のようなことがわかった。
しかし、重要なのはここからだ。
ボリンジャーバンドは使えないインジケータではない
なぜなら今回の検証において、期待値がプラスの条件を特定期間で発見することができたからだ。
99%が期待値マイナスだったとしても、それだけでボリンジャーバンドを使えないという結論に至るのは短絡的すぎる。
しかし、ボリンジャーバンド単体でトレードをし続けると資金が削られていく構造にあるのは事実だ。
ボリンジャーバンドの優位性があるタイミングを把握する。
今回の記事で最も大切なのはここだ。
すなわち、『検証とはエッジ(優位性)を見つけるためにある』
今回ボリンジャーバンドの優位性があるタイミングを大雑把にだが把握することができた。
これを
- 曜日でフィルタリングする
- 時間足を長くする
- プライスアクションでフィルタリング
- トレンドでフィルタリング
など、数えだしたらキリがないがその優位性を抽出することが検証の本質である。
今回の検証はなにもPythonでないとできないことはない。
完全無料の検証ツールはたくさん存在している。
今回使用した検証ツールのDelverはこういった総当りの検証と相性が素晴らしいが、自分のトレード思想に合致した検証ツールを選ぶのがベストなので、比較して検証することをオススメする。
オープンソース・リサーチ
検証の透明性と再現性を担保するため、今回の膨大なバックテストに使用したPythonスクリプトを公開している。データ処理のロジックから統計計算のプロセスに至るまで、そのすべてをGitHubで確認することが可能だ。