BinaryBlogBUILD

BUILD · M / W / F

Quant Labシリーズ * フラッシュクラッシュ・ラボ 2

Editorial image for Quant Labシリーズ * フラッシュクラッシュ・ラボ 2

再び戻る価値のある、ひとつの考え。

プールの中

2026年3月10日、私はひどい決断をした。本番環境を動かしたのだ。

もっとも、その時は少しもひどいとは思わなかった。むしろ壮観だった。窓の外では、香港のスカイラインがいつもの容赦ないエネルギーでうなり、室内では、iMacの静かな光が、私がほとんど無からつくり上げたものを照らしていた。12日前、私の手元にあったのは空のフォルダ、20年間錆びつかせていたソフトウェアの勘、古いトレーダーとしての市場構造への本能、そしてCodexというAIコーディング・エージェントだけだった。それが今では、どう考えても無理だったはずの量的取引ラボとして動いていた。

画面の向こうには、7年分のBitcoinのティックデータがあり、丹念に再生され、ストレステストを受けていた。最終リサーチでは97件のシミュレーション取引が並び、決定論的な戦略全体で累積79Rという驚くべき成績を示した。サンドボックスは、失敗した仮説の墓場であると同時に、生き残ったパラメータ、実行ログ、単体テスト、注釈入りチャート、そして次第に仰々しい名前を与えられたファイルの集積でもあった。私はこのシステムを親しみを込めて The Alligator(アリゲーター) と呼んだ。私が思いつく限りの統計試験、モンテカルロ・シミュレーション、常識的な点検をすべて通過していた。だから当然、実際のお金を使って狩りをさせる時だと考えた。

郊外のプールで精巧なヨットをつくる愛好家も、おそらくまったく同じ論理で行動する。サンドボックスには水があった。船は浮いた。いったい何が起きるというのだろう。

本番版は、たしかに堂々としていた。端末で動く単なるスクリプトではなく、ひとつの生態系だった。スケジューラ、バックグラウンドのウォッチドッグ、インフラのハートビート、構造化ログのパイプライン、取引所への直接接続、ローカルのポジション照合、そして損切り・利確管理を含む自動リスク設定まで備えていた。TelegramのコックピットにはTOTPで保護された多要素認証があり、スマートフォンからこの自律型暗号資産プレデターの状態を確認し、武装し、あるいはkill-switchを作動させることができた。

/status と打てば、生き物が呼吸しているかを尋ねられる。/kill を送れば新規エントリーを即座に止められ、/unkill で再び板をうろつく許可を与えられる。私はこの機能を不釣り合いなほど面白がった。本格的なソフトウェア開発から離れて20年。セントラルの街を歩く私のポケットには、アルゴリズムで動く爬虫類のリモコンが入っていた。若い頃のコンピュータサイエンス専攻の私は、きっと夢中になっただろう。今の経営者としての私は、本来ならかなり心配すべきだった。

最初は何も劇的なことが起きなかった。そして、それがいちばんつらかった。アリゲーターは、設計どおり忍耐強いハンターだった。ノイズで売買せず、毎時間のように契約を回転させることもない。システム全体の弱さ、レバレッジの混雑、構造的な消耗、そして明確なブレイクダウンという厳密な条件を待つ。数日間、ぴくりとも動かないこともあった。

こうして私の実運用の量的取引への入門は、アドレナリンが噴き出すような展開ではなく、システムログを見続ける催眠的な単調さになった。

グリーン。

グリーン。

グリーン。

まだグリーン。

シグナルなし。ポジションなし。事件なし。私は約2週間かけて複雑な機械をつくったが、その最も優れた運用能力は、意図的に何もしないことらしかった。デジタルな自制心の勝利だった。

深夜に働く小さな会社

そして当然のように、現実が割り込んだ。ある午後、入力データストリームの重要な一部が音もなく止まった。建玉データが更新されなくなったのだ。戦略は建玉に大きく依存していた。レバレッジの混雑は、必須の合流条件のひとつだった。新鮮な建玉データがなければ、アリゲーターは価格変動と資金調達率を処理できても、嗅覚を失ったも同然だった。

