【検証#16】勝率92%でも口座は死ぬ ― マーチンEAを壊した「スワップの非対称」をAI会議とBTで暴いた話¶

この記事の3行まとめ
- 実口座のログを分解したら、買い(ロング)は8戦8勝、スワップはわずか+76円。ところが売り(ショート)は10戦8勝2敗なのに損益-48,911円、うちスワップだけで-24,419円でした。勝率は高いのに、待つだけで課金されるサイドが片方だけ存在していたのです。
- AIとの壁打ちで「出金するだけでは非対称は生まれない。出金した分だけ使える資金を絞って、初めて構造になる」「方向を決め打ちするな、比率で自動判定させろ」という2段の指摘をもらい、仮説を作り直しました。
- 改修版(v8)を24ヶ月バックテストした結果、旧版の-3,391ドルの赤字が+2,875ドルの黒字に転換。強制手仕舞いは24回発動し、全てショート側でした。
この記事の前提
前編(【検証#14】)で報告した1バスケット約-6.3万円の事故を受けての続報です。バックテスト(BT)はデモ環境・過去データを用いた検証であり、将来の成績を保証するものではありません。投資助言でもありません。BTの数値は取引コスト条件を実口座と揃えた比較値である点にご留意ください。
はじめに ― 「続報をお楽しみに」と言った、あの続きです¶
みなさん、こんにちは!FXおもしろラボ管理人です。
前編で、自作マーチンEA(アリゲーター+4段ナンピン)が1回のバスケットで約-6.3万円を溶かした話をしました。現金5万円+ボーナス5万円でスタートし、一時は残高が約11.3万円まで増えたのに、たった1回の負けバスケットで19日分の利益をまとめて失った、という話です。あのときスワップだけで約-1.7万円、損失の約¼を占めていたことも書きました。
記事の最後に、私はこう書きました。「いくら貯まったら出金するのが最適か、データで検証する。続報をお楽しみに」。
今回はその続報です。そして結論から言うと、当初考えていた話とはだいぶ違う場所に着地しました。犯人は「出金のタイミング」ではなく、もっと地味で、もっと根深いところにいました。
第1幕 ― 「出金すれば安全」は数学的に間違っていた¶
前編の事故のあと、私が思いついたのは単純な発想でした。
「10万円ごとに利益を出金して、口座の外に逃がしておけば、もし口座が飛んでも“出金済みの総額 > 投入した元本”になる。つまり負けても勝ち、というリスクの非対称性を作れるのでは?」
これをコードに落とす前に、AI(3つの異なるモデルによる会議形式)に相談してみました。返ってきた指摘は、正直かなり効きました。
「出金するだけでは期待値の数学は何も変わらない。出金した分だけEAが使える資金(リスク予算)を意図的に絞って、初めて非対称性は"構造"になる」
考えてみれば当たり前です。出金しても、残った資金でEAが今までどおりのロット・段数でナンピンを続けるなら、負けるときの負け方は何も変わりません。「外に逃がした金額」と「口座に残ったリスク」を分けて考えないと、非対称は絵に描いた餅でした。
もう一つ、耳の痛い指摘をもらいました。
「コードを書き換える前に、実際の取引履歴で出金パターンを検証せよ」
「思いついたロジックをすぐ実装したくなる」のは私の悪い癖です。言われた通り、まず手を止めて、実口座の取引履歴を洗い直すことにしました。そしてこの「洗い直し」が、今回の本題につながります。
第2幕 ― 実データが暴いた、本当の犯人¶
前編では「スワップが損失の¼」とだけ書きました。ですが、買いと売りを分けて集計していませんでした。今回、4月末〜7月頭の18サイクル分を買い(ロング)と売り(ショート)に分解してみたところ、想像以上にはっきりした非対称が出てきました。
| 方向 | 戦績 | 損益合計 | うちスワップ |
|---|---|---|---|
| 買い(ロング) | 8戦8勝 | +16,602円 | +76円 |
| 売り(ショート) | 10戦8勝2敗 | -48,911円 | -24,419円 |
見ての通り、買い側はスワップがほぼゼロ(+76円)で、勝ち分がほぼそのまま残っています。ところが売り側は、勝率自体は8勝2敗と悪くないのに、スワップだけで-24,419円。損益全体の約半分がスワップで持っていかれていました。
さらに気持ち悪いのが、売り側の勝ったサイクルですら、スワップが利益を食っていたケースがあったことです。ある回では、価格差だけ見れば+1,232円の利益が出ていたのに、そのサイクルのスワップは-1,775円。「勝った」判定になっていたのに、実質は逆ザヤでした。ポジション自体は勝っているのに、待っている時間の金利コストで最終損益はマイナス――これは前編で書いた「気づかない出血(サイレントブリード)」そのものです。
これを見て、言葉にできました。
「ロングで稼ぐ」のではなく、「ロングはタダで待てる。ショートは待つほど課金される」。
マーチンゲールは本質的に「価格が戻ってくるのを待つゲーム」です。待つコストが方向によって非対称なら、その非対称は手法の急所に直撃します。買い方向なら待っていてもほぼノーコスト、売り方向なら待つたびに金利で削られる――だとすれば、同じ「耐える」でも、方向によって耐えていい長さが違うはずです。
反実仮想:もし売り側だけ「3日で打ち切り」していたら¶
ここで一つ、実データを使った思考実験をしてみました。売り側のポジションだけ、保有3日で強制的に打ち切っていたら損益はどう変わっていたか。18サイクル分の日次スワップを按分して概算したところ、
3ヶ月の損益は -32,309円 → +20,871円 に反転という結果になりました。
正直に注記しておくと、この試算は日次スワップの単純な按分による近似値です。実際に3日で打ち切っていた場合、その後の値動きを取り逃していた可能性もあるため、楽観バイアスがかかった推定値だと考えてください。それでも、方向性としては「売り側の保有期間を絞るだけで、損益の符号が変わりうる」ことを示すには十分なインパクトでした。
仮説をもう一段、AIに壊してもらう¶
「じゃあ、売り方向はナンピン段数を減らして、保有期間も短くしよう」――私はそう決め打ちしたくなりました。ですがこれも、もう一度AI会議にかけたところ、こう返ってきました。
「方向を固定でハードコードするな。スワップコスト÷期待利確額の比率で動的に判定せよ。金利情勢が変わって符号が入れ替わっても、自動で慎重サイドが入れ替わる」
これは刺さりました。「今はドル円の売りが不利」というのは、あくまで今の金利情勢の結果であって、恒久的な真理ではありません。「売りは危険」とコードに固定してしまうと、将来金利差が逆転したときに、今度は逆側で同じ事故を起こします。待つコストと期待できるリターンの比率という、方向に依存しない指標で自動判定させる――ここで、当初の「出金」の話から「待つコストの構造化」の話へと、テーマが完全に置き換わりました。
第3幕 ― v8の3つの改修と、バックテストでの答え合わせ¶
以上の議論を踏まえて、EAに3つの改修を入れました(v8)。
graph TD
A["v7: pipsだけで利確判定<br/>スワップは見ていない"] --> B["v8-①: スワップ込みの<br/>ネット基準で利確判定"]
C["v7: ナンピン段数は方向によらず一律4段"] --> D["v8-②: スワップコスト比率が<br/>閾値超のサイドだけ2段に制限<br/>+保有3日で強制手仕舞い"]
E["v7: 出金しても資金枠は変わらず"] --> F["v8-③: 出金額に応じて<br/>使えるリスク予算を自動で縮小"]
style B fill:#e8f5e9,stroke:#43a047,color:#1a1a1a
style D fill:#e8f5e9,stroke:#43a047,color:#1a1a1a
style F fill:#e8f5e9,stroke:#43a047,color:#1a1a1a - 利確判定をスワップ込みのネット基準に。旧版はpipsの差だけで「勝った/負けた」を決めていたため、スワップで利益が実質消えているサイクルでも「勝ち」として決済していました。これを、スワップまで含めた実質損益で判定するように直しました。
- スワップコスト比率ガード。待つコスト(スワップ)÷期待できる利確額の比率が閾値を超えたサイド(現状のドル円なら売り)だけ、ナンピン段数を4段から2段に制限し、保有3日で強制手仕舞いにします。方向を決め打ちせず、比率で自動的にどちらのサイドが「慎重運転」になるかが決まります。
- 出金連動のリスク予算。出金した金額に応じて、EAが使える資金枠そのものを自動で絞ります。会議で指摘された「出金と資金枠を連動させて、初めて非対称性が構造になる」を、そのままロジックに落としました。
24ヶ月バックテストでの答え合わせ¶
同一条件(ドル円、取引コスト条件を揃えたA/B比較)で、旧版(v7)と改修版(v8)を24ヶ月分バックテストしました。
| 指標 | v7(旧版) | v8(改修版) |
|---|---|---|
| 損益合計 | -3,391ドル | +2,875ドル |
| スワップ収支 | -1,297ドル | +214ドル |
| 最悪バスケット | -5,795ドル | -241ドル |
| 最長保有 | 362日(塩漬け) | 保有キャップで打ち切り |
v7では、362日間持ちっぱなしという塩漬けバスケットが存在していました。前編で報告したライブの19日保有事故は、いわばこの362日塩漬けの「小さい版」だったわけです。v8ではスワップ収支が+214ドルとプラスに転換し、損益全体も-3,391ドルの赤字から+2,875ドルの黒字に転換しました。
さらに興味深いのが、保有キャップによる強制手仕舞いです。24ヶ月の検証期間中、24回発火し、その全てが売り(ショート)側でした。ロング側は一度も強制手仕舞いになっていません。「ロングは気楽に、ショートは慎重に」というのは、ルールとしてハードコードしたわけではなく、スワップコスト比率の判定から自然にそう振る舞った結果です。これは第2幕でAIに指摘された「方向を決め打ちするな」を裏付ける結果でもありました。
おまけ:時間足の検証¶
「そもそも1分足でエントリー判定するのが正しいのか」という点も、同条件で1時間足と比較検証しました。結果、1分足のままで問題なしという結論です。総額の損益では1分足が上回り、1回あたりの取引の質(勝率・平均利益)で見ると1時間足がやや上、という棲み分けでした。今回の改修とは独立した論点ですが、あわせて確認しています。
教訓 ― 勝率ではなく「負け方」を設計する¶
今回の一連の検証で、一番強く感じたのはこれです。
勝率92%でも、構造が悪ければ口座は死にます。 買い8勝、売り8勝2敗――全体で見れば十分に高い勝率です。それでも、待つコストの非対称(スワップ)を放置していたら、じわじわと、そして時に一撃で、資産は溶けていきます。
- 待つコストの非対称が、マーチンゲールの生死を分ける。勝率が高いことは、コストの非対称を相殺してくれない
- 「なんとなく売りは危ない気がする」という感覚は、比率という数字に変換して初めてコードに焼き込める
- 失敗は感想文で終わらせず、実データにして仕組みに落とし込む。それが再現性のある学びになる
そしてもう一つ。AIとの壁打ちは、最初に思いついたアイデア(出金すれば安全)をそのまま実装させてくれませんでした。 「その論理は数学的に破綻している」「決め打ちするな、比率で判定しろ」と、2段階で仮説を突き返されたことで、当初とはまったく違う、しかしずっと筋の良い改修にたどり着けました。一人で考えていたら、おそらく「出金ルールを工夫する」方向のまま実装して、根本原因のスワップ非対称には気づかなかったと思います。
それでも、検証は続きます¶
v8はバックテスト上では黒字転換しましたが、過去データでの検証結果が、そのまま将来の成績を保証するわけではありません。実弾(デモ・少額口座を含む)でどう振る舞うかは、また別の話です。
次回は、このv8を実際に動かした結果を報告します。前編と同じ「続報をお楽しみに」の約束、今回も続きます。
※本記事は実運用の記録とバックテスト検証に基づく体験談であり、投資助言ではありません。バックテストはデモ環境・過去データを用いた検証であり、将来の運用成績を保証するものではありません。数値は実際のログ・検証結果をもとに、わかりやすく丸めて記載しています。