Bot CEX 開発ログ

🛠️開発記録#465(2026/2/24)「エッジは方向にあらず?7日間の否定と、+3bpsの誘惑」

7日間分のデータで、徹底的に否定しました。

秒スケールの continuation、exhaustion、高時間軸への拡張。
どれも OOS では一貫してマイナス。
閾値をいじっても、フィルタを足しても、時間軸を変えても、持続的な正の期待値は確認できませんでした。

「方向を当てる」という前提そのものが、この市場では無理筋なのかもしれない。

そう考えて執行構造に目を向け、maker前提の検証に切り替えたところ、はじめて符号が変わりました。
楽観条件では +3.18bps、PF 1.66。
しかし、fill率を現実寄りに落とすと +0.98bps へと急減し、さらに厳しくすれば成立しない。

これは希望なのか、それとも幻想なのか。

本記事では、7日間分のRawデータで否定し続けた過程と、+3bpsという「誘惑」の正体、そして最終的にどのような判断に至ったのかを整理します。
エッジは本当に方向にあるのか。それとも、構造にあるのか。

ここから一段、視座を上げます。

1. 今日の目的

今日の目的は、とてもシンプルでした。

「本当にこの戦略にエッジがあるのか」を、感情抜きで確かめることです。

ここ数日、秒スケールの方向当て戦略を検証し続けてきました。
continuation、exhaustion、時間軸拡張――いずれもOOSでは非正の期待値。
「もう少し条件を調整すれば良くなるのではないか」という誘惑もありましたが、それは後出し最適化の入り口です。

そこで今日は、発想をひとつ切り替えました。

方向を当てるのではなく、執行構造を利用する。
taker前提ではなく、maker前提で検証する。

もし符号が変わるなら、そこに構造的なヒントがある。
もし変わらないなら、この土俵は一旦降りる。

どちらの結論になっても、意味があります。
勝てると確信できるなら前に進む。
脆いと分かれば、潔く凍結する。

今日は、その「最後の確認」をする日でした。

仮説を守るためではなく、仮説を壊すために検証する。
その姿勢を崩さないことが、今日の一番の目的でした。


2. ここまでの否定ログ

今回いきなり maker に飛んだわけではありません。

その前に、かなり丁寧に「方向当て」を検証してきました。そして、ひとつずつ否定してきました。

まずは秒スケールの continuation。
強いフローは続く、という仮説です。しかし OOS では一貫して非正の期待値。閾値を調整しても、特徴量を追加しても、持続的な優位性は確認できませんでした。

次に exhaustion(反転)です。
フローが行き過ぎた後の戻りを取る発想に切り替えました。しかしこちらも平均はマイナス。符号は変わりませんでした。

エントリーを遅らせる検証も行いました。
「入るタイミングが悪いだけなのでは?」という疑問に対するテストです。しかし +1秒、+2秒と遅延させても、期待値は正に転じませんでした。

崩壊日を除外するフィルタも試しました。
特定レジームで殺されているだけなら、そこを除けば改善するはずです。しかし、単純なフィルタでは救えませんでした。

さらに時間軸を5分・15分へと拡張しました。
「秒スケが厳しいなら、競争の弱い時間軸へ」と考えたからです。しかし、方向当てという思想のままでは、こちらも非正EVのままでした。

つまりここまでのログは、ほぼすべて「否定」です。

・秒スケ continuation → 非正
・反転系 exhaustion → 非正
・エントリー遅延 → 改善せず
・崩壊日フィルタ → 効果限定
・高時間軸方向当て → 非正

一つひとつは小さな失敗に見えるかもしれません。しかし、まとめて見ると意味があります。

それは、「方向を当てる」という前提そのものが、この市場・この執行条件では厳しい可能性が高い、ということです。

ここまで否定できたからこそ、次に進める。
この否定ログは、後退ではなく、探索空間を削る作業でした。

そして、その延長線上に「maker」という選択肢が出てきます。


3. Maker Phase3 の結果

方向当てを一旦横に置き、執行構造に着目して行ったのが Maker Phase3 の検証です。

今回は regime_switch に戦略を絞り、5分足での maker 前提執行を中心に、fill率劣化やキュー近似を織り込んだうえで、どこまで期待値が残るのかを確認しました。

まず、もっとも楽観的な条件です。

  • maker_entry_maker_exit
  • fill_keep=1.0
  • maker_fee_bps=-0.10
  • trade_count = 156
  • mean_bps = +3.1899bps
  • PF = 1.6635

ここで初めて、明確な正の期待値が確認できました。
秒スケや高時間軸の方向当てでは一度も見られなかった符号反転です。

しかし、ここからが本番でした。

fill率を現実寄りに落とした fill_keep=0.5 の場合、

  • maker_entry_taker_exit
  • trade_count = 103
  • mean_bps = +0.9830bps
  • PF = 1.2054

確かに正ではありますが、優位性は急速に薄くなります。
さらに厳しめの fill_keep=0.3 では、trade_count>=100 を満たす robust 条件の候補は存在しませんでした。