メインプロセスは動いていた。シグナルエンジンも稼働中。バックグラウンドのスケジューラは完全な健康状態を報告していた。それでも、判断を支える中心的な入力のひとつは静かに凍っていた。本番環境は、巧妙で厄介なソフトウェア障害を教えてくれた。目に見えるクラッシュはなく、例外も投げられず、派手な赤い警告が画面を埋めることもない。機械が、ただ少しずつ真実でなくなっていく。

私たちは配管の奥へ潜り、エンドポイント、キャッシュ層、データ鮮度のタイムスタンプ、ネットワーク遅延を調べた。一時は地域VPNが最有力容疑者になった。iMacは香港にあり、実行サーバは別の地域を経由し、IPアドレスがひそかに変わり、第三者のデータ提供者はキャッシュ済みの応答を以前とは違う形で返し始めていた。私はネットワークトレースを見ながら首を振った。Bitcoinのマクロな市場連鎖を研究するはずだったのに、なぜ午後を使って国際ネットワーク・トポロジーをデバッグしているのだろう。

アリゲーターは、私の実存的な疑問など気にしない。ただ新鮮な建玉の数字を欲しがっていた。私たちはパイプラインを直し、データの完全性を回復させ、数字がまた動き始めるのを見た。生き物は再び呼吸し、私は少しだけ世間知らずではなくなった。

次に、実行スケジューラが不規則な挙動を見せ始めた。サンドボックスの研究スクリプトは従順だ。起動すれば順番どおりに処理し、きれいに終了する。ところが本番ソフトウェアには複雑な社会生活がある。時刻に合わせて自分で目を覚まし、外国のAPIと会話し、永続状態をローカルデータベースへ書き、外部プロセスをポーリングし、動的な再起動を処理し、微妙なデジタル痕跡を残す。午前3時、隣のバックグラウンドプロセスが少し息をついただけなのに、死んだと判断することもある。

対策としてスケジューラを導入した。次に、スケジューラを監視するウォッチドッグをつくった。するとウォッチドッグには、停止したスケジューラと静かなスケジューラを見分ける専用ハートビートが必要だと分かった。さらに、熱心すぎるウォッチドッグは監視対象より危険なので、ハートビートの閾値調整に何時間も費やした。

ある時、私は小さなデジタル官僚組織をつくってしまったことに気づいた。スケジューラが仕事をし、ウォッチドッグがスケジューラを監督し、ハートビートがスケジューラの勤務を証明し、Telegramが上層部に状況を報告する。そして上層部とは、暗闇の中でiPhoneを見つめながら横になっている私だった。高頻度取引デスクというより、神経質なマイクロサービスだけを雇った深夜営業の小会社を経営している気分だった。

それでも、この時点まで私の資本には一切触れていなかった。

5月18日

5月18日までは。

その午後、アリゲーターはついに匂いを捉えた。CSVから再生した過去でも、サンドボックスの試運転でもない。値動きの激しいBitcoin市場で生まれた、本物の本番シグナルだった。何週間もの静かな監視を経て、複数の条件が完全にそろった。レジーム確認、構造的な脆弱性、価格トリガー。大きな顎が開いた。

その瞬間だった。初めての完全自律エントリー。

注文は即座に拒否された。

私は信じられずにコンソールを見た。アリゲーターは2か月かけて夕食の準備をしたのに、ごちそうを前にしてフォークを口に入れられなかった。システムが自分自身の取引を止めたのだ。

最初に疑ったのは、よくある技術的な摩擦だった。API権限の不備、エンドポイントのタイムアウト、契約形式の誤り、あるいは tdMode のような不可解な名前の取引所パラメータが足りないのかもしれない。Codexと私はすぐに取引所の生ログへ入り、リクエストのペイロードを一行ずつ追った。

そこで数学的な現実が姿を現した。戦略のリスクエンジンは、1回の取引で固定額、およそ5,000ドルをリスクにさらす設定だった。紙の上ではまったく妥当に見える。しかし研究から本番へ急いで移る中で、私は リスク予算名目ポジションサイズ が根本的に別物だという点を見落としていた。

その相場の形状では、初期ストップを非常に近くへ置く必要があった。ストップ幅が狭いほど、ストップにかかった時の損失を固定額にするには、原資産のポジションを巨大にしなければならない。狭いストップと固定ドルリスクを組み合わせると、名目レバレッジは途方もない大きさになる。

私は計算された注文サイズを見て、取引所の最大レバレッジを見て、もう一度ボットを見た。アルゴリズムは、控えめな5,000ドルのリスク予算には、小さなヘッジファンド並みのバランスシートがふさわしいと判断していた。