加えて、queue近似を強化するため queue_min_ratio を 1.2 / 1.5 / 2.0 と引き上げても、fill劣化帯では差分はほぼゼロでした。
delta_mean_bps = 0.0delta_trade_count = 0
つまり、queue比率を上げるだけでは堅牢性は改善しなかった、ということです。

ここから見えるのは、単純な二択ではありません。

  • maker前提で「構造的にプラスが出る可能性」は確かにある。
  • しかし、fill率を現実側に寄せると、その優位性は急速に薄くなる。
  • queueパラメータを少し触る程度では、劣化を食い止められない。

言い換えると、これは「幻想」ではないが、「堅牢」でもない状態です。

+3bpsという数字は確かに魅力的です。
しかし、それは理想条件に近い世界での上限値に過ぎません。

ここで大事なのは、「正になった」という事実に飛びつくのではなく、
その優位性がどの前提に依存しているのかを冷静に切り分けることでした。

Maker Phase3 の結論はこうです。

maker戦略には探索継続の価値はある。
しかし、現時点で採用できるほどの堅牢性はまだ確認できていない。

希望はある。
ただし、まだ証明はできていない。

だからこそ、この戦略は「主線」ではなく、「保留」の位置に置くことにしました。


4. queue_min_ratio 強化の結果

Maker Phase3 で正の期待値が確認できたとはいえ、その前提は「touch で約定する」という比較的楽観的なモデルでした。

実運用を考えるなら、板の順番待ち(キュー)を無視するわけにはいきません。そこで、queue_min_ratio を強化し、より厳しい未約定判定を入れた場合でも優位性が残るのかを検証しました。

具体的には、queue_min_ratio = 1.0 を基準に、

  • 1.2
  • 1.5
  • 2.0

まで段階的に引き上げてスイープしました。

期待したのは、こういう動きです。

  • 約定条件を厳しくする
  • 取引回数は減る
  • その代わり mean_bps や PF が改善する

つまり、「質を上げれば生き残る」パターンです。

しかし、結果は違いました。

fill劣化帯(fill_keep=0.5 および 0.3)では、

  • delta_mean_bps = 0.0
  • delta_trade_count = 0

と、事実上変化がありませんでした。

特に fill_keep=0.3 では、引き続き trade_count >= 100 の robust 条件を満たす候補は存在せず、母数不足の状態が続いています。

差分が出たのは、楽観条件(fill_keep=1.0)の一部のみで、改善幅は +0.166〜+0.168bps と小さなものでした。堅牢性が劇的に向上したとは言えません。

ここから読み取れるのは、

  • queue_min_ratio を上げるだけでは、fill劣化時の脆さは解消しない
  • 問題は「比率の閾値」ではなく、約定モデルそのものにある可能性が高い

ということです。

つまり今回の強化は、「救済」ではありませんでした。

しかし、これは無駄な試行ではありません。

むしろ重要なのは、

“どのレバーが効かないか” が分かったこと

です。

キュー比率をいじれば堅牢になる、という淡い期待はここで否定されました。
これにより、次に検討すべきは queue_min_ratio の微調整ではなく、約定ロジックそのものの再設計か、あるいは土俵の再選択である、という方向が明確になりました。

改善しなかったこと自体が、意味のある結果でした。

そしてこの段階で、maker戦略を主線に据えるのではなく、「探索継続枠」に置くという判断へとつながります。


5. 今日の結論

今日の結論は、極端なものではありません。

「makerは成功した」とも言えませんし、「完全に失敗した」とも言えません。

正確に言えば、

maker戦略には“可能性”はあるが、現時点で“採用できるほどの確実性”はない

という結論です。

楽観条件では +3bps 台の期待値が確認できました。
しかし fill率を現実寄りに落とすと +1bps 未満まで縮小し、さらに厳しい条件では成立しなくなります。

queue_min_ratio を強化しても、fill劣化帯の堅牢性は改善しませんでした。

これはつまり、

  • 構造的な正の余地はある
  • しかしそれは前提に強く依存している
  • まだ再現性が十分とは言えない

という状態です。

だから今日は、ひとつ決めました。

maker戦略は主線からは外す。
ただし、完全には捨てない。

データを積み上げながら、30日到達時点で再判定する。
それまでは「探索継続枠」として静かに走らせる。

同時に、次の土俵――価格差系――へと軸足を移す。

ここまで否定を重ねてきましたが、それは後退ではありません。

方向当てが厳しいこと。
キュー比率では救えないこと。
fill劣化がどれほど影響するか。

それらが明確になりました。

今日は、「勝てる」とは言えませんでした。
しかし、「何がまだ確からしくないか」ははっきりしました。

それで十分です。

ここで無理に前に進まず、一度止めます。
今日はここまで。

そして明日から、次の土俵で検証を始めます。


6. 技術的収穫

今回の検証は、戦略としては採用に至りませんでした。
しかし、技術的な収穫は小さくありません。

まずひとつ目は、検証基盤の強化です。

maker前提の検証器を新たに実装し、

  • --strategies による戦略絞り込み
  • --maker-fee-bps-list によるリベート感度一括検証
  • fill_keep_ratio 別の耐性評価
  • queue_modelqueue_min_ratio の導入
  • maker_exit_unfilled_mode=skip による未約定厳格化

といった、現実寄りの執行モデルを一通り組み込みました。

これは単に「makerを試した」という話ではありません。
執行条件がどれだけ期待値を左右するのかを、定量的に追える状態になったということです。

二つ目は、感度分析の自動化です。

  • fill率 1.0 / 0.5 / 0.3 のスイープ
  • maker_fee_bps のスイープ
  • queue_min_ratio の段階的強化

これらを一括で回せる仕組みを整えたことで、「なんとなく改善した気がする」ではなく、「どのレバーが効かないのか」を明確に切り分けられるようになりました。

今回の検証では、

  • queue比率を上げても fill劣化帯では差分ゼロ
  • リベートを変えても構造自体は大きく変わらない
  • 約定前提が崩れると急速に脆くなる

といった事実が、曖昧さなく確認できました。

三つ目は、データ収集基盤の拡張です。

PRODUCT_CODE 別に collector を並列起動できるようにし、
単一市場に閉じないデータ取得体制を整えました。

これは次の土俵――価格差系――へ移るための土台です。

戦略そのものはまだ確定していません。
しかし、検証器と収集基盤は確実に進化しています。

エッジ探索において、戦略は消えることがあります。
しかし、基盤は消えません。

今日の一番の技術的収穫は、

仮説を否定できる検証器を持てたこと

そして、

次の仮説をすぐに試せる基盤を整えたこと

でした。

戦略は保留でも、基盤は前進しています。

それだけでも、十分な成果です。


7. 次の土俵

ここまでの検証で、ひとつはっきりしたことがあります。

単一市場における「方向当て」は、少なくとも現在の執行前提では優位性を見出せませんでした。
maker前提で構造的な可能性は見えましたが、それも堅牢とは言えない段階です。

つまり、いま立っている土俵は――

単一市場 × 価格方向 × 執行条件依存

という構造です。

そしてこの土俵は、想像以上に難易度が高い。

だからこそ、次は土俵そのものを変えます。

次に向かうのは「価格差」です。

価格差系とは、価格の方向を当てるのではなく、

  • 同一銘柄の市場間差
  • 現物と先物の乖離
  • 国内市場と海外市場のズレ
  • 更新タイミングの差

といった、価格の相対関係を利用する戦略です。

ここでは、「上がるか下がるか」を予測する必要はありません。
見るべきなのは、「ズレているかどうか」です。

もしズレが存在し、かつ執行可能であれば、
それは方向当てよりも構造的なエッジになりやすい。

すでに、PRODUCT_CODE別に collector を並列起動できる基盤は整えました。
単一市場のデータ収集から、複数市場同時観測へと視点を広げています。

これは戦略変更というよりも、観測軸の変更です。

方向を当てる世界から、
構造の歪みを観測する世界へ。

今回の一連の否定は、無駄ではありませんでした。
むしろ、「どの土俵が厳しいのか」を知るために必要なプロセスでした。

次は、価格そのものではなく、価格の関係性を見ます。

ここからは、新しいゲームです。


8. 心理面の整理

正直に言えば、ここ数日は仮説の棄却が続いていました。

continuationを否定し、exhaustionを否定し、時間軸を変えても否定。
makerで符号が変わったときは一瞬希望が見えましたが、fill劣化やqueue近似を入れると、また慎重にならざるを得ませんでした。

こういうとき、人は簡単に言い訳を作れます。

「データが少ないだけかもしれない」
「執行モデルがまだ甘い」
「市場環境が悪いだけかもしれない」

どれも一理あります。
しかし、それに寄りかかると判断が鈍ります。

今回、自分の中で意識していたのは、

仮説を守らないこと

でした。

数字が一瞬でも良く見えたときほど、
その前提を疑う。
より厳しい条件を入れてみる。
それでも残るかを確認する。

+3bpsという数字は魅力的でした。
しかし、その前提が崩れれば消える可能性もある。
その事実から目を逸らさないようにしました。

同時に、完全否定もしません。

makerが幻想だったわけではありません。
構造的な余地が見えたのも事実です。

だからこそ、「主線から外すが、捨てない」という判断になりました。

白か黒かではなく、
「いまはまだ灰色」という整理です。

今日の一番の収穫は、戦略ではなく姿勢かもしれません。

  • 良い数字に飛びつかない
  • 悪い数字から逃げない
  • そして、疲れたら止まる

検証は続けられます。
でも、冷静さを失えば意味がありません。

今日はここで止めます。

焦らず、無理せず、
次の土俵でまた検証を始めます。

それで十分です。

-Bot, CEX, 開発ログ