幸い、誰かがまさにこの事態を予想していた。目先の取引意欲にとって不幸だったのは、その誰かが私自身だったことだ。数週間前、自衛本能に突き動かされた私は、実行層へ譲れない安全パラメータをハードコードしていた。システムは 取引所の最大ポジション上限の70パーセント を超えて使ってはならない。

注文が失敗したのは、プラットフォームが壊れていたからではない。安全ガバナーが設計どおりに働いたからだ。過去のRobinが現れ、現在のRobinを、現在のRobin自身が放った無制御の量的戦略から守った。おかしくもあり、悔しくもある発見だった。

私たちは安全余白をそのまま残した。切羽詰まった上書きも、レバレッジ設定の引き上げも、慌ただしい構成変更も行わなかった。取引の窓は閉じ、市場は先へ進み、アリゲーターは空腹のままだった。

自分自身と食い違うポジション

数日後、市場は別の機会をくれた。今回は計算されたポジションサイズがすべてのリスク条件に余裕を持って収まり、注文は抵抗なく板へ届いた。初めて、私たちは生きた実ポジションを持った。実在する取引所、実在するBitcoin無期限スワップ、実際の資本、有効な損切り、そして設定済みの利確目標。

私は職業的な満足と深い疑念を半分ずつ抱えながら画面を見た。機械はついに、理論モデルと経済的現実を隔てる境界を越えた。何か月もの間、すべての取引は過去チャートと模擬約定からなる無菌で摩擦のない環境に住んでいた。今やひとつのポジションが野外に存在し、現実世界にさらされている。

注文パラメータが落ち着いたことを確認し、私は眠った。

翌朝、ダッシュボードを開いてポジションを確認すると、すぐに背筋が冷えた。何かがおかしい。ローカルデータベースはある状態を示し、取引所はまったく別の状態を報告していた。自律型取引スクリプトが、現在の保有ポジションを実は把握していないかもしれないと気づくほど、鮮烈に目が覚める経験はめったにない。

私はOKXの取引画面を直接開き、ボットの生ログを出し、Telegramのイベントストリームと照らし合わせ、タイムスタンプを一つずつ確認した。取引所には物理的なポジションが確かに存在していた。しかしローカルの会計モジュールは、想定外の実行状態にすっかり混乱していた。

私は手動で介入した。開いたレッグを閉じ、孤立した保護注文を取り消し、リモートkillコマンドで新規エントリーを止めた。それからCodexと私は、いつの間にか朝の定例になりつつあったデジタル・フォレンジックに入った。ボットは何が起きたと思っていたのか。取引所は何を実行したのか。状態のずれはいつ始まったのか。ローカルディスクには何が書かれ、板では実際に何が約定したのか。

戦略の理論的な美しさは、もう関係なかった。重要なのは、二つの独立したコンピュータシステムが「私が今何を持っているか」について完全な合意を保てるかどうかだけだった。

私たちは状態照合モジュールを一からつくり直し、すべての取引後に同期チェックを強制した。それでも本番環境の授業は終わらない。ほどなく、さらに微妙な構造上の摩擦を見せてきた。

アリゲーターは、ひとつのトレンドの中で複数の論理エントリーを生成できる。バックテストでは、それらを完全に別々の取引として扱った。Trade Aには独自のエントリー価格と保護ストップがあり、Trade Bにも別のロジック、リスク特性、退出トリガーがある。バックテスターは個別に追跡し、取引日誌も別々に記録する。概念上は異なる存在だった。

しかし取引所は、もっと単純な現実で動いていた。口座はネットポジション・モードだった。取引所から見れば、同じ契約で連続する二つのショート注文は、二つの別々の哲学的出来事ではない。サイズを合算し、平均エントリー価格を一本にした、ひとつのショートポジションにすぎない。

私たちは優雅な内部オントロジーを設計した。取引所は初歩的な算数で動いていた。

画面を見ながら、私はこう思った。いや、これはまったく別の二つの取引アイデアだ。

取引所APIはこう答えたようだった。それはかわいらしい。今は一つだ。

私たちはまた適応し、複数の戦略レベルの論理ポジションを、取引所レベルの単一ポジションへ継続的に対応づけるよう実行設計を改めた。ローカル状態は三つの独立した取引概念を持てる。取引所は一つのネットポジションを持つ。そして二つの表現は、常に照合され続けなければならない。

日が週へ変わるにつれ、本番環境はサンドボックスで当然と思っていた前提を一つずつ壊した。ストップ注文がローカルメモリには存在しても、レート制限で取引所に登録されないことがある。ポジションが約定しても、保護注文の確認が追いつかないことがある。わずかに遅れたデータ点で有効なシグナルが計算されることがある。ウォッチドッグが一時的なネットワークの沈黙を障害と誤認することもある。数学的には正しい注文でも、契約サイズ、証拠金モード、刻み幅の丸め規則はバックテストの美しさなど気にせず拒否する。

現実は一層ずつシステムに入り込んだ。複雑な数学パラメータを持ち込むのではなく、運用の厳密さを要求することで。私たちはAPIの事前点検、明示的な注文読み戻し、フェイルクローズの安全処理、防御的なエラー対応、細かなヘルス状態、不変イベント台帳を加えた。紙の上では以前ほど優雅ではなくなったが、実務では比べものにならないほど強くなった。私は刺激的な機能を探すのをやめ、静かで退屈な状態ログに心から安堵するようになった。グリーンは世界でいちばん美しい色になった。

T008はテーブルを噛んでいた

仕組みが機械として健全になる一方で、別の気づきが現れた。ソフトウェアではなく、取引そのものについてだ。

アリゲーターは一つのキャンペーンを始める。最初のエントリーは鋭く、ブレイクダウンの転換点を正確に捉えることが多い。しかし価格がさらに下がると、次のシグナルが発火し、ポジションが積み上がる。バックテストはこの方法を支持し、二次エントリーも過去には正の期待値を追加していた。数学的には筋が通っていた。

けれど実際に目の前で起きる様子は、視覚的にも直感的にも、次第に無謀に見えてきた。

あるキャンペーンが問題をはっきり見せた。最初のショートは大きくきれいな下方拡張を捉えた、教科書のような取引だった。二つ目のショートはさらに下で入り、三つ目のシグナルはもっと下で発火した。四つ目のショート注文が値動きのほぼ底で提出された頃には、計算された統計的優位というより、市場を体系的に狩ることと、無分別に追いかけることの違いを忘れたアルゴリズムに見えた。

私は実行チャートを開き、T005T006T007T008 と並ぶマーカーを見つめた。

メモ帳を取り、四行書いた。

T005は、噛みついた。

T006は、噛み砕いた。

T007は、パンくずを追った。

T008は、テーブルを噛んでいた。

おかしな表現だったので、そのまま残った。しかし教訓は深刻だった。最初のエントリーは本物の市場構造の変化を捉え、最後のエントリーはすでに使い切ったモメンタムへ反応しただけだった。アルゴリズムは有効なシグナルを、それぞれ独立した機会として扱う。私の目には、主な拡張をすでに終えたひと続きのキャンペーンと、食卓からどうしても離れようとしない動物が見えていた。

外洋へ

晩春までに、アリゲーターはすっかり姿を変えた。最初は清潔な研究フォルダの中の、整った方程式の集合だった。それが今では、本番運用で得た傷跡を全身に刻んでいた。

データパイプラインは古くなり、地域VPNは地理の調査を要求し、スケジューラにはウォッチドッグが必要になり、ウォッチドッグにはハートビートが必要になった。私の電話にはリモートkill-switchが入り、取引所は最初の注文を拒否した。70パーセントの安全ルールは、私たち自身のレバレッジ計算から静かに救ってくれた。実ポジションは状態同期のバグを露呈し、取引所は精緻な取引アイデアを単純なネットポジションの算数へ押しつぶした。

7年間のバックテストは、そのどれにも備えてくれなかった。バックテストは安全な過去に生きる。本番環境は完全に現在に生き、あらゆる判断が即座に結果を持つ。

深夜、別のBitcoinチャートが暗い部屋で光っていた。システムは背景で静かに動き、ハートビートを送り、APIをポーリングし、次の構造変化を待っていた。アリゲーターはついにプールから外洋へ出た。そしてこのプロジェクトが始まって以来初めて、最大のエンジニアリング課題は、もう機械に噛みつく時を教えることではないと分かった。

本当の課題は、食べるのをやめる時を教えることだった